繁体   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