SQL的CTE是否会优先执行?SQL Server能否优化带CTE的关联查询
SQL Server CTE 优化问题解答
- 首先直接给出结论:SQL Server 会对这类普通非递归 CTE 查询做智能优化,不会先执行两个CTE的全量查询再做关联和过滤,你完全可以放心用CTE提升代码可读性。
- 原理说明:SQL Server 中的非递归 CTE 本质是临时的视图定义语法糖,并不会预先把CTE内部的查询结果单独计算出来。优化器会把CTE内部逻辑和外层的过滤、关联条件合并做全局执行计划优化,你写的外层过滤条件
SomeCTE.Column1 = 'Hello'、两个CTE的ID关联条件都会被自动下推到CTE内部的表查询逻辑中,结合ID列上的索引,会先过滤掉不符合条件的数据再执行关联操作,不会产生全量查询的浪费。 - 特殊注意事项:只有当单个CTE在查询中被多次引用时,优化器才可能会选择将CTE结果假脱机(Spool)缓存,也有可能仍会展开多次执行,具体逻辑要看实际的复杂度评估,你当前的场景下两个CTE都只被引用了一次,不会出现这种问题。
- 验证方法:如果你想确认实际执行逻辑,直接查看该查询的实际执行计划即可,只要执行计划里优先对CTE内部的表做了索引查找、或先应用了
Column1 = 'Hello'过滤条件再做关联,就说明优化已经生效。
WITH SomeCTE AS ( SELECT ... FROM ... ), AnotherCTE AS ( SELECT ... FROM ... ) SELECT * FROM SomeCTE INNER JOIN AnotherCTE ON SomeCTE.ID = AnotherCTE.ID AND SomeCTE.Column1 = 'Hello';
内容的提问来源于stack exchange,提问作者eulercode
相关产品推荐
相关产品推荐

