• 締切済み

100万件レコードdelete

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

みんなの回答

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

元データの件数はどのくらい? 2000万行あるうちの100万行と、101万行のうちの100万行だと違う方法がありそう。

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

ローカル処理ではないということで、3ですが20msに一回実行して2日少しでdeleteしたいですね。

全文を見る
すると、全ての回答が全文表示されます。
  • ok-kaneto
  • ベストアンサー率39% (1798/4531)
回答No.1

もちろん、1回で実行した方が効率は良いです。 処理の1回毎にSQL構文解析→実行計画→実行という動作を行いますし、その都度にメモリやHDDもアクセスすることはあります。できるだけ処理は少ない方が良いです。 >100万件deleteしてる場合も、他処理でレコードが登録、更新される可能性が高いため、 ファントムリードにならないようにきっちりと専有ロックをかけた方が良いです。 で、他処理にはある程度の時間的余裕をもたせられるとベストなのですが。 まあ、その100万件の主キーが何でインデックスがどれくらいあって制約がどのように作られているか、項目数がいくつなのかもわからないので一般論です。

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

関連するQ&A

  • 数百万件レコードのdelete

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

  • 重複レコードの上書きについて

    重複レコードを上書きするSQL構文についての質問です。 SELECT文で更新対象のレコードが、 すでに存在しているかをどうかを確認にしてから、 UPDATE文を発行して更新する方法と、 DELETE文を発行して更新対象のレコードを削除した後に INSERT文で更新文のデータを追加する方法があるのですが、 処理的にはどちらが早くなるのものなんでしょうか?

  • レコード数カウント前のMoveLastについて

    お世話になります。 Access VBA内でSQL(クエリ)のレコード数を算出し、0レコードの場合はAの処理、1レコード以上の場合はBの処理をさせたいと思ってます。 レコード数はRecordCountで求めると思うのですが、MoveLastを事前に実行しておかないと正確なレコード数が求められないと認識しております。 で、クエリでレコードが1つでも抽出されていればMoveLastを実行してもエラーにならないのですが、クエリの条件に該当せずレコード数0の状態でMoveLastを実行してしまうとエラーになってしまいます。 このような場合、どうやって回避すればよいのでしょうか。 基本的には0だとA処理、1以上だとB処理なので、正確なレコード数を算出する必要は無いのですが、Bの処理を実行する際に『○件更新しました』というメッセージを表示させたいので、正確なレコード数を知りたいところです。 ご教授の程、宜しくお願い致します。

  • 排他ロックしたレコードが、別トランザクションから参照されてしまい困っています。

    SQL Server2000を使用し、 あるトランザクションで排他ロック(XLOCK)をかけたレコードが 他のトランザクションから共有ロックを使用し参照できてしまう状態は存在するのでしょうか? 排他ロックをかけたレコードが 他のトランザクションから参照できてしまい困っています。 現在、下記の環境で開発を行っております。 ・サーバ側 Windows Server2003 SQL Server2000(sp4) ・クライアント側 Windows Xp(sp3) jdk6.0 jdbc 3.0 Type4 以下が具体的な状況となります。 前提として、 ・二つのトランザクション(以下A、Bと表記します)が存在する。 ・AとBは別のユーザでコネクションを張っている。 ・autoCommitはfalseに設定している。 ・テーブルにプライマリキーやインデックスは張っていない。 ・レコードは10件。 ・分離レベルはREAD COMMITED (1)Aから、「SELECT * FROM TEST_TABLE WITH(XLOCK) 」を発行 (2)Bから、「SELECT * FROM TEST_TABLE」を発行 このような状況で、(1)、(2)の順で処理を行った場合に 私の認識では、(2)の検索時にタイムアウト等が発生するという認識です。 しかし、(2)のSQLは正常に終了し、(1)と同じデータが取得されてしまいます。 ◆その他、確認したこと ・(1)の処理直後に処理を停止し、Enterprise Managerでロックが取得されているか確認したところ、トランザクションAがすべてのレコードを排他ロック(X)していた。 ・(2)の処理直後にロックの状態を確認しても、やはりトランザクションAが、排他ロック(X)していた。 ・CSEを使いODBC経由で同様の操作を行った場合も同じ動作がおこる。 ・(1)WITH(XLOCK, TABLOCK)とすると(2)でデータが取得できなくなる。 ・(2)のSQLを「SELECT * FROM TEST_TABLE WHERE COLUMN01 > 0」のように指定するとタイムアウトする(期待通りの動き) ・(2)のSQLを「SELECT COLUMN01 FROM TEST_TABLE WHERE COLUMN01 > 0」のように指定すると、今度は、なぜか取得出来てしまう。 ・(1)と(2)の間にトランザクションAでUPDATEなどを行うと(COMMITはしない)(2)のSQLのWHERE句や取得するカラムに関係なく、(2)のSQLはタイムアウトする(当り前か。。。) いろいろ書きましたが、排他ロックされたレコードに 共有ロックはかけれないという認識なのですが、 そうではないのでしょうか? また、そうではない場合どういった場合に、 共有ロックが可能となるのでしょうか? SQL Serverの排他制御に詳しい方や 同じような現象に陥った方がいましたら、ご教授お願いします。

  • 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文で行うのは不可能なのでしょうか?

  • フォームで1レコード削除したのに表示は残ったまま更新されない

    Accessフォーム(表形式)に[削除]ボタンをつけました。 VBAで削除ボタン_Click()を書きました。 ADO接続 SQL発行し、該当レコード削除 (Delete from 予約 where 予約ID= me.予約ID ) というコードです。 削除後も、フォームにはレコードが見えたままなのですが、表示を更新するにはどうしたら良いのでしょうか? ----------------------------------- Set rs = Me.Recordset.Clone '' 予約テーブルからレコード削除処理 ... Me.Requery ----------------------------------- というやり方は、DAOだそうですね。 ADOではフォームのレコードソースを指定できないと参考書にありました。 しかし、DAOでは Delete SQL 発行の仕方がわからないので、できればADOで実現したいのです。 無理でしょうか?

  • SQL*PLUSでファイルからDELETE文

    お世話になります、 Oracle8のSQL*PLUSを使用方法についての質問です。 ローカルにファイル(delete.sql)を作成して SQL*PLUSからそのファイルを流してファイルの中身の処理を実行するという方法をご存知の方が いらっしゃったらおしえてください。 --delete.sqlの中身--------- delete from table_a delete from table_b delete from table_c delete from table_d delete from table_e 以下省略 よろしくお願いします。

  • レコードを1件のみ取得した後、検索をやめる方法はあるのでしょうか?

    PostgreSQLのデータベースでテーブルから、 "1件のレコードが見つかった時点で、他のレコードを検索するのをやめる" という事はSQLでできるのでしょうか? 【テーブル名 Fruit 】 | id | option | name |  1    2     りんご  2    1     みかん  3    1     メロン  4    1     バナナ  5    4     いちご 上記のようなテーブルから、optionが1のレコードを検索する時、 どのレコードでもいいので、1件見つけた時点で他にも該当のレコードがあるかという検索の処理をしない。 という事はできるのでしょうか? 出来るのであれば、膨大な数のレコードがある場合、検索の時間が減るのでは無いかと思ったのですが・・・ 現在は下記のSQLのように、OFFSETとLIMITを使用して1件のレコードを取得しています。 SELECT      * FROM      Fruit WHERE      option=1 OFFSET 0 LIMIT 1 このやり方であっているのでしょうか? または他の仕方があるのでしょうか? 教えていただきたいです。 宜しくお願いします。

  • Access2003 VBAのDELETEについて

    AccessでOracleとODBC接続してデータを操作するアプリを作成しています。 処理をする際に毎回ワークテーブルを全件削除し、取り込んで本テーブルにインサートする という処理にて、ワークテーブルのデリート文でなぜか10件しかレコードが削除されません。 固有レコードの問題を解消するためにDB側ではID列をPKとして一意に決まるように振っています。 ODBCのリンクテーブルという形で登録しています。 テーブル:TEST_WORK カラム:ID(PK)、コード、名称 CurrentDb.Execute "DELETE FROM TEST_WORK" 上記記述にてなぜか全削除されません。 感じとしては一回目のdeleteでIDが1~9までが削除され、次にdeleteした際は10~99までが削除され・・・というように桁数で変化している気がします。 全て消すにはどのようにすればよいでしょうか?

  • 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 ) ;