SQL SERVERで大量データを効率的に削除する方法とは?

このQ&Aのポイント
  • SQL SERVERで大量データを一括削除する方法を教えてください。
  • 現在の方法では削除が遅いため、効率的な削除方法を知りたいです。
  • 大量のINSERTではBULK INSERTを使用することで回避できるのですが、削除に関しては困っています。
回答を見る
  • ベストアンサー

SQL SERVER で大量データの削除

delete from table1 where id = 1; delete from table1 where id = 2; delete from table1 where id = 3; もしくは、 delete from table1 where (id = 1) or (id = 2) or (id = 1) という具合のSQLを実行します。 条件は大体20万件程度です。 こちらを実行するとかなり遅いので、 なんとか一括で早く実行する方法はないものでしょうか? 今のところ、プログラムの都合上、プロシージャの中で行なってます。 PROCEDURE UPDATE(@DELSQL nvarchar(max)) EXEC (@DELSQL) @DELSQLに上記SQLが入ります。 大量のINSERTの時は、BULK INSERTのようなやり方があり、 回避できたのですが、困ってます。 どうかよろしくお願いします。

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

  • ベストアンサー
  • uams
  • ベストアンサー率63% (100/157)
回答No.1

高速削除といえばTRUNCATEですが、WHERE句の指定があるので使えないです。となると、基本はIndexか条件見直しになるかと思います。 もし列idにIndexをはっていないようであれば、はってみてください。 あと、orではなくinを使ってみてはいかがでしょうか?細かい名称は忘れてしまったのですが、Management Studioには実行時のパフォーマンスを測定する機能があるので、orとinでそれぞれそのパフォーマンス値を比較すれば、具体的にどのくらい効果があるのか数値で確認できます。 ご参考までに。

boooone
質問者

お礼

別途ワークテーブルを作成し、 inで条件追加したら早かったです。 ありがとうございました。

関連するQ&A

  • MS-SQLプロシージャでファイルを削除したい

    お世話になります。 SQL Server 2005のプロシージャにて テーブルの削除→CSVファイルの取り込み→CSVファイルの削除を行いたいと思っております。 ALTER PROCEDURE [dbo].[テーブル削除+インポート+ファイル削除] AS begin DELETE FROM dbo.テーブル BULK INSERT テーブル FROM 'テキストファイル' WITH (DATAFILETYPE='char', FIELDTERMINATOR=',',ROWTERMINATOR='\n') end ここで、テーブル削除とCSVファイルのインポートはできたのですが、ファイルの削除が未だにできません。 このあとテキストファイルをこのプロシージャ内で削除するにはどうすればよいでしょうか。

  • 別テーブルからSELECTした値を持つ行を削除するSQLは?

    削除 SQL がわかりません。 SQL-1 SELECT id FROM table2 WHERE date_in IS NULL; これで取得したidを持つレコード(別テーブル)を削除したいのですが、 どうすれば組み合わさるのでしょうか? DELETE FROM table1 WHERE id=???

  • T-SQLの sp_executesql について

    SQL-Serverでストアドプロシージャを作っています。 EXEC sp_executesql で検索結果をテーブル型変数に格納したいですができるのでしょうか。動的にSQLを発行し、結果を格納する必要がありますのでEXEC sp_executesqlを使わざる得ない状況です。下記にそのサンプルがあります。 Declare @tblAA Table(NO int) declare @strSQL nVarChar(1000) set @strSQL = '' set @strSQL = @strSQL + ' Insert into @tblAA' set @strSQL = @strSQL + ' Select NO from TBLBango' EXEC sp_executesql @strSQL ,N'@tblAA table(No int) OUTPUT', @tblAA OUTPUT Select * from @tblAA これを実行すろと「変数 '@tblAA' を宣言する必要があります。」というエラーがでます。 解決方法を分かる方教えてください。

  • SQL Server2008 の解析

    SQL Server2008でパフォーマンスの悪いSQLなどを調べようと思い、 以下のような説明を参考にしています。 http://msdn.microsoft.com/ja-jp/magazine/cc135978.aspx http://msdn.microsoft.com/ja-jp/library/ms189741.aspx しかし、エラーが出て実行できません。 SQL文から抜粋しますと、以下の様なエラーが発生ます。  ・THEN LEN(CONVERT(nvarchar(max), qt.text)) * 2    →'max' の近くに無効な構文があります。  ・CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt    →'APPLY' の近くに無効な構文があります。  ・SELECT qs.execution_count   FROM sys.dm_exec_query_stats AS qs    →'sys.dm_exec_query_stats' は無効です。 調べても何が悪いのかわからず困っています。 何がいけないのかご教授いただけませんでしょうか。 よろしくお願い致します。

  • SQL WHERE文のノットイコールについて

    初歩的な質問ですみません。 Oracle9iでsqlplusで接続しています。 「member_accountテーブルのdelete_flag(VARCHAR2)カラムの値が'1'ではない」ものを抽出したいと考えてます。 ただ、正しい結果が返ってきません。 何が問題でしょうか?よろしくお願いいたします。 ============================================================ SQL> select count(ID) from member_account; COUNT(ID) ---------- 16450 SQL> SQL> select count(ID) from member_account where delete_flag='1'; COUNT(ID) ---------- 107 SQL> SQL> select count(ID) from member_account where delete_flag<>'1'; COUNT(ID) ---------- 0 SQL> SQL> select count(ID) from member_account where delete_flag!='1'; COUNT(ID) ---------- 0 ============================================================ よろしくお願いいたします。

  • VBA ACCESS SQL WHERE句の数値型の変数の記述の仕方

    いつもお世話になっております。 i = Me!ID ’数値型です sql = "DELETE FROM T_DELETE_ID WHERE DELETE_ID = ""i"";" CurrentDb.Execute (sql) としたところ、SQLのWHERE句の条件の指定の仕方が どうもうまくいきません。 sql = "DELETE FROM T_DELETE_ID WHERE DELETE_ID = 101;" CurrentDb.Execute (sql) のようにWHERE句の値を数字にしたら実行できます。 この場合はどのようにしたらよろしいでしょうか わかる方いらっしゃいましたら、。ご教示の程よろしくお願いいたします。

  • SELECT文の二段重ね

    次のSQL文を実行します。 create table1 (id, english) insert table1 (1,"foo") insert table1 (2,"bar") create table2 (id, japanese) insert table2 (1, "ふー") insert table2 (2, "ばー") SQL文法としては誤ってますが、成功したとします。 いま、select id from table1 where english = 'foo'; で1が得られます。 いま、select japanese from table2 where id = 1; で"ふー"が得られます。 これを一つのSQLite3のselect文で実現できないでしょうか。 select japanese from table2 where id = (select id from table1 where english = 'foo'); で良いですか? カテゴリ選択にSQLiteが無いのは、人気が無いからですかね。

  • VBでSQL

    SQLでテーブル1に該当レコードがなければインサート あればアップデートをする処理をしたいのです IF ??? THEN UPDATE テーブル1 SET SELECT * FROM テーブル2 WHERE 条件 ELSE INSERT INTO テーブル1(SELECT * FROM テーブル2) END IF ???はプライマリキーで判定をしようと考えています こんな感じでやろうとしたところ うまくいきませんでした VB上で実行しよううとしているからなのでしょうか? ADOでSQLサーバに接続しています 条件分岐もどういう条件(VBでの書き方)がわからないです。 よろしくお願いします。

  • Pro COBOLでは、最後執行したSQL文を取得したい

    【背景】バッチプログラムを実行中、トラブルが発生した場合、どのSQL文が発行されてトラブルになったか知りたいです。   例えば、EXEC SQL SELECT * FROM USE_TABLE WHERE USE_ID=:USE_ID直後でトラブルになった場合、仮に:USE_ID='yxy19700804'でしたら、COBOLがOracleにEXEC SQL SELECT * FROM USE_TABLE WHERE USE_ID='yxy19700804'といったSQL文を発行した直後、トラブルになります。「EXEC SQL SELECT * FROM USE_TABLE WHERE USE_ID='yxy19700804'」をシステム的に取得方法がありますか?

  • 一定以上の行があれば最大値を持つ行を削除するSQL

    MySQL5にて、あるテーブルの特定フィールドの数(つまりcount値)が一定値以上であれば、間引きのため別のフィールドの値で最大値をもつ行を削除するSQLを考案中です。 イメージとしては以下の通りですが、SQLとしては誤っており、また、冗長です。 DELETE FROM table WHERE id={$id} AND (SELECT COUNT(*) FROM table WHERE id={$id}) > 5 AND begin = (SELECT MAX(begin) FROM table WHERE id={$id}); よい知恵をお授けください。

    • ベストアンサー
    • MySQL