在我的基于事件的数据库上运行的查询目前会扫描所有行,即使某个事件被过滤了,这也会导致很长的扫描时间。Event_type是我经常在过滤器中使用的东西,这就是为什么我认为它可能是一个很好的集群。该表已经由date_id和app_title组成集群。我使用SYSTEM$CLUSTERING_INFORMATION查看额外的event_type列上的集群是否会导致useful.The结果不好。这是否意味着这将是一个糟糕的选择?或者这仅仅意味着当前的表在这个键上聚集得很差?用这三个集群键创建一个表会导致不同的结果吗?
(我在下面的查询/结果中更改了一些名称和值)
select system$clustering_information('materialized_view', '(date_id, app_title, event_type)');
{
"cluster_by_keys" : "LINEAR(date_id, app_title, event_type)",
"total_partition_count" : <more than 100k>,
"total_constant_partition_count" : 0,
"average_overlaps" : ~500
"average_depth" : ~500,
"partition_depth_histogram" : {
"00000" : 0,
"00001" : 0,
"00002" : 0,
"00003" : 0,
"00004" : 0,
"00005" : 0,
"00006" : 0,
"00007" : 0,
"00008" : 0,
"00009" : 0,
"00010" : 0,
"00011" : 0,
"00012" : 0,
"00013" : 0,
"00014" : 0,
"00015" : 0,
"00016" : 0,
"00064" : 30,
"00128" : 3218,
"00256" : 22146,
"00512" : 94367,
"01024" : 134114
}
}发布于 2021-03-10 04:20:02
这显示了集群的当前状态,这不是很好。这意味着按照您定义的方式创建一个集群键可能会有所帮助。
聚集键中列(或表达式)的顺序非常重要。你想从较低的基数到更高的基数。例如,如果您只有五个事件类型,那么它可能应该是列列表中的第一个。
在没有上下文的情况下,APP_TITLE列更有趣。如果它的基数很高(该列的名称似乎表明了这一点),则可以使用诸如left(APP_TITLE, 2)之类的表达式来限制基数。
请记住,如果需要在基数非常高的列或唯一列上设置键,请使用表达式减少基数。您可以通过如下方式查看Snowflake在集群key中支持哪些函数:
show functions;
-- Look at the "valid_for_clustering" column to see which are allowed.https://stackoverflow.com/questions/66553263
复制相似问题