- ベストアンサー
oracleの分割delete
oracleに登録された数億件のデータを数日に分割して削除するため、 数億件のデータを5千件ずつ削除する方法を教えてください。 delete from テーブル名 where 条件 set rowcount = 5千; commit; これだと削除処理する件数が5千件であって、 先頭から5千件分見ることとは違うのでしょか? やりたいことは、 初日:一件目~5千件 二日目:5千1件目から一万件目 ・・・・・・ という感じで削除処理を行いたいです。 皆様の力を貸してください。宜しくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
delete from a where rounum < 5000 commit; この処理を実行すると、一件目~5千件が削除され、元々あった5千1件目から一万件目が上に詰まります。 ですから、2日目も同じコマンドによって、元々あった5千1件目から一万件目が削除されます。
その他の回答 (3)
- Siegrune
- ベストアンサー率35% (316/895)
全件じゃなくって条件が成立するレコードだけを削除したいなら、 delete from テーブル名 where プライマリキー in (select プライマリキー from テーブル名 where 条件 and rownum <= 5000) commit; といった感じですが。
お礼
回答ありがとうございます。 rownum <= 5000 が正しい書き方なのですね。DB環境はoracleなので 指摘していただいて助かりました。 教えていただいたSQLを加工して、削除SQLを作成したいと思います。
- bin-chan
- ベストアンサー率33% (1403/4213)
> oracleに登録された数億件のデータを数日に分割して削除するため、 数字は例なんでしょうケド、10日では終わらないでしょ。 数億消すと残るレコードはどのくらい? 必要なレコードを別テーブルに抽出して、元テーブルをTruncateが良いかも。 数億レコードならパーティションテーブル化されてませんか? パーティションテーブルなら、パーティション単位でも消せますし。
お礼
回答ありがとうございます。 普段、自分は触れないDBで、しかも作成当時の資料がまったく残っていないので、パーティション化されているかわからない状態です。 なので、今回はパーティション化されていない前提で削除を行おうと思います。
- zingbay
- ベストアンサー率0% (0/1)
>delete from テーブル名 where 条件 set rowcount = 5千; これはoracleの構文では無いようですが、oracle前提という事で回答します。 rownum < 5000 の指定をすれば、5000件の抽出は行ってくれます。 delete from a where rounum < 5000 commit; が、母体が数億ある状態ですと、5000件を抽出する為に全て読み込んでから さらに5000件を取り出す形になるので、サーバの負荷が耐えられるのか心配です。 単純にそのテーブルを空にすればよいのであれば、truncate 命令を使った方が 簡単で早いです。
お礼
回答ありがとうございます。 rounum = 5000 は記述できなかったんですね。DBはoracleを使用しているので、 指摘していただいて助かりました。 実際に5千件~1万件程度抽出し、サーバ負荷を計測したイと思います。 条件に一致するレコードのみを削除するため、truncateが使用できないのが痛いです。全削除なら楽なんですけどね。
お礼
回答ありがとうございます。 まさに知りたい情報でした。 rounum < 5000で削除SQLを作成したいと思います。