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