簡體   English   中英

SQL - 改進NOT EXISTS查詢性能

[英]SQL - improve NOT EXISTS query performance

有沒有辦法可以改善這種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通常會非常快。

但是我你所描述的陳述存在性能問題。 我習慣使用的一種方法是使用臨時表作為候選值,執行DELETE FROM ... WHERE EXISTS(...),然后盲目地插入剩余部分。 當然,在交易中,避免競爭條件。 拆分查詢有時允許優化器完成其工作而不會感到困惑。

如果你可以減少你的問題空間,那么你將獲得大量的性能。 您是否確定需要檢查該表中的每一行?

您可能想要嘗試的另一件事是插入之前的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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM