2

リモートDBから数十万の順序で行を削除しています。各削除には、独自のターゲットがあります。

DELETE FROM tablename
WHERE (col1=c1val1 AND col2=c2val1) OR (col1=c1val2 AND col2=c2val2) OR ...

これは私にとって個々のクエリのほぼ2倍の速さでしたが、SQLをあまり長く使用していないので、これをさらに高速化する方法があるかどうか疑問に思いました。

4

3 に答える 3

6

一時テーブルを作成し、行ごとに1つずつ、すべての値のペアを入力します。列に、の一致する列と同じ名前を付けますtable

CREATE TEMPORARY TABLE donotwant (
  col1 INT NOT NULL,
  col2 INT NOT NULL,
  PRIMARY KEY (c1val, c2val)
);

INSERT INTO donotwant VALUES (c1val1, c2val1), (c1val2, c2val2), ...

次に、これらのテーブル間のJOINに基づいて複数テーブルの削除を実行します。

DELETE t1 FROM `tablename` AS t1 JOIN `donotwant` USING (col1, col2);

USING句はON t1.col1=donotwant.col1 AND t1.col2=donotwant.col2、列の名前が両方のテーブルで同じであり、両方の列が結合されたテーブルの名前と同じである結合条件が必要であると仮定して、の省略形です。

于 2013-01-18T17:04:46.937 に答える
0

一般的に、バルクを実行する最も速い方法は、DELETE削除するIDをある種の一時テーブルに入れ、それをクエリの一部として使用することです。

DELETE FROM table
WHERE (col1, col2) IN (SELECT col1, col2
                       FROM tmp)

挿入は、標準を介して行うことができます。

INSERT INTO tmp VALUES (...), (...), ...;

ステートメント、またはDBのバルクロードユーティリティを使用します。

于 2013-01-18T17:05:09.480 に答える
0

それがパフォーマンスに大きな違いをもたらすとは思えませんが、そのようなことをこのように書くことができます...

DELETE 
  FROM table
 WHERE (col1,col2) IN(('c1val1','c2val1'),('c1val2','c2val2')...);
于 2013-01-18T17:08:19.123 に答える