雪花查询优化器是否尊重 CTE?

时间:2021-01-18 13:36:55

标签: sql snowflake-cloud-data-platform common-table-expression

如果我编写一个包含 CTE 的 SQL 语句,查询优化器是否总是将这些 CTE 保留为离散语句以进行单独优化,还是可以将这些 CTE 与整个 SQL 的其他部分合并(如果它计算结果 SQL 会更快)执行?

此问题是由另一个用户提出的问题触发的。他们在 CTE 中使用序列生成器;当 CTE SQL 单独运行时,它总是产生 12 个连续的数字,正如预期的那样。然而,当在 CTE 中作为更大的 SQL 语句的一部分运行时,它缺少数字,即它没有产生连续的值。

这是大型数据集的一个已知问题/行为,但由于只有 12 个值,所以它不应该是一个问题 - 但事实表明 CTE 没有按写入的方式运行,有 12 个记录结果集然后连接到其他表,但查询优化器重新编写了整个查询,并将 CTE 逻辑与 SQL 语句的其他部分合并,因此生成了一个更大的数据集。

1 个答案:

答案 0 :(得分:1)

Snowflake 没有提供很多关于它如何优化查询的解释。

我可以说一般来说,有两种处理 CTE 的方法:

  • 物化 CTE,使其运行一次,然后读取物化版本。
  • 将 CTE 逻辑合并到查询的其余部分并作为查询的一部分进行优化。

我实际上希望 Snowflake 两者,选择更好的执行计划,因为它是从数十年的优化经验中学习的现代数据库。在某些情况下,这两种方法都可能更好。

综上所述,如果代码返回的数据如您所描述的那样发生变化,那么就存在错误。优化的重点不是改变代码的语义(含义)。关键是返回相同的结果,但使用不同的底层算法。