SQL Server中比对表两列差异的查询性能与代码规范优劣问询
SQL不等值查询方案对比与最优选择
前置说明
你的需求是筛选表中Column1和Column2不相等的行(包含单列为空、另一列有值的场景),你提供的三个方案普遍存在两个共性问题:
- 隐式类型转换风险:
Column1和Column2是INT类型,使用空字符串''作为空值替换值时,SQL会自动将INT转为字符串做比较,既损耗性能,极端场景下还会出现不符合预期的结果 - 冗余判断逻辑:
ISNULL/COALESCE的不等判断已经覆盖了「一列空、一列非空」的场景,末尾追加的OR条件完全多余,会额外增加计算量
三个现有方案的具体问题
- Query1:
COALESCE本身是ANSI标准函数,但传入的替换值和列类型不匹配,隐式转换问题明显,冗余OR条件拉低性能 - Query2:嵌套两层
NULLIF的写法逻辑可读性极差,维护成本极高,多层嵌套函数也会导致查询优化器无法有效评估基数,是三个方案中性能最差的 - Query3:首先
! =中间多空格属于语法错误,其次ISNULL是SQL Server专有函数跨库兼容性差,同样存在隐式转换和冗余条件的问题
最优方案推荐
1. 性能最优、符合规范的通用写法(ANSI标准,全数据库兼容)
SELECT * FROM @TBL WHERE Column1 <> Column2 OR (Column1 IS NULL AND Column2 IS NOT NULL) OR (Column1 IS NOT NULL AND Column2 IS NULL)
该写法的优势:
- 无任何函数包裹列,属于SARGable查询,列上有索引时可以直接走索引,数据量大时性能远超所有带函数的写法
- 逻辑清晰直白,没有理解成本,完全符合SQL代码规范
- 是ANSI标准语法,适配所有主流数据库,兼容性最好
2. SQL Server专属简化写法
如果仅在SQL Server环境运行,可以用更简洁的语法实现同等逻辑,性能和上面的标准写法一致:
SELECT * FROM @TBL WHERE Column1 <> Column2 OR Column1 IS NULL <> Column2 IS NULL
内容的提问来源于stack exchange,提问作者Madhu
相关产品推荐
相关产品推荐

