You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:55:38