雪花查询优化器尊重cte吗?



如果我编写一个包含cte的SQL语句,查询优化器是否总是将这些cte保留为单独优化的离散语句,或者如果它计算得到的SQL将更快地执行,它是否可以将这些cte与整体SQL的其他部分合并?

这个问题是由另一个用户问的问题触发的。他们在CTE中使用序列发生器;当单独运行CTE SQL时,它总是像预期的那样产生12个连续的数字。然而,当在CTE中作为更大的SQL语句的一部分运行时,它会丢失数字,即它不会产生连续的值。

这是一个已知的问题/与大型数据集的行为,但它不应该只有12个值是一个问题,但这一事实表明,CTE是不像写运行,与12 resultset然后加入到其他表记录,而是查询优化器已经重写整个查询和合并CTE逻辑与SQL语句的其他部分,所以prodcuing更大的数据集。

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

我可以说,一般来说,有两种处理cte的方法:
  • 将CTE物化,使其运行一次,然后读取物化的版本。
  • 将CTE逻辑合并到查询的其余部分并作为查询的一部分进行优化。

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

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

最新更新