含DENSE_RANK的CTE:在CTE内或外部过滤哪个性能更优?
带DENSE_RANK的CTE:内部过滤vs外部过滤的性能对比
针对你提出的问题,结论很明确:在SQL Server这类现代关系型数据库中,示例A(CTE外部过滤)和示例B(CTE内部嵌套过滤)的性能几乎完全相同,你的推测并不准确,具体原因如下:
1. CTE是语法糖,不会被单独物化执行
CTE(公共表表达式)只是简化SQL写法的语法层面工具,数据库不会先独立执行CTE并存储结果,再执行外层查询。查询优化器会自动将CTE的逻辑与外层查询合并,生成统一的最优执行计划。
对你的两个示例来说,优化器最终会生成完全一致的执行步骤:
- 扫描
@Orders表 - 按
custid分区、orderid排序计算DENSE_RANK - 筛选出
Ranking = 1的记录 - 返回指定列
不存在“CTE内过滤先预过滤全表,外部过滤仅影响对应记录”的区别——两种写法的逻辑被优化器合并后,执行路径完全一致。
2. 两种写法的核心差异是可读性
- 示例A的写法更简洁清晰:CTE专注完成排名计算逻辑,外层查询负责过滤条件,代码分层明确,后期维护成本更低。
- 示例B通过嵌套子查询在CTE内部过滤,写法冗余,没有任何性能优势,反而增加了代码复杂度。
3. 特殊情况的例外
只有当CTE被多次引用(比如同一个查询中多次调用CTE),或者使用MATERIALIZE提示强制物化CTE时,才可能出现性能差异,但这种场景和你的示例无关。
内容的提问来源于stack exchange,提问作者user3522789
相关产品推荐
相关产品推荐

