如何改写UPDATE语句的WHERE子句,移除Non-SARGable函数ISNULL?
改写后的SARGable WHERE子句
原WHERE子句的核心逻辑是:当TABLE_NAME_1和TABLE_NAME_2的FIELD_NAME_1或FIELD_NAME_2存在实质性差异(包括一方为NULL且另一方不是-1的情况)时执行更新。我们可以拆解ISNULL的等价逻辑,替换为支持索引扫描的SARGable条件:
1=1 AND ( -- FIELD_NAME_1 存在差异的场景 [TABLE_NAME_1].[FIELD_NAME_1] <> [TABLE_NAME_2].[FIELD_NAME_1] OR ([TABLE_NAME_1].[FIELD_NAME_1] IS NULL AND [TABLE_NAME_2].[FIELD_NAME_1] <> -1) OR ([TABLE_NAME_2].[FIELD_NAME_1] IS NULL AND [TABLE_NAME_1].[FIELD_NAME_1] <> -1) -- FIELD_NAME_2 存在差异的场景 OR [TABLE_NAME_1].[FIELD_NAME_2] <> [TABLE_NAME_2].[FIELD_NAME_2] OR ([TABLE_NAME_1].[FIELD_NAME_2] IS NULL AND [TABLE_NAME_2].[FIELD_NAME_2] <> -1) OR ([TABLE_NAME_2].[FIELD_NAME_2] IS NULL AND [TABLE_NAME_1].[FIELD_NAME_2] <> -1) )
逻辑说明
原ISNULL(col, -1) <> ISNULL(other_col, -1)的等价判断包含三类场景:
- 两个字段均非NULL但数值不等;
- 第一个字段为NULL,第二个字段的值不是-1;
- 第二个字段为NULL,第一个字段的值不是-1。
这些条件完全覆盖原逻辑的“不等”判断,且所有条件均为SARGable——数据库可利用FIELD_NAME_1、FIELD_NAME_2上的索引加速查询,避免全表扫描。
额外优化建议
如果两张表有明确的关联主键,建议在WHERE子句开头添加关联条件,过滤掉无意义的行对比,进一步提升更新效率。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

