数据仓库 - 分区策略

  • 简述

    进行分区是为了提高性能并促进数据的轻松管理。分区还有助于平衡系统的各种要求。它通过将每个事实表划分为多个单独的分区来优化硬件性能并简化数据仓库的管理。在本章中,我们将讨论不同的分区策略。
  • 为什么需要分区?

    由于以下原因,分区很重要 -
    • 为了便于管理,
    • 为了协助备份/恢复,
    • 以提高性能。

    便于管理

    数据仓库中的事实表的大小可以增长到数百 GB。如此庞大的事实表很难作为单个实体进行管理。因此需要分区。

    协助备份/恢复

    如果我们不对事实表进行分区,那么我们必须加载包含所有数据的完整事实表。分区允许我们只加载定期需要的数据。它减少了加载时间,也提高了系统的性能。
    Note− 为了减少备份大小,可以将当前分区以外的所有分区标记为只读。然后我们可以将这些分区置于不可修改的状态。然后可以备份它们。这意味着只备份当前分区。

    提高性能

    通过将事实表划分为数据集,可以增强查询过程。查询性能得到增强,因为现在查询只扫描那些相关的分区。它不必扫描整个数据。
  • 水平分区

    有多种方法可以对事实表进行分区。在水平分区中,我们必须牢记对数据仓库可管理性的要求。

    按时间划分为相等的段

    在这种分区策略中,事实表是按照时间段进行分区的。这里每个时间段代表业务中的重要保留期。例如,如果用户查询month to date data那么将数据划分为月段是合适的。我们可以通过删除其中的数据来重用分区表。

    按时间划分成不同大小的段

    这种分区是在不经常访问老化数据的地方完成的。它被实现为一组用于相对当前数据的小分区,用于非活动数据的较大分区。
    按时间划分为不同大小的段

    注意事项

    • 详细信息仍然在线提供。
    • 物理表的数量保持相对较少,从而降低了运营成本。
    • 这种技术适用于需要混合使用近期历史数据和挖掘整个历史数据的情况。
    • 这种技术在分区配置文件定期更改的情况下没有用,因为重新分区会增加数据仓库的操作成本。

    不同维度的分区

    事实表也可以根据时间以外的维度进行分区,例如产品组、地区、供应商或任何其他维度。让我们举个例子。
    假设一个市场功能被划分为不同的区域部门,就像在一个 state by state基础。如果每个区域都想查询在其区域内捕获的信息,事实证明将事实表划分为区域分区会更有效。这将导致查询速度加快,因为它不需要扫描不相关的信息。

    注意事项

    • 查询不必扫描不相关的数据,从而加快了查询过程。
    • 如果尺寸将来不太可能改变,则此技术不适用。因此,值得确定维度在未来不会改变。
    • 如果维度发生变化,则必须对整个事实表进行重新分区。
    Note− 我们建议仅在时间维度的基础上进行分区,除非您确定建议的维度分组在数据仓库的生命周期内不会改变。

    按表大小分区

    当在任何维度上都没有明确的事实表分区依据时,我们应该partition the fact table on the basis of their size.我们可以将预定大小设置为临界点。当表超过预定大小时,将创建一个新的表分区。

    注意事项

    • 这种分区管理起来很复杂。
    • 它需要元数据来识别每个分区中存储的数据。

    分区维度

    如果一个维度包含大量条目,则需要对维度进行分区。在这里我们必须检查维度的大小。
    考虑一个随时间变化的大型设计。如果我们需要存储所有变化以便进行比较,那么该维度可能会非常大。这肯定会影响响应时间。

    循环分区

    在循环技术中,当需要一个新的分区时,旧的分区被归档。它使用元数据允许用户访问工具引用正确的表分区。
    这种技术使得在数据仓库中自动化表管理设施变得容易。
  • 垂直分区

    垂直分区,垂直分割数据。下图描述了垂直分区是如何完成的。
    垂直分区
    垂直分区可以通过以下两种方式执行 -
    • 正常化
    • 行拆分

    正常化

    规范化是数据库组织的标准关系方法。在这种方法中,行被折叠成一行,因此减少了空间。查看下表,这些表显示了如何执行规范化。
    归一化前的表
    Product_id Qty Value sales_date Store_id Store_name Location Region
    30 5 3.67 3-Aug-13 16 sunny Bangalore S
    35 4 5.33 3-Sep-13 16 sunny Bangalore S
    40 5 2.50 3-Sep-13 64 san Mumbai W
    45 7 5.66 3-Sep-13 16 sunny Bangalore S
    归一化后的表
    Store_id Store_name Location Region
    16 sunny Bangalore W
    64 san Mumbai S
    Product_id Quantity Value sales_date Store_id
    30 5 3.67 3-Aug-13 16
    35 4 5.33 3-Sep-13 16
    40 5 2.50 3-Sep-13 64
    45 7 5.66 3-Sep-13 16

    行拆分

    行拆分倾向于在分区之间留下一对一的映射。行拆分的动机是通过减小其大小来加快对大表的访问。
    Note− 使用垂直分区时,确保不需要在两个分区之间执行主要的连接操作。
  • 识别分区键

    选择正确的分区键非常关键。选择错误的分区键将导致重新组织事实表。让我们举个例子。假设我们要对下表进行分区。
    
    Account_Txn_Table
    transaction_id
    account_id
    transaction_type
    value
    transaction_date
    region
    branch_name
    
    我们可以选择在任何键上进行分区。两个可能的键可能是
    • 地区
    • 交易日期
    假设企业分布在 30 个地理区域,每个区域有不同数量的分支机构。这将为我们提供 30 个分区,这是合理的。这种分区已经足够好了,因为我们的需求捕获表明,绝大多数查询仅限于用户自己的业务区域。
    如果我们按 transaction_date 而不是区域进行分区,那么来自每个区域的最新交易将在一个分区中。现在,用户想要查看自己区域内的数据,必须跨多个分区进行查询。
    因此,值得确定正确的分区键。