SQL Server优化同表相邻版本行对比查询 避免重复子查询
SQL 优化方案
原查询的性能损耗点在于对同一条上一修订版本的记录执行了4次独立子查询,完全可以通过调整子查询逻辑实现单次拉取所需字段,无需使用表关联,和原逻辑100%等价。
优化后代码
SELECT TOP 1 1 FROM some_table s WHERE col1 = @col1 AND ( col2 IN ('N', 'C', 'U') OR EXISTS ( SELECT 1 FROM some_table t WHERE t.id = s.id AND t.revision_id = s.revision_id - 1 AND ( t.col3 != s.col3 OR t.col4 != s.col4 OR t.col5 != s.col5 OR t.col6 != s.col6 ) ) )
优化说明
- 消除了重复子查询:原写法每匹配到一行主表记录,就要单独执行4次子查询拉取上一版本的不同字段,调整为
EXISTS逻辑后,上一版本的记录仅会被查询1次,只要任意字段不匹配就会立刻返回判定结果,不会重复扫描表数据。 - 未使用任何JOIN关联,完全符合你的使用要求。
- 逻辑和原写法完全一致:如果对应id的上一修订版本不存在(即当前是首个版本),
EXISTS会返回false,不会触发字段比对逻辑,和原写法中子查询返回NULL、不等值判定不成立的行为完全对齐。 - 适配你提到的"绝大多数场景返回1"的特性:SQL Server检索到第一条符合条件的记录后会立刻终止查询返回结果,不会遍历全表。只要给
col1、id、revision_id建立联合索引,百万级数据量下查询延迟会远低于原写法。
提示:如果你的业务场景对性能有极致要求,也可以给表增加行哈希预计算字段做比对,但对于绝大多数场景当前写法已经足够高效。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

