SQL存在中NOT存在和LEFT JOIN之间的性能差异

时间:2014-07-27 12:34:04

标签: sql sql-server

我可以通过以下查询来检查目标表中的记录现有。

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 个答案:

答案 0 :(得分:5)

一般去NOT EXISTS

如果任一方的列可以为空(并且具有您可能想要的语义),则more efficientNOT IN

左连接... Null有时会使用后面的过滤器进行整个连接以保留与is null匹配的行,效率会低得多。

以下是一个证明这一点的例子。请注意NOT IN计划中的额外运算符以及外部联接计划如何爆发以创建超过100万行的联接进入过滤器。

不存在

enter image description here

外部加入... NULL

enter image description here

不在

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