私はやっているトリガーを書いています
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% の確率で各値が null である可能性があるなど、100 万回も不平等をチェックするパフォーマンス テストの結果です。
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 (Intel Core 2 Duo、2.4Ghz、MSSQL 2008 Express を実行する Vista VM 内の 8GB RAM) でのテスト実行。