• ベストアンサー

oracleの分割delete

oracleに登録された数億件のデータを数日に分割して削除するため、 数億件のデータを5千件ずつ削除する方法を教えてください。 delete from テーブル名 where 条件 set rowcount = 5千; commit; これだと削除処理する件数が5千件であって、 先頭から5千件分見ることとは違うのでしょか? やりたいことは、 初日:一件目~5千件 二日目:5千1件目から一万件目 ・・・・・・ という感じで削除処理を行いたいです。 皆様の力を貸してください。宜しくお願いします。

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

  • ベストアンサー
  • toshi_2000
  • ベストアンサー率30% (306/1002)
回答No.2

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

Kuroichi01
質問者

お礼

回答ありがとうございます。 まさに知りたい情報でした。 rounum < 5000で削除SQLを作成したいと思います。

その他の回答 (3)

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.4

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

Kuroichi01
質問者

お礼

回答ありがとうございます。 rownum <= 5000 が正しい書き方なのですね。DB環境はoracleなので 指摘していただいて助かりました。 教えていただいたSQLを加工して、削除SQLを作成したいと思います。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.3

> oracleに登録された数億件のデータを数日に分割して削除するため、 数字は例なんでしょうケド、10日では終わらないでしょ。 数億消すと残るレコードはどのくらい? 必要なレコードを別テーブルに抽出して、元テーブルをTruncateが良いかも。 数億レコードならパーティションテーブル化されてませんか? パーティションテーブルなら、パーティション単位でも消せますし。

Kuroichi01
質問者

お礼

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

  • zingbay
  • ベストアンサー率0% (0/1)
回答No.1

>delete from テーブル名 where 条件 set rowcount = 5千; これはoracleの構文では無いようですが、oracle前提という事で回答します。 rownum < 5000 の指定をすれば、5000件の抽出は行ってくれます。 delete from a where rounum < 5000 commit; が、母体が数億ある状態ですと、5000件を抽出する為に全て読み込んでから さらに5000件を取り出す形になるので、サーバの負荷が耐えられるのか心配です。 単純にそのテーブルを空にすればよいのであれば、truncate 命令を使った方が 簡単で早いです。

Kuroichi01
質問者

お礼

回答ありがとうございます。 rounum = 5000 は記述できなかったんですね。DBはoracleを使用しているので、 指摘していただいて助かりました。 実際に5千件~1万件程度抽出し、サーバ負荷を計測したイと思います。 条件に一致するレコードのみを削除するため、truncateが使用できないのが痛いです。全削除なら楽なんですけどね。

関連するQ&A