【发布时间】:2021-03-26 15:49:17
【问题描述】:
我正在尝试了解是否可以减少在以下场景中扫描的分区数量。
我有两张桌子:
Table A (100M rows)
JOIN_KEY DATA_1 DATA_2 etc.
Table B (40K rows)
JOIN_KEY FILTER_COL_A FILTER_COL_B
当用户想要从表 A 中查询数据时,他们需要通过过滤 FILTER_COL_A & FILTER_COL_B 从表 B 中获取对应的 JOIN_KEY 值。
当对FILTER_COL_A 和FILTER_COL_B 进行过滤时,它将为JOIN_KEY 生成数量非常少的值 - 通常只有 3 个,但可能更多。
表 A 由 JOIN_KEY 聚类。
当我在 JOIN_KEY 上编写连接两个表的查询,然后在 FILTER_COL_A 和 FILTER_COL_B 上进行过滤时,会扫描表 A 上的所有分区,而不是 800 个分区中的大约 5 个分区。
我不能在运行时直接过滤 JOIN_KEY,在从表 B 返回数据之前,我不知道这应该是什么值。
有没有一种方法可以构造查询,以便 Snowflake 在连接过滤器中使用表 B 的结果并修剪表 A 的大部分分区?
【问题讨论】:
-
如果可以的话,Snowflake 分区会在连接时进行修剪。不能这样做的一个原因是,如果数据不是由表上的连接键聚集在一起,尤其是较大的连接键。您是否在连接键上运行了 SYSTEM$CLUSTERING_INFORMATION?如果您在直方图底部看到结果,则可能需要运行自动集群服务才能从此连接的修剪中受益。
-
自动集群在较大的表上启用,并通过连接键进行集群。 SYSTEM$CLUSTERING_INFORMATION 不超过 00007,平均深度为 3.0878。较小的表没有定义集群键。
标签: snowflake-cloud-data-platform