多くの開発者と同様に、私はデータ、特にSQL Serverで多くのマージ操作を実行します。マージ操作中にテーブルを更新する最も効率的な方法は何ですか?
歴史的に、私は古いトリックを使用している: - 左をやって)
1は、既存のデータに参加する、と私はのために対応するレコードを持っていない何かを挿入します。
2)1)の後、ターゲットテーブルの行を更新します。
私は1)でパフォーマンスヒットする必要があります。やむを得ないことだ。しかし、2)では、私はむしろ恥ずかしそうでした。更新が必要なものを更新するだけでなく、私がマッチしたもの(基礎となるデータが変更されたかどうか)をすべて更新しました。
SQL Serverは、この種の更新についてスマートではないことがわかりました。それはあなたが更新しようとしているものがあなたがそれを更新するために使用しているものと同じではないことを決定するために事前チェックを実行しません。したがって、これらの行に沿って行われる更新は、物理的な書き込みをもたらし、フィールドを参照するインデックスに影響を与えます。次のように私のPOVから、私の選択肢があるので
、: -
1)私のルーチンの現在の浪費を浴び、通常のようにキャリー(と大型のDBで毎日のインデックスを更新)
- 長所:それは簡単です。
- 短所:それは駄目です。
2)フィールドが変更されている場合は、特定のフィールドを更新するUPDATEステートメントをさらに記述します。
UPDATE
p2
SET
[SpecificField] = p1.[SpecificField]
FROM
@source p1,
Dest p2
WHERE
p2.ExternalKey = p1.ExternalKey
AND COALESCE(p1.[SpecificField],'') <> COALESCE(p2.[SpecificField],'')
- 長所:それは、高度に特異的だアップデートが必要な場合にのみ更新します。
- 短所:多数の列を持つテーブルの異なる更新ステートメントのロット。
3)スタックオーバーフローコミュニティが示唆しているように無限に優れたものがあります。
3)と一緒に行きたいです。私のオプションは本当に1か2に制限されていますか?注意。私はMERGE INTOを調べました。同じ問題、本当に。
SQL Server?バージョン?あなたは 'MERGE'ステートメントを使用することができるかもしれません... – JNK
私は2008年がMERGE INTOに付属していることを知っていますが、それはインデックスに影響すると同じ問題を抱えていませんか? –
値が変更されていないフィールドを更新する場合は、はいとします。それぞれのフィールドに 'CASE'チェックをつけることができます。 – JNK