【问题标题】:What is a good size (# of rows) to partition a table to really benefit?对表进行分区以真正受益的合适大小(行数)是多少?
【发布时间】:2011-07-30 20:56:23
【问题描述】:

I.E.如果我们有一个有 400 万行的表。

它有一个STATUS 字段,可以采用以下值:TO_WORKBLOCKEDWORKED_CORRECTLY

您是否会在一个只会更改一次的字段上进行分区(大多数时候从 to_work 到 working_correctly)?你会创建多少个分区?

【问题讨论】:

    标签: sql oracle partitioning database-partitioning


    【解决方案1】:

    分区中的绝对行数不是最有用的指标。你真正想要的是一个随着表的增长而稳定的列,它提供了分区的潜在好处。它们是:可用性、表空间管理和性能。

    例如,您的示例列具有三个值。这意味着您可以拥有三个分区,这意味着您可以拥有三个表空间。因此,如果表空间损坏,您将丢失三分之一的数据。分区是否使您的表更可用?不是真的。

    添加或删除分区可以更轻松地管理大量数据。但是您是否有可能删除状态为WORKED_CORRECTLY所有行?不大可能。分区是否使您的表更易于管理?并不真地。

    分区的性能优势来自查询修剪,优化器可以立即对表的块进行折扣。现在每个分区有 130 万行。因此,即使您查询STATUS='WORKED_CORRECTLY',您仍然有大量记录需要筛选。而且很有可能,任何不涉及 STATUS 的查询的性能都会比未分区表的性能差。分区是否让您的表更高效?应该不会吧。

    到目前为止,我一直假设您的分区是均匀分布的。但你的最后一个问题表明情况并非如此。大多数行 - 如果不是全部 - 行将在 WORKED_CORRECTLY 中结束。所以这个分区相比其他分区会变得巨大,而从分区中获益的机会就变得更加渺茫了。

    最后,您提出的方案没有弹性。作为当前卷,每个分区将有 130 万行。当您的表总共增长到 4000 万行时,每个分区将包含 1330 万行。这很糟糕。

    那么,什么是分区键的好候选?一种产生大量分区,一种是分区大小大致相等,一种是键的值不太可能改变,一种是值在底层对象的生命周期中具有某种意义,最后一种是在针对表运行的大量查询中很有用。

    这就是为什么像 DATE_CREATED 这样的东西在数据仓库中对事实表进行分区如此受欢迎的原因。它在一系列粒度(通常选择日、月或年)中生成合理数量的分区。我们在给定的时间跨度内创建的记录数量大致相同。数据加载和数据归档通常是根据年龄(即创建日期)完成的。 BI 查询几乎总是包含 TIME 维度。

    【讨论】:

    • 这个答案对我来说非常有用,谢谢。
    【解决方案2】:

    表中的行数通常不是用于确定是否以及如何对表进行分区的重要指标。

    你想解决什么问题?您是否正在尝试提高查询性能?数据加载的性能?清除数据的性能?

    假设您正在尝试提高查询性能?您的所有查询是否在 STATUS 列上都有谓词?他们是在做单行查找吗?或者您希望您的查询扫描整个分区?

    【讨论】:

    • 是的,我想提高查询性能。该表每天大约有 5.000 个插入。我只是想在改进大量错误提取的同时不降低这种性能(这种查询与字段 STATUS 和 TYPE 相关)。每天读很多次,总是按状态搜索(每条有一定状态的记录都要处理,然后更新状态。99%的时候到最终状态。其他时候,有错误,我们必须了解如何解决它)。我想提高大量行查找的性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 2016-06-29
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    相关资源
    最近更新 更多