この種の SQL クエリのパフォーマンスを向上させる方法はありますか。
INSERT
INTO ...
WHERE NOT EXISTS(Validation...)
問題は、テーブルに多くのデータ (数百万行など) があるWHERE NOT EXISTS場合、句の実行が非常に遅い場合です。重複したデータを挿入できないため、この検証を行う必要があります。
SQLServer 2005 を使用しています
どうも
この種の SQL クエリのパフォーマンスを向上させる方法はありますか。
INSERT
INTO ...
WHERE NOT EXISTS(Validation...)
問題は、テーブルに多くのデータ (数百万行など) があるWHERE NOT EXISTS場合、句の実行が非常に遅い場合です。重複したデータを挿入できないため、この検証を行う必要があります。
SQLServer 2005 を使用しています
どうも
インデックス付きの列を検索していることを確認し、それらの列内のデータを操作しないでください (部分文字列など)。
私の頭の上から、次のようなことを試すことができます:
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
NOT EXISTS を左外部結合に置き換えてみてください。大規模なデータ セットではパフォーマンスが向上することがあります。
インデックス作成に関する他の回答に注意してください。NOT EXISTS は、適切なインデックスがある場合、通常は非常に高速です。
しかし、あなたが説明したようなステートメントでパフォーマンスの問題が発生しました。これを回避するために私が使用した方法の 1 つは、候補値に一時テーブルを使用し、DELETE FROM ... WHERE EXISTS (...) を実行し、残りをやみくもに INSERT することです。もちろん、競合状態を避けるために、トランザクション内で。クエリを分割すると、オプティマイザが混乱することなくジョブを実行できる場合があります。
問題のスペースを少しでも減らすことができれば、パフォーマンスが大幅に向上します。そのテーブルのすべての行をチェックする必要があると確信していますか?
あなたが試してみたいと思うかもしれない他のことは、DELETE InsertTable FROM InsertTable INNER JOIN ExistingTable ON <Validation criteria>あなたの挿入の前です。ただし、走行距離は異なる場合があります
insert into customers
select *
from newcustomers
where customerid not in (select customerid
from customers)
..より効率的かもしれません。他の人が言ったように、検索フィールドにインデックスがあることを確認してください。