SQL Server 2008 R2字符串拼接导致查询过慢 求优化方案
SQL查询优化方案
原语句性能问题根源
当前写法强制对每行的Name和Id做字符串拼接,无法命中现有索引,全表扫描+逐行运算直接拖慢了查询速度,同时字符串拼接的方式还存在NULL值导致的逻辑异常风险。
推荐优化方案
方案1:NOT EXISTS 字段匹配(最符合业务需求,性能最优)
直接基于Name和Id两个字段做匹配,不需要字符串运算,可直接命中索引:
SELECT * FROM EmployeeSetA UNION SELECT * FROM EmployeeSetB b WHERE NOT EXISTS ( SELECT 1 FROM EmployeeSetA a WHERE a.Name = b.Name AND a.Id = b.Id )
优势:
- 无需字符串运算,字段匹配效率远高于原有写法
- 可利用
EmployeeSetA表中(Name,Id)联合索引大幅提速 - 规避了NULL值导致的
NOT IN逻辑错误问题
方案2:EXCEPT 运算符(写法简洁,适合全字段去重场景)
如果两个表结构完全一致,且需要全字段匹配去重,可以用SQL Server原生的EXCEPT运算符简化写法:
SELECT * FROM EmployeeSetA UNION ( SELECT * FROM EmployeeSetB EXCEPT SELECT * FROM EmployeeSetA )
注意:该方案是全字段匹配,如果仅需要按Name和Id判断重复,优先使用方案1。
额外性能提升建议
- 给
EmployeeSetA表的Name和Id字段创建联合索引,匹配效率可提升数倍 - 替换
SELECT *为实际需要的业务字段,减少无效数据传输开销,如果字段刚好被索引覆盖还能进一步提速 - 如果确认两个表过滤后无重复数据,可将
UNION替换为UNION ALL,省去去重运算开销
内容的提问来源于stack exchange,提问作者JGV
相关产品推荐
相关产品推荐

