2

条件付きで 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フィールドを設定すると実行時間が短縮されるのはなぜですか?
4

1 に答える 1

0

SQLサーバーのドキュメントによると:

「...AND NOT target_table.column_x = value を指定するなど、ON 句でターゲット テーブルの行を除外して、クエリのパフォーマンスを改善しようとしないでください。そうすると、予期しない誤った結果が返される可能性があります..*

最初のクエリは無効です。時間の結果を考慮に入れるべきではありません。

固定長 (int、date) で列を更新すると、「行オーバーフロー データが 8 KB を超える」という状況は発生しません。この状況は、nvarchar(4000) を使用してクエリのパフォーマンスが低下した場合に発生する可能性があります。

マージ関数が内部でどのように機能し、データをどのように処理するかについては、ここでは説明しません。したがって、おそらくこの機能の開発者だけがあなたの質問に答えられるでしょう。

varchar(4000) のパフォーマンスの問題についてお役に立てれば幸いです。

マルシン・パジエ

于 2013-03-05T21:47:37.357 に答える