我正在写一个正在做的触发器
IF (@A <> @B)
...
但这不适用于@A 或@B 上的NULL 值。它通常完成的方式是
IF (@A <> @B) OR (@A IS NOT NULL AND @B IS NULL) OR (@A IS NULL AND @B IS NOT NULL)
但这涉及最多 9 次比较与 1 次比较!
我可以做
SET ANSI_NULLS OFF
但显然不建议这样做(并且不推荐使用)。
那么什么是最好的解决方案呢?当它应该是 1 时,只需进行 9 次比较即可进行简单的不等式检查?触发器不是性能关键,但它确实需要快速。批量加载时,这可能会大大减慢速度。
性能测试
这是一个性能测试的结果,该测试检查了一百万次是否不相等,因此 90% 的时间值不相等,10% 的时间每个值可能为空。
IF (@A <> @B) OR (@A IS NULL AND @B IS NOT NULL) OR (@A IS NOT NULL AND @B IS NULL)
结果:平均3848ms
IF (ISNULL(@A, 0) <> ISNULL(@B, 0))
结果:平均 3942ms
IF (@A = @B) GOTO Equal ELSE IF @A IS NULL AND @B IS NULL GOTO Equal
结果:平均 4140ms
IF EXISTS (SELECT @A EXCEPT SELECT @B)
结果:平均 7795ms
时间并不重要,重要的是相对差异。显然,经典方法是最快的。可能 MSSQL 已针对此类检查进行了内部优化。
在 MacBook Pro(运行 MSSQL 2008 Express 的 Vista VM 内的 Intel Core 2 Duo、2.4Ghz、8GB RAM)上进行测试。