17

この種の SQL クエリのパフォーマンスを向上させる方法はありますか。

INSERT
INTO ...
WHERE NOT EXISTS(Validation...)

問題は、テーブルに多くのデータ (数百万行など) があるWHERE NOT EXISTS場合、句の実行が非常に遅い場合です。重複したデータを挿入できないため、この検証を行う必要があります。

SQLServer 2005 を使用しています

どうも

4

7 に答える 7

14

インデックス付きの列を検索していることを確認し、それらの列内のデータを操作しないでください (部分文字列など)。

于 2009-02-16T20:50:35.853 に答える
12

私の頭の上から、次のようなことを試すことができます:

 TRUNCATE temptable
 INSERT INTO temptable ...
 INSERT INTO temptable ... 
 ...
 INSERT INTO realtable
 SELECT temptable.* FROM temptable
 LEFT JOIN realtable on realtable.key = temptable.key
 WHERE realtable.key is null
于 2009-02-16T20:58:21.873 に答える
6

NOT EXISTS を左外部結合に置き換えてみてください。大規模なデータ セットではパフォーマンスが向上することがあります。

于 2009-02-16T20:56:56.260 に答える
1

インデックス作成に関する他の回答に注意してください。NOT EXISTS は、適切なインデックスがある場合、通常は非常に高速です。

しかし、あなた説明したようなステートメントでパフォーマンスの問題が発生しました。これを回避するために私が使用した方法の 1 つは、候補値に一時テーブルを使用し、DELETE FROM ... WHERE EXISTS (...) を実行し、残りをやみくもに INSERT することです。もちろん、競合状態を避けるために、トランザクション内で。クエリを分割すると、オプティマイザが混乱することなくジョブを実行できる場合があります。

于 2009-02-16T20:56:46.073 に答える
0

問題のスペースを少しでも減らすことができれば、パフォーマンスが大幅に向上します。そのテーブルのすべての行をチェックする必要があると確信していますか?

あなたが試してみたいと思うかもしれない他のことは、DELETE InsertTable FROM InsertTable INNER JOIN ExistingTable ON <Validation criteria>あなたの挿入の前です。ただし、走行距離は異なる場合があります

于 2009-02-16T20:57:35.837 に答える
0
insert into customers 
select * 
from newcustomers 
where customerid not in (select customerid 
                         from customers)

..より効率的かもしれません。他の人が言ったように、検索フィールドにインデックスがあることを確認してください。

于 2009-02-16T21:09:09.897 に答える