この人頭いいなと思ったエピソード

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

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

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

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

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

A 回答 (4件)

delete from a where rounum < 5000


commit;
この処理を実行すると、一件目~5千件が削除され、元々あった5千1件目から一万件目が上に詰まります。
ですから、2日目も同じコマンドによって、元々あった5千1件目から一万件目が削除されます。
    • good
    • 1
この回答へのお礼

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

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

お礼日時:2012/01/23 18:35

全件じゃなくって条件が成立するレコードだけを削除したいなら、


delete from テーブル名 where  
プライマリキー in (select プライマリキー from テーブル名 where 条件 and rownum <= 5000)
commit;
といった感じですが。
    • good
    • 1
この回答へのお礼

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

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

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

お礼日時:2012/01/23 18:40

> oracleに登録された数億件のデータを数日に分割して削除するため、


数字は例なんでしょうケド、10日では終わらないでしょ。
数億消すと残るレコードはどのくらい?

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

数億レコードならパーティションテーブル化されてませんか?
パーティションテーブルなら、パーティション単位でも消せますし。
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2012/01/23 18:34

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


これはoracleの構文では無いようですが、oracle前提という事で回答します。


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

delete from a where rounum < 5000
commit;

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

単純にそのテーブルを空にすればよいのであれば、truncate 命令を使った方が
簡単で早いです。
    • good
    • 1
この回答へのお礼

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

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

お礼日時:2012/01/23 18:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


おすすめ情報