条件付きで MERGE ステートメントを実行したいので、ターゲット テーブル全体と一致させようとしません。私の元の声明はちょっと次のようなものでした:
MERGE [target_table] USING [table_source]
ON (([target_table].[ID] = [table_source].[ID]) AND (condition))
WHEN MATCHED THEN UPDATE
SET [table_source].[_strField1] = [table_source].[_strField2];
注: '_strField' は nvarchar(4000) として入力され、'condition' は [target_table].[_strField8] = 'sometext' のようなものであると仮定します。
しかし、それから私は指示するドキュメント"...Do not attempt to improve query performance by filtering out rows in the target table in the ON clause"
で次の警告に遭遇しました.
したがって、元のクエリは次のクエリに変更されました
MERGE [target_table] USING [table_source]
ON (([target_table].[ID] = [table_source].[ID]))
WHEN MATCHED AND (condition)
THEN UPDATE
SET [table_source].[_strField] = [table_source].[_strField];
問題は、クエリにさらに時間がかかることです。1 = 2のように条件を「常に false」に変更しても、まったく役に立ちません。一方、次のようなさまざまなフィールドを設定する
SET [table_source].[_intField] = [table_source].[_intField];
または、2 つの nvarchar(4000) 以外の型を使用すると、ステートメントがより高速に実行されます。
結論として、私が理解していないことは次のとおりです。
- nvarchar(4000) の data-setting がより長いプロセスである場合、条件を「1 = 2」に設定しても実行時間が速くならないのはなぜですか?
- 「行一致」がより長いプロセスである場合、INTフィールドを設定すると実行時間が短縮されるのはなぜですか?