MERGEはtempdbを使用しますか?


12

次のクエリを検討してください。

MERGE [Parameter] with (rowlock) AS target
    USING (SELECT @AreaId, @ParameterTypeId, @Value)
            AS source (AreaId, ParameterTypeId, Value)
    ON (target.AreaId = source.AreaId AND 
        target.ParameterTypeId = source.ParameterTypeId)
    WHEN MATCHED THEN 
        UPDATE SET target.Value = source.Value, @UpdatedId = target.Id
    WHEN NOT MATCHED THEN
        INSERT ([AreaId], [ParameterTypeId], [Value])
        VALUES (source.AreaId, source.ParameterTypeId, source.Value);

統計I / Oは次の出力を提供します。

テーブル 'ParameterType'。スキャンカウント0、論理読み取り2、物理読み取り0、先読み読み取り0、lob論理読み取り0、lob物理読み取り0、lob先読み0。
テーブル「領域」。スキャンカウント0、論理読み取り2、物理読み取り0、先読み読み取り0、lob論理読み取り0、lob物理読み取り0、lob先読み読み取り0。
表「パラメーター」。スキャンカウント1、論理読み取り4、物理読み取り0、先読み読み取り0、lob論理読み取り0、lob物理読み取り0、lob先読み読み取り0。
テーブル 'Worktable'。スキャンカウント1、論理読み取り0、物理読み取り0、先読み読み取り0、lob論理読み取り0、lob物理読み取り0、lob先読み読み取り0

ワークテーブルが[メッセージ]タブに表示され、tempdbが使用されていると思わせますMERGE

実行計画にtempdbの必要性を示すものが何も表示されていません

MERGEいつものtempdbを使うのか?

この動作を説明するBOLには何かありますか?

う使用INSERTUPDATE速く、このような状況であること?

ここに画像の説明を入力してください

正しい

ここに画像の説明を入力してください

これがテーブル構造です

ここに画像の説明を入力してください


計画のスプールは、のワークテーブルですtempdb。しかし、それが単一の行にあることは奇妙に思えます。ハロウィーンの保護のためにあるかもしれません。
マーティンスミス

今見ました。巻き戻しを最適化するために、入力からのデータを一時テーブルに保存します。
クレイグエフライン

回答:


8

(質問に対する私のコメントの拡大。)

AreaIdand の組み合わせに一意の制約がない場合、単一の行のみを記録するParameterTypeIdため、指定されたコードは壊れます。@UpdatedId = target.IdId

指示がない限り、SQL Serverはデータの状態を暗黙的に知ることはできません。制約を強制するか、複数の行が有効な場合、異なるメカニズムを使用してId値を出力するようにコードを変更する必要があります。

スキャン演算子が複数の一致する行に遭遇する可能性があるため、クエリはハロウィーン保護のためにすべての一致を積極的にスプールする必要があります。コメントに示されているように、制約有効であるため、追加すると計画がスキャンからシークに変更されるだけでなく、テーブルスプールの必要性もなくなります。SQLServerは0またはシーク演算子から返された1行。


6

更新によって更新によってスキャンされたインデックス内の行の位置が変更される可能性がある場合、SQL ServerはHalloween Problemから保護する必要があります。そのため、SQL Serverは通常、インデックススキャンの直後に実行プランに熱心なテーブルスプールを挿入します。その演算子は基本的に問題の行のコピーを作成し、そのためにtempdbを使用します。

MERGEステートメントの更新部分は、同じルールに従う必要があり、ハロウィーン保護が必要なほとんどの場合、テーブルスプールも使用します。

これがクエリに当てはまるかどうかはわかりませんが、インデックスの定義がわからないため、ここで何が起こっているのでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.