雪花:2个相关列具有非常不同的聚类信息(一个具有完美性,另一个具有可怕性)

问题描述 投票:0回答:1

我们有一个包含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过滤器进行查询会导致扫描所有分区。

注意:在雪花论坛https://support.snowflake.net/s/question/0D50Z00008vfglCSAQ/2-correlated-columns-have-very-different-clustering-information-one-has-perfect-the-other-has-terrible上也问了这个问题

clustered-index snowflake-datawarehouse
1个回答
1
投票

在Snowflake的聚类报告功能(如上面发布的功能)中,存在一个限制,即只考虑varchar的前6个字符来评估聚类深度。因此,我不相信为record_id报告的优秀结果,因为前6个字符可能因前缀相同,即使后续的account_id是随机的。

最好的解决方案是在account_id上显式声明群集并激活表上的自动群集。

© www.soinside.com 2019 - 2024. All rights reserved.