[英]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.