SQL Server中NOT EXISTS和LEFT JOIN之间的性能差异

5
我可以使用以下查询语句来检查目标表中记录是否存在。
Select * 
From Table1
Where Column1 not in (select Column2 from Table2)

Select *
from Table1
left join Table2 where Table1.Column1 = Table2.Column2
Where Table2.IdColumn is Null

我想知道哪个查询性能更好。


1
http://sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join - Gordon Linoff
2
你已经检查了查询执行计划吗?- http://www.mssqltips.com/sqlservertutorial/2250/graphical-query-plan-tutorial/ - gmsantos
@Gidil。您需要找到一个SQL Server重复项,因为答案取决于优化器。 - Martin Smith
重新打开。这取决于实现方式。因此,这不是一个Teradata问题的重复。 - Martin Smith
1个回答

5

通常应该使用NOT EXISTS

如果两边的列可为空(并且您可能需要的是语义),则比NOT IN更高效,如此处所述。

左连接...空值有时会在稍后过滤保留匹配is null的行,并且效率可能大大降低。

下面是一个演示示例。NOT IN计划中有额外的运算符,而外连接计划则扩大以创建超过100万行的连接,最终进入过滤器。

Not Exists

enter image description here

Outer Join ... NULL

enter image description here

Not In

enter image description here

CREATE TABLE Table1 (
     IdColumn INT IDENTITY PRIMARY KEY,
     Column1  INT NULL,
     Filler   CHAR(8000) NULL,
     UNIQUE(Column1, IdColumn) );

CREATE TABLE Table2 (
     IdColumn INT IDENTITY PRIMARY KEY,
     Column2  INT NULL,
     Filler   CHAR(8000) NULL,
     UNIQUE(Column2, IdColumn) );

INSERT INTO Table2 (Column2)
OUTPUT      INSERTED.Column2
INTO Table1(Column1)
SELECT number % 5
FROM   master..spt_values

SELECT *
FROM   Table1 t1
WHERE  NOT EXISTS (SELECT *
                   FROM   Table2 t2
                   WHERE  t2.Column2 = t1.Column1)

SELECT *
FROM   Table1
WHERE  Column1 NOT IN (SELECT Column2
                       FROM   Table2)

SELECT Table1.*
FROM   Table1
       LEFT JOIN Table2
         ON Table1.Column1 = Table2.Column2
WHERE  Table2.IdColumn IS NULL

DROP TABLE Table1, Table2 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接