• ベストアンサー

大量のレコードを削除する方法

約100万件のレコードを削除したいのですが、 一気に削除するとDeviceがいっぱいとなり、問題です。 なので、1000件単位で削除できればと思うのですが、 何度も同じコマンドを送るのも気が遠くなるので、 なんとか自動化にしたいのですか、 簡単に1000件づつ、例えばfor文などを使って、自動的に削除していってくれるスクリプト(SQL文)を教えてください。  ちなみに今はSybaseですが、どんなデータベースでもかまいません。

質問者が選んだベストアンサー

  • ベストアンサー
  • YanYas
  • ベストアンサー率34% (26/75)
回答No.3

繰り返し同じコマンドを実行する方法として、isqlの場合は、 go の後に数字をいれることで、コマンドを繰り返し実行できます. 例えば insert table values ( 1 ) go 10 と指定すると、insert 文を10回繰り返し実行します。 また、set rowcount を使用すると、この後実行されるSQLの対象件数を指定することができます。 例えば set rowcount 1000 Select * from Table とすれば1000件が検索されます。 同じように set rowcount 1000 Delete Table とやれば100件、削除されるはずです。 ループを使用したい場合 While 文を使います. 前述のset rowcount とあわせて使うといいかもしれません。 set rowcount 1000 declare @count int select @count = 0 while @count < 100 begin delete Table [where条件] select @count = @count + 1 end 削除の対象となる条件がしていされていないので、テーブル先頭の方から適当に1000件消えてしまいます. 実際に作業される際は条件を指定する必要があると思います. また、Device がいっぱいになるとのことですが、トランザクションログ用のデバイスのことでいいですよね。 上記の方法では、いずれにせよトランザクションログはいっぱいになってしまうと思います.Dump tran 等で適宜対処する必要があるでしょう。 残したい行の条件が指定できるのであれば、 select into コマンドで 別テーブルに残したい行を移動し、元のテーブルを trancate table で削除、テーブルをリネームするのがいいと思います。select into や truncate table は大量にトランザクションログを出さないはずなので何度もコマンドを発行するよりいいと思います. 実際に処理を実行される場合は、必要なデータまで消さないように十分注意して行ってくださいね。 各コマンドの詳細はマニュアルを確認してください。 PDFのマニュアルのURLを参考URLに記入しておきます。 以上、がんばってください。

参考URL:
http://www.sybase.co.jp/product/manuals/index.html
momoraro
質問者

補足

YanYasさん、回答ありがとうございました。 早速使ってみようかと思いますが、2点ほど質問させてください。 while文を使用した際、1000件になるまでまわしていますが、一番初めにset rowcount 1000 を何故セットする必要があるのでしょうか? トランザクションがいずれにせよいっぱいになる(!)とのことでしたので、Dump tran を行いたいと思います。 ちなみに checkpoint コマンドはトランザクションログのクリアになりますか? 初心者の質問ですみません。 が、たいへん助かってます!

その他の回答 (2)

  • y_nakkan
  • ベストアンサー率46% (24/52)
回答No.2

#1です。別の方法を書きます。 必要なレコードをエクスポートし、表をdrop table で表削除した後、 新たに create table すれば、フラグメンテーションも解消されるので、良いかも! そして、エクスポートファイルからインポートすると。

  • y_nakkan
  • ベストアンサー率46% (24/52)
回答No.1

Sybaseですか。。 使ったことはないですが、他社DBからの類推で話をします。 100万件のレコードの削除ということですが、1つの表の全レコードを削除するのですか? それとも、不要なレコードだけ削除するのですか? 前者の場合、Oracleでは表内の全レコードを削除するSQL文が存在します。 "truncate table"文です。このSQL文はレコード管理ブロック部のみ初期化するので、 delete文より遥かに高速です。トランザクション処理をスキップしますので。 Sybaseにも同様なSQL文があればよいのですが。。 ----------------------- 「一気に削除するとDeviceがいっぱいとなる」とのことですが、おそらく、 トランザクション管理領域(Oracleでは「ロールバックセグメント」)がパンクするためでしょう。 DBのトランザクション設定を削除するときだけ、変更してみてはいかがですか? Oracle、DB2、informixでもそうですが、トランザクション処理を変更することができます。 トランザクション処理を一切行わない、いわゆる「ダーティリード・モード」にすれば、 「一気に削除するとDeviceがいっぱいとなる」現象は発生しないと思います。 一気に削除できるでしょう。 一度、マニュアルを見てはいかかでしょうか? もし、うまくいった場合、トランザクション設定を元に戻すことも忘れずに。

関連するQ&A