こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

oracleの分割delete

oracleに登録された数億件のデータを数日に分割して削除するため、
数億件のデータを5千件ずつ削除する方法を教えてください。

delete from テーブル名 where 条件 set rowcount = 5千;
commit;

これだと削除処理する件数が5千件であって、
先頭から5千件分見ることとは違うのでしょか?

やりたいことは、
初日:一件目~5千件
二日目:5千1件目から一万件目
・・・・・・

という感じで削除処理を行いたいです。
皆様の力を貸してください。宜しくお願いします。

投稿日時 - 2012-01-20 15:28:39

QNo.7255761

困ってます

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

delete from a where rounum < 5000
commit;
この処理を実行すると、一件目~5千件が削除され、元々あった5千1件目から一万件目が上に詰まります。
ですから、2日目も同じコマンドによって、元々あった5千1件目から一万件目が削除されます。

投稿日時 - 2012-01-20 21:52:41

お礼

回答ありがとうございます。

まさに知りたい情報でした。
rounum < 5000で削除SQLを作成したいと思います。

投稿日時 - 2012-01-23 18:35:43

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

全件じゃなくって条件が成立するレコードだけを削除したいなら、
delete from テーブル名 where  
プライマリキー in (select プライマリキー from テーブル名 where 条件 and rownum <= 5000)
commit;
といった感じですが。

投稿日時 - 2012-01-23 03:39:04

お礼

回答ありがとうございます。

rownum <= 5000
が正しい書き方なのですね。DB環境はoracleなので
指摘していただいて助かりました。

教えていただいたSQLを加工して、削除SQLを作成したいと思います。

投稿日時 - 2012-01-23 18:40:16

ANo.3

> oracleに登録された数億件のデータを数日に分割して削除するため、
数字は例なんでしょうケド、10日では終わらないでしょ。
数億消すと残るレコードはどのくらい?

必要なレコードを別テーブルに抽出して、元テーブルをTruncateが良いかも。

数億レコードならパーティションテーブル化されてませんか?
パーティションテーブルなら、パーティション単位でも消せますし。

投稿日時 - 2012-01-22 16:31:41

お礼

回答ありがとうございます。

普段、自分は触れないDBで、しかも作成当時の資料がまったく残っていないので、パーティション化されているかわからない状態です。
なので、今回はパーティション化されていない前提で削除を行おうと思います。

投稿日時 - 2012-01-23 18:34:08

ANo.1

>delete from テーブル名 where 条件 set rowcount = 5千;
これはoracleの構文では無いようですが、oracle前提という事で回答します。


rownum < 5000 の指定をすれば、5000件の抽出は行ってくれます。

delete from a where rounum < 5000
commit;

が、母体が数億ある状態ですと、5000件を抽出する為に全て読み込んでから
さらに5000件を取り出す形になるので、サーバの負荷が耐えられるのか心配です。

単純にそのテーブルを空にすればよいのであれば、truncate 命令を使った方が
簡単で早いです。

投稿日時 - 2012-01-20 20:32:03

お礼

回答ありがとうございます。
rounum = 5000
は記述できなかったんですね。DBはoracleを使用しているので、
指摘していただいて助かりました。
実際に5千件~1万件程度抽出し、サーバ負荷を計測したイと思います。

条件に一致するレコードのみを削除するため、truncateが使用できないのが痛いです。全削除なら楽なんですけどね。

投稿日時 - 2012-01-23 18:38:47

あなたにオススメの質問