如果我编写一条包含CTE的SQL语句,查询优化器是否总是将这些CTE作为离散语句单独优化,或者,如果计算得到的SQL执行速度更快,它是否可以将这些CTE与整个SQL的其他部分合并?
这个问题是由另一个用户提出的问题触发的。他们在CTE中使用序列生成器;当CTE SQL独立运行时,它总是生成12个连续的数字,正如预期的那样。然而,当在CTE中作为更大的SQL语句的一部分运行时,它会丢失数字,即它不会生成连续的值。
这是一个大型数据集的已知问题/行为,但由于只有12个值,这不应该是一个问题-但事实是,CTE并没有像写的那样运行,12条记录的结果集然后连接到其他表,而查询优化器重写了整个查询,并将CTE逻辑与SQL语句的其他部分合并,因此产生了一个更大的数据集。
发布于 2021-01-18 21:50:45
Snowflake没有提供很多关于它如何优化查询的解释。
我可以说,一般来说,有两种方式来处理CTE:
实际上,我希望Snowflake两者都能做到,选择更好的执行计划,因为它是一个现代数据库,已经从几十年的优化经验中学到了东西。在某些情况下,这两种方法都可能更好。
话虽如此,如果代码返回的数据按照您的描述进行了更改,那么就存在一个bug。优化的要点不是改变代码的语义(意思)。重点是返回相同的结果,但使用不同的底层算法。
https://stackoverflow.com/questions/65775586
复制相似问题