我有一个复杂的查询需要在随后的查询中使用(实际上是更新语句)。我尝试过使用公用表表达式(CTE)和临时表(Temp table)。但是,使用CTE的性能非常差,而使用临时表的方法则非常快,大约需要15秒以及毫秒级别的时间。为了简化测试,我不是在随后的查询中连接CTE/Temp表,而是从中选择*。 在这种情况下,它们的执行效果相同。
我查看了两种方法的执行计划,一种是在随后的查询中包含连接,另一种是仅选择*。在仅选择*时,查询计划大致相同,但在随后查询中包含连接时,查询计划不同。具体来说,创建和填充临时表的查询计划部分保持不变,而将CTE用于带有连接的查询时,创建和填充CTE的查询计划部分发生了巨大变化。
我的问题是:为什么CTE的创建和填充查询计划会因其随后的使用方式而改变,而临时表则不会?此外,在哪些场景下,CTE会比临时表产生更好的性能?
*注意:我还使用过表变量,它与临时表的方法相比较。
谢谢