2016-08-16 25 views
0

効率的な方法

Delete from T1 where T1.ID in (select ID from T2) 

このクエリを考えてみT1とT2の両方は、レコードの数百万人のために大規模なテーブルです。

T1は「ライブ」テーブルであり、T2は「アーカイブ」テーブルです。 T1からT2へレコードをコピーした後、T1からレコードをクリアします。 T1は多くのインデックスで最適化されて読み込まれます。

この操作を効率的に実行するにはどうすればよいですか?

私は.net環境ですので、コードベースのソリューションも動作します。

答えて

1

データベースのパフォーマンスを向上させるには、ロックが最小限に抑えられるようにレコードのバッチを削除することをお勧めします。

DELETE TOP (1000) 
FROM T1 
WHERE T1.ID IN (SELECT ID  
FROM T2) 

削除するレコードの数を最適化できます。

レコードが削除されなくなるまで、スクリプトを再実行し

3
  1. は、削除する普遍的な方法はありません、ロックを回避するためにバッチでデータを削除するトランザクションログを成長させ
  2. トランザクション・ログに領域を再利用効果的なデータ。ほとんどの場合、

のJOIN INNERを

  • IN(SELECT ...)
  • は(EXISTS)
  • :あなたはあなたのテーブルDB設計のための3つの方法すべてを使用しようとする必要があります多数の行に対して、EXISTSとINNER JOINはIN(SELECT ..)より優れており、多くの場合EXISTSはINNER JOINを上回ります。

+0

IN(SELECT)とEXISTSのクエリプランをチェックしました。実行時に違いがありますか? –

+0

実行時間は同じですが、今後データを追加すると実行計画が変更される可能性があります。私の経験(そして私がオンラインで読んだもの)から、選択の順序はEXISTS、次にINNER JOIN、INです。バッチで更新する場合、どのメソッドを使用するかは実際問題ではありません。 – Anton