测试描述
测试的目的是了解CBO如何使用集群特性,通过使用聚集键的查询来运行订单。
假设与预条件
据雪花医生说:
https://docs.snowflake.com/en/user-guide/tables-clustering-keys.html
“当查询在表的群集键上筛选或排序时,查询受益于群集。排序通常用于按操作排序、按操作分组排序和对某些联接排序。“
按照它,如果在集群键上执行ORDER子句,优化器将以某种方式使用它来提高查询性能。
测试数据
用于此测试的数据是来自雪花sample_data (共享)的订单表。
“SAMPLE_DATA”,“TPCH_SF1000”,“ORDERS”
要执行的步骤
创建像“SAMPLE_DATA”、“TPCH_SF1000”、“ORDERS”这样的表订单;插入订单选择*从“SAMPLE_DATA”。“TPCH_SF1000”。“ORDERS”;
更改表顺序,删除聚类键;
ALTER添加列ORDERS_NEW编号(10,0);更新命令集ORDERS_NEW =TO_NUMBER(TO_VARCHAR(O_ORDERDATE),‘-’);
通过(ORDERS_NEW)更改表订单集群;更改表订单恢复RECLUSTER;
由ORDERS_NEW解释SELECT * FROM订单;
预期结果
因为在使用表上的聚类键后,它应该是预先排序的,因此期望它不需要在执行时排序。
即使排序与执行计划一致,它也应该使用集群特性,正如文档中以某种方式定义的那样,以提高查询性能。
实际结果
逻辑执行计划使用群集表上的排序操作,这使得ORDER子句的群集特性变得冗余。
结论与讨论--
与预期结果和实际结果相比,它不能满足雪花所规定的功能。
通过这个,我将讨论为什么雪花不使用集群键?在什么情况下会这样做呢?
发布于 2022-09-21 13:48:48
为什么雪花不使用群集键?
在什么情况下会这样做呢?
发布于 2022-09-21 14:17:12
因为在使用表上的聚类键之后,它应该被预先排序.
整理与分类不一样。插入排序行是强制重新聚类的一种方法,但两者并不相同。
...the的期望是它不需要在执行时排序。
雪花不以这种方式在内部存储表的数据。如果通过应用于查询运行带有订单的查询,则结果集缓存中的结果将按排序顺序存储。然而,由微分区支持的表并不是这样存储的。
...Why没有使用集群密钥吗?
雪花确实以多种不同的方式使用聚类键。最常见的方法是自动重新聚类服务在后台透明地运行,以重新集群微分区中的行。其目标是在每个微分区中有效地最小化聚类键的最小和最大值之间的差异。在本例中,它还使用DML中的排序进行应用。另外,对于一些DML操作,它将尝试在DML产生的行上保留集群。
目前,优化器不使用(或需要使用)群集键。相反,在微分区上压缩MIN/MAX范围将提高性能。优化器将把所有符合条件的过滤器推倒到表扫描中,以进行分区剪枝。聚合可以使这更有效,但是不管是否已经完成重新聚类,优化器都会这样做。
https://stackoverflow.com/questions/73801788
复制相似问题