SQL - 改进NOT EXISTS查询性能

时间:2009-02-16 20:48:27

标签: sql sql-server performance where-clause not-exists

有没有办法可以改善这种SQL查询性能:

INSERT
INTO ...
WHERE NOT EXISTS(Validation...)

问题是当我的表中有很多数据(比如数百万行)时,WHERE NOT EXISTS子句的执行非常慢。我必须进行此验证,因为我无法插入重复数据。

我使用SQLServer 2005

THX

7 个答案:

答案 0 :(得分:11)

确保您在索引列上进行搜索,而不管理这些列中的数据(如子字符串等)。

答案 1 :(得分:11)

在我的头顶,你可以尝试类似的东西:

 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

答案 2 :(得分:5)

尝试用左外连接替换NOT EXISTS,它有时在大型数据集中表现更好。

答案 3 :(得分:0)

注意有关索引的其他答案。如果您有良好的索引,NOT EXISTS通常会非常快。

但我 对您描述的陈述存在性能问题。我习惯使用的一种方法是使用临时表作为候选值,执行DELETE FROM ... WHERE EXISTS(...),然后盲目地插入剩余部分。当然,在交易中,避免竞争条件。拆分查询有时允许优化器完成其工作而不会感到困惑。

答案 4 :(得分:0)

如果你可以减少你的问题空间,那么你将获得很多性能。您是否完全确定需要检查该表中的每一行?

您可能想要尝试的另一件事是在插入之前DELETE InsertTable FROM InsertTable INNER JOIN ExistingTable ON <Validation criteria>。但是,您的里程可能会有所不同

答案 5 :(得分:0)

insert into customers 
select * 
from newcustomers 
where customerid not in (select customerid 
                         from customers)

..可能更有效率。正如其他人所说,请确保您在任何查找字段上都有索引。

答案 6 :(得分:0)

外部申请倾向于为我工作...

代替:

from t1
where not exists (select 1 from t2 where t1.something=t2.something)

我将使用:

from t1
outer apply (
    select top 1 1 as found from t2 where t1.something=t2.something
) t2f
where t2f.found is null