• 締切済み

数百万件レコードのdelete

DELETEにてWHERE句の条件で数百万件のレコードを削除したいのですが、効率的な方法を教えてください。SQL初心者です。 LOGの肥大化や削除に非常に時間がかかるのを心配してます。

みんなの回答

  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.3

こんにちは。 以下のように分割して削除する方法如何でしょうか。 SET ROWCOUNT 500000 '←削除対象件数中、500000レコード対象で、打ち切る。 DELETE FROM テーブル WHERE COL2=条件 SET ROWCOUNT 0

nenepapa0430
質問者

お礼

そうですね。有難うございます。 300万レコード中、250万件あまりをDELETEしようとしてました。。。 ログ肥大しますよね。。。同テーブルコピーに50万件をINSERTが早かったです。ログも増えませんでした。

全文を見る
すると、全ての回答が全文表示されます。
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

(1)deleteしなくて良いレコードを別テーブルにinsertして(2)元テーブルを消して(3)リネーム、ではダメですか? インデックスや制約など、適用は必要ですが。

全文を見る
すると、全ての回答が全文表示されます。
noname#39970
noname#39970
回答No.1

全体は どれくらいなの? 数千万件なら仕方ないけど 残る方が圧倒的に少ないのなら残る物を抽出してテーブルそのものを削除じゃダメかな?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 100万件レコードdelete

    お世話になります SQL Serverで、 100万件のレコードを削除したいのですが どのような方法が効率よいでしょうか また、メモリ負荷など、クライアント側から分かるような実行計画とかは ありませんでしょうか? 1.100万件を1回でdelete 2.100万件を複数回に分けてdelete 3.100万件を1行ずつキー指定でdelete(deleteを100万回実行) 100万件deleteしてる場合も、他処理でレコードが登録、更新される可能性が高いため、 そちらの処理がタイムアウトなどのエラーにならないようにしたいです 詳しい方に聞いたところ、 delete発行する際に、メモリにアクセスしてるので、 3だとそれが単純計算で100万倍になるので、負荷が高いのでは? という事でした。 ご教授の程、よろしくお願い致します

  • 【sqlite3】deleteしても.dbファイルのサイズは減らない?

    DB及びSQLに詳しい方、教えてください。 sqliete3を使ってます。 insertしたレコードをdeleteしても.dbファイルのサイズは小さくならない 様なので、テーブルのカラムに削除フラグを設けて、削除はdeleteコマン ドでレコードを削除する代わりに、フラグのupdateとし、 レコード挿入の場合は、フラグが立ってるレコードを見つけて、そのコー ドを更新(フラグが立ってるレコードが無い場合はinsert)とする仕様に してみようかと考えてます。 もちろんselect時は、フラグの立ってるレコードをwhere句で除外するつも りです。 そこで、質問なのですが、フラグの立ってるレコードを一つselectして該 当レコードをupdateするには、どのようなSQLになるでしょうか? フラグが立つレコードは複数もしくは無い事が考えられるので、例えば、 update table01 set col = 'hogehoge' where flag = 1; では上手く機能しないと考えます。 複数レコードが選択された場合は、任意のレコードを選んで更新、また、 レコードが一つも選択されなかった場合の条件判定(後のinnsert)は、 どのように記述したらよいのでしょうか? ※そもそも、そんな事しなくても他にもっと良い方法があるよ。  といった場合は、その方法を伝授してください。 それでは、ご指導のほど、宜しくお願いいたします。

  • DELETE 文とEXISTSの使い方について(Oracle10g)

    DELETE 文とEXISTSの使い方について(Oracle10g) 2つのテーブル(A、B)を外部結合して、B側がNULLとなったレコードを A側から削除する、というDELETE文が作りたいのですが、 EXISTS句を使ってみたもののどうも使い方がわからず苦戦しています。 目的は2つのテーブルを同期させる事で このSQLを実行する時点で、常にA>Bになっています。 目的を達成できるSQLを教えてください。 <削除対象レコードをSELECTするSQL> SELECT * FROM A, B WHERE A.KEY1 = B.KEY1(+) AND A.KEY2 = B.KEY2(+) AND B.KEY1 IS NULL ; <上をDELETE文にしてみたつもりが、削除0件になってしまうSQL> DELETE FROM A WHERE EXISTS( SELECT 1 FROM B WHERE A.KEY1 = B.KEY1(+) AND A.KEY2 = B.KEY2(+) AND B.KEY1 IS NULL ) ;

  • SQLiteで最も古いレコードのみの削除

    AndoroidでDBを使うのですが、考える動作のSQL文が作成できません。 テーブルTESTは以下のカラムを持ちます  ・ID - primary key not null  ・VALUE - not null テーブルTESTは最大で10件のレコードを保持します、11件目のレコードが発生したら 最も古い1件目のレコードを削除してから、11件目のデータを新しい10件目のデータとして テーブルに保存します。 そのために「最も古いレコード1件のみを削除する」というSQLを作成したいのですが、 考えたSQL文が正しくないと怒られてしまいます。 delete from TEST as A, (select * from TEST LIMIT 1)as B where A.ID=B.ID; この動作を1つのSQL文で行うのは不可能なのでしょうか?

  • 大量レコードをTRUNCATEせずにすばやく削除する方法

    大量レコードをTRUNCATEせずにすばやく削除する方法 100万レコードあるテーブルのうち1万レコードを残して削除したい。TRUNCATEではWHERE句が指定できないので不可。DELETEでは遅すぎる。何かいい方法はないでしょうか? 1万レコードを一時テーブルに退避してTRUNCATE後に1万レコードをINSERTというのは無しです。1万レコードが1秒でもテーブル上から消えてはいけません。 Oracle10g

  • DELETE文とロックについて

    DELETEしようとしているレコードがロックされている場合は、削除せず すぐに処理を戻したいです。イメージ的にNOWAITが最適と思い →DELETE FROM テーブルA WHERE カラムA = 'A' NOWAIT としたいところですが、NOWAITはSELECT文でしか指定できないとのことなのでNGです。 SELECT文で抽出した条件のレコードを削除する場合 →DELETE FROM テーブルA WHERE カラムA =      (SELECT カラムA FROM テーブルA WHERE カラムA = 'A') と出来ます。 又、SELECT文でロック待機時間なしの場合 →SELECT カラムA FROM テーブルA WHERE カラムA = 'A' FOR UPDATE NOWAIT と出来ます。 これらを組み合わせて、ロックされているレコードを削除しようとした場合、 すぐにNGで制御を戻すように、次のように記載してみました。 →DELETE FROM テーブルA WHERE カラムA =    (SELECT カラムA FROM テーブルA WHERE カラムA = 'A' FOR UPDATE NOWAIT) なぜかNGになってしまいます(右カッコがありませんと言われます)。 なぜこの書き方が出来ないのでしょうか? 現在、一度該当のレコードをSELECT文でFOR UPDATE NOWAITをしてから DELETEをしています。 1つレコードを削除したいだけなのに、わざわざSELECT文と DELETE文を発行してしまっています。 こういう場合、他にどのような方法があるのでしょうか? 宜しくお願いします。

  • レコードの有無だけを調べる方法

    通常SELECT命令では、WHERE句で指定した条件と一致したレコードを取り出しますが、WHERE句で指定した条件と一致するレコードが有るか無いかだけ(TRUEかFALSEを返す)を調べる方法はありますでしょうか? ご存知の方がいらっしゃいましたらお教えいただければと思います。

  • このようなDELETEはできますか?

    こんにちは。DELETE文の削除条件について教えてください。 例えば下記のような2つのテーブルがあったとします。 ATABLE KEY1(ID) KEY2(DATE) ・・・・・・・・・・ ------------------------------------------------ 100000 2004/09/01 ・・・・・・・・・・ 200000 2004/09/01 ・・・・・・・・・・ 300000 2004/09/01 ・・・・・・・・・・ BTABLE KEY1(ID) KEY2(DATE) CODE ・・・・・・・・・・ ------------------------------------------------ 100000 2004/09/01 0 ・・・・・・・・・・ 200000 2004/09/01 0 ・・・・・・・・・・ 300000 2004/09/01 1 ・・・・・・・・・・ この2つのテーブルで、BTABLEのCODEが1のレコードにKEYで関連付くATABLEのレコードを削除したいのです。 プログラムの中では対応できるのですが、SQL1文で実行させることはできるでしょうか? とりあえず下記のように作ってみました(いたずらに長いかもしれませんが)。 DELETE FROM ATABLE WHERE KEY1 IN (SELECT ATABLE.KEY1 FROM ATABLE,BTABLE WHERE ATABLE.KEY1 = BTABLE.KEY1 AND ATABLE.KEY2 = BTABLE.KEY2 AND BTABLE.CODE = 1) AND KEY2 IN (SELECT ATABLE.KEY2 FROM ATABLE,BTABLE WHERE ATABLE.KEY1 = BTABLE.KEY1 AND ATABLE.KEY2 = BTABLE.KEY2 AND BTABLE.CODE = 1) これで良い/悪い、もっと簡潔にできる、などありましたら是非お聞かせ願えますでしょうか? よろしくお願いします。

  • SQLで条件にヒットしたレコードより後ろ10件を出したい

    データベースはOracleで、SQLでWhere区の条件にヒットしたレコードと、そのレコードより後ろ10件のレコードも抽出したい場合何か良い方法ありますか? 例.商品マスタがあって、商品CD=1111で検索した場合は、商品CDが1111より後ろ10件のレコードも抽出したい。 商品CDは連番になっていない部分もあります。

  • DELETEのwhere句について

    SQL文について教えていただけないでしょうか? 力不足のため苦しんでおります。 宜しくお願い致します。 TBLいいの項目EEが100以外かつFFが50以下で 抽出される全ての項目AAをKEYにしてTBLいいを 削除したいのですがわかりません。 DELETEののwhere句について教えてくいただけ ないでしょうか?。  条件  DB:SQLServer2000   TBLああ AA BB CC DD   TBLいい AA EE FF GG  

このQ&Aのポイント
  • DCP-J940NとMFC-J860DNのレーベル印刷用ディスクトレイは同じですか?
  • MFC-J860DNのディスクトレイをDCP-J940Nで使うことは可能でしょうか?
  • ブラザー製品のディスクトレイに関してお困りですか?解決策をお伝えします。
回答を見る