none
大量データの削除方法 RRS feed

  • 質問

  • SQLSERVER2000で1000万件のデータがあるテーブルから、
    そのなかの900万件相当のデータを削除しようとしたら、
    大量にトランザクションロックが発生して、削除できません。
    該当テーブル自体は問い合わせさらできません。
    データ量が多くでエスカレーション発生しているのではと
    思いますが、サービス停止しないで大量データを一気に削除する方法てありますでしょうか

    sql文
     DELETE FROM テーブル WHERE COL2=条件

    ※COL2には索引はっていないけど?これも影響あるかな

    2007年5月24日 9:20

すべての返信

  • 何回かに分けてデータを削除したらどうでしょうか。

    例えば 2 回に分けるのなら、

     

    DELETE FROM テーブル WHERE COL2=条件 AND COL2 >= a

    DELETE FROM テーブル WHERE COL2=条件 AND COL2 < a

     

    という感じで。

     

     

    2007年5月24日 11:37
  •  米田です。

     

     SQL Server 2000の場合、Delete も含めて

    SET ROWCOUNT 100000

    DELETE FROM テーブル WHERE COL2=条件

    SET ROWCOUNT 0

    とすると、100000レコード対象で、打ち切ることができます。

     

     この挙動を利用して、適当な分割条件が、思いつかない場合でも、分割して逃げることは可能です。

    但し、SQL Server 2005では、TOP句がサポートされるため、TOP句の指定で類似の動作を実現することが推奨されています。

    2007年5月24日 14:17
  •  

    根本的な解決策ではないですが、上記の削除処理を今後も行う必要があるのであれば、

    実際に実行されている”クエリプラン”をみて対策を考えるのも良いかもしれません。

     

    "Delete FROM テーブル where COL2=条件 ※COL2には索引はっていないけど?これも影響あるかな"

    → どのようなクエリプランが実行されているかによって、変わるので一概に良い悪いは言えないですね。 

     

    1回だけ(今後同様の削除処理を行う必要が無い)実行ならば、削除件数を減らすなどして

    対処を行うのがベターですかね。

    (クエリの解析/チューニングは時間が掛かるので。)

     

    - クエリの分析-

    < http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/optimsql/odp_tun_1_1pfd.asp >

     

    -SQL クエリ アナライザを使用した実行プランのグラフィカル表示-

    < http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/optimsql/odp_tun_1_5pde.asp >

     

    2007年6月6日 5:22