什么是最好的分区表大小(行数)以获得真正的受益?

9

如果我们有一张有400万行的表。

该表有一个STATUS字段,可以取以下值:TO_WORKBLOCKEDWORKED_CORRECTLY

你会根据一个只会改变一次的字段进行分区吗(大多数情况下是从to_work到worked_correctly)?你会创建多少个分区?

2个回答

19

在一个分区中的绝对行数并不是最有用的度量标准。你真正想要的是一个随着表格增长而稳定的列,并且能够实现分区的潜在好处,包括可用性、表空间管理和性能。

例如,你的示例列有三个值。这意味着你可以有三个分区,也就是说你可以有三个表空间。因此,如果一个表空间损坏了,你将失去三分之一的数据。分区使你的表更加可用吗?实际上并没有。

增加或删除分区可以更容易地管理大量数据。但是你是否可能会删除所有状态为WORKED_CORRECTLY的行?这很不可能。分区使你的表更易于管理吗?实际上并没有。

分区的性能好处来自于查询裁剪,其中优化器可以立即忽略表的一部分。现在每个分区有130万行。因此,即使你查询STATUS='WORKED_CORRECTLY',你仍然有大量的记录需要筛选。而且很有可能,任何不涉及STATUS的查询都会比对未分区的表的性能差。分区使你的表的性能更好吗?可能不是。

到目前为止,我一直假设你的分区是均匀分布的。但是你最后一个问题表明这不是这种情况。大多数行,如果不是所有行,都将以WORKED_CORRECTLY结束。因此,与其他分区相比,该分区将变得异常巨大,并且从分区中获得好处的可能性甚至更加渺茫。

最后,你提出的方案不具有弹性。当前每个分区将有130万行。当你的表格增长到总共四千万行时,每个分区将包含1330万行。这很糟糕。

那么,什么样的分区键才是好的候选项呢?一个能产生大量分区的键、分区大小大致相等的键、键值不太可能改变的键、键在底层对象生命周期中具有某种意义的键以及在表中运行的大多数查询中有用的键。

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


1
这个答案对我来说非常有用,谢谢。 - Jamshaid K.

7

表中的行数通常不是用来确定是否以及如何分区表的好指标。

您试图解决什么问题?您想提高查询性能吗?数据加载性能?清除数据的性能?

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


是的,我想提高查询性能。 该表每天大约有5,000个插入。我只对在提高大规模错误提取(这种查询与字段状态和类型有关)的同时不降低性能感兴趣。 它每天被多次读取,总是通过状态搜索(必须处理具有某个状态的每个记录,然后更新状态。99%的时间它到达最终状态。其他时间,出现错误,我们必须了解如何解决它)。 我想增强大量行查找的性能。 - Revious

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接