SQL - 改善クエリのパフォーマンスをEXISTS、NOT
-
23-08-2019 - |
質問
私はSQLクエリのパフォーマンスのこの種を向上させることができます方法はあります:
INSERT
INTO ...
WHERE NOT EXISTS(Validation...)
私は(行の百万のように)私のテーブルで多くのデータを持っている場合、問題がWHERE NOT EXISTS
句の実行非常に遅い場合、です。私は、重複データを挿入することはできませんので、私はこの検証を行う必要があります。
私は
のSQLServer 2005を使用しますTHX
解決
あなたはそれらの列内のデータの無操作で、インデックス付きの列で検索していることを確認してください(ETCサブストリングのように。)
他のヒント
私の頭の上から、あなたのような何かを試すことができます:
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交換してみます。
インデックスに関する他の回答に注意してください。 EXISTS、NOTあなたは良いインデックスを持っている場合、一般的に非常に高速です。
しかし、私が持っているののあなたが記述のような文を使用してパフォーマンスの問題を持っていました。私はそれを回避するために使用されてきた一つの方法は、FROM DELETEを実行し、候補値のために一時テーブルを使用するように... WHERE(...)が存在し、その後、盲目的に残りを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)
..より効率的かもしれません。他の人が言ったように、あなたはどのルックアップフィールドにインデックスを持っていることを確認してください。