如果我们有一张有400万行的表。
该表有一个STATUS
字段,可以取以下值:TO_WORK
,BLOCKED
或WORKED_CORRECTLY
。
你会根据一个只会改变一次的字段进行分区吗(大多数情况下是从to_work到worked_correctly)?你会创建多少个分区?
如果我们有一张有400万行的表。
该表有一个STATUS
字段,可以取以下值:TO_WORK
,BLOCKED
或WORKED_CORRECTLY
。
你会根据一个只会改变一次的字段进行分区吗(大多数情况下是从to_work到worked_correctly)?你会创建多少个分区?
在一个分区中的绝对行数并不是最有用的度量标准。你真正想要的是一个随着表格增长而稳定的列,并且能够实现分区的潜在好处,包括可用性、表空间管理和性能。
例如,你的示例列有三个值。这意味着你可以有三个分区,也就是说你可以有三个表空间。因此,如果一个表空间损坏了,你将失去三分之一的数据。分区使你的表更加可用吗?实际上并没有。
增加或删除分区可以更容易地管理大量数据。但是你是否可能会删除所有状态为WORKED_CORRECTLY
的行?这很不可能。分区使你的表更易于管理吗?实际上并没有。
分区的性能好处来自于查询裁剪,其中优化器可以立即忽略表的一部分。现在每个分区有130万行。因此,即使你查询STATUS='WORKED_CORRECTLY'
,你仍然有大量的记录需要筛选。而且很有可能,任何不涉及STATUS的查询都会比对未分区的表的性能差。分区使你的表的性能更好吗?可能不是。
到目前为止,我一直假设你的分区是均匀分布的。但是你最后一个问题表明这不是这种情况。大多数行,如果不是所有行,都将以WORKED_CORRECTLY
结束。因此,与其他分区相比,该分区将变得异常巨大,并且从分区中获得好处的可能性甚至更加渺茫。
最后,你提出的方案不具有弹性。当前每个分区将有130万行。当你的表格增长到总共四千万行时,每个分区将包含1330万行。这很糟糕。
那么,什么样的分区键才是好的候选项呢?一个能产生大量分区的键、分区大小大致相等的键、键值不太可能改变的键、键在底层对象生命周期中具有某种意义的键以及在表中运行的大多数查询中有用的键。
这就是为什么像DATE_CREATED这样的东西在数据仓库事实表分区中如此受欢迎。它在一定范围内(通常选择天、月或年)产生了合理数量的分区。在给定的时间跨度内我们会得到大致相同数量的记录被创建。数据加载和归档通常是根据年龄(即创建日期)进行的。BI查询几乎总是包括时间维度。
表中的行数通常不是用来确定是否以及如何分区表的好指标。
您试图解决什么问题?您想提高查询性能吗?数据加载性能?清除数据的性能?
假设您正在尝试提高查询性能?所有查询都有STATUS
列的谓词吗?它们是在查找单个行吗?还是您希望查询扫描整个分区?