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