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

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

问题是,当我在我的表中的许多数据(如行万美元),如果很慢的WHERE NOT EXISTS条款的执行。我必须这样做,因为验证我不能插入重复数据。

我使用的SQLServer 2005

THX

有帮助吗?

解决方案

请确保您正在搜索的索引列,没有操纵这些列中的数据(如串等)

其他提示

关闭我的头顶,你可以尝试这样的:

 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归因
不隶属于 StackOverflow
scroll top