質問

私は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)

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top