我有一个复杂的查询,我需要在后续查询(实际上是更新语句)中使用.我尝试过使用CTE和临时表.使用CTE的性能与临时表方法相比是可怕的.它的东西像15秒vs毫秒.为了简化测试,而不是在后续查询中加入CTE / Temp表,我简单地从中选择*.在这种情况下,它们执行相同.
我已经看到执行计划的两种方法,在后续查询中的连接,然后只需选择*.用简单的选择查询计划大致相同,但是随后的连接选择查询计划不是.具体来说,用于创建和填充临时表的查询计划的一部分保持不变,而用于创建和填充CTE的查询计划部分随后在具有连接的查询中使用时会发生巨大变化.
我的问题是为什么CTE的创建和填充的查询计划会随着temp临时表的使用而改变.同样在什么情况下,CTE会产生比临时表更好的性能?
*注意我也使用了一个表变量,它与temp表方法相当.
谢谢