有没有办法可以改善这种SQL查询性能:
INSERT
INTO ...
WHERE NOT EXISTS(Validation...)
问题是当我的表中有很多数据(比如数百万行)时,WHERE NOT EXISTS
子句的执行非常慢。我必须进行此验证,因为我无法插入重复数据。
我使用SQLServer 2005
THX
答案 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