SQL-提高不存在的查询性能

SQL-提高不存在的查询性能,sql,sql-server,performance,where-clause,not-exists,Sql,Sql Server,Performance,Where Clause,Not Exists,有什么方法可以提高这种SQL查询性能: INSERT INTO ... WHERE NOT EXISTS(Validation...) 问题是,当我的表中有许多数据(如百万行)时,WHERE NOT EXISTS子句的执行速度非常慢。我必须进行此验证,因为我无法插入重复的数据 我使用SQLServer2005 thx确保您正在搜索索引列,而不操纵这些列中的数据(如子字符串等)。请注意有关索引的其他答案。如果有好的索引,“不存在”通常相当快 但我对你所描述的陈述有绩效问题。我使用的一种方法是使用

有什么方法可以提高这种SQL查询性能:

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

我使用SQLServer2005


thx

确保您正在搜索索引列,而不操纵这些列中的数据(如子字符串等)。

请注意有关索引的其他答案。如果有好的索引,“不存在”通常相当快


但我对你所描述的陈述有绩效问题。我使用的一种方法是使用临时表作为候选值,执行从中删除。。。如果存在(…),则盲目插入剩余部分。当然,在事务内部是为了避免竞争条件。拆分查询有时可以让优化器在不混淆的情况下完成其工作。

尝试用左外部联接替换不存在的联接,它有时在大型数据集中的性能会更好。

如果您能够减少问题空间,那么您将获得大量性能。您是否绝对确定需要检查该表中的每一行


您可能需要尝试的另一件事是在插入之前从上的InsertTable内部联接ExistingTable中删除InsertTable。但是,您的里程数可能会有所不同,您可以尝试以下方法:

 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

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

外部应用往往对我有用

而不是:

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

是否从一个表插入另一个表?是的,但格式不同。例如,在表A中,日期是一个整数20070102,而在表B中,该表是一个日期时间。通常,如果您不存在,则可能有一种方法可以切换到使用EXISTS。。。可能需要一个额外的临时表,但它可能更快更有趣,我经常发现相反的情况。EXISTS将在找到的第一个匹配项时停止搜索,而联接将生成所有可能的匹配项。因此,存在应该更快。我认为。问题是,不存在总是会导致表扫描,而如果你小心使用连接,你可能只处理索引。ávio,我不认为不存在总是会导致表扫描。请看这篇文章:在我对一个有数百万行的表的测试中,这是迄今为止最快的解决方案。。。OP的选项持续几分钟,接受(ck)的答案持续几分钟,您的解决方案持续10秒(我在所有解决方案中使用正确的索引)
from t1
outer apply (
    select top 1 1 as found from t2 where t1.something=t2.something
) t2f
where t2f.found is null