我们有一个包含120M行(超过2222个微分区)的表,它有2个重要的列,record_id的格式为prefix|<account_id>|<uuid>
(唯一)和列account_id,其值为<account_id>
。请注意,所有记录的前缀都相同。然后当然是一些事实列,但这是不相关的。
Snowflake通过clustering_information函数显示record_id列的完美聚类(由SF自动选择,我们没有设置指定的聚类):
"total_partition_count" : 2222,
"total_constant_partition_count" : 2222,
"average_overlaps" : 24.0,
"average_depth" : 25.0,
但是,对于列account_id,群集非常糟糕
"total_constant_partition_count" : 0,
"average_overlaps" : 2221.0,
"average_depth" : 2222.0,
大约有130个不同的帐户ID,这意味着平均而言,一个account_id的记录应该超过17个分区。即使通过records_id对雪花簇进行聚类,该列的开头(prefix|<account_id>
)也与account_id列相关联。因此,具有相同account_id的记录应最终位于相同的分区中。因此,我无法弄清楚为什么account_id列的micropartition有100%重叠。就好像雪花对record_id列使用了一些奇怪的排序,因此在所有分区中分散了每个帐户的行。那可能吗?
这会对性能产生负面影响,因为使用account_id过滤器进行查询会导致扫描所有分区。
在Snowflake的聚类报告功能(如上面发布的功能)中,存在一个限制,即只考虑varchar的前6个字符来评估聚类深度。因此,我不相信为record_id报告的优秀结果,因为前6个字符可能因前缀相同,即使后续的account_id是随机的。
最好的解决方案是在account_id上显式声明群集并激活表上的自动群集。