选择最佳SQL查询

时间:2015-05-28 07:14:00

标签: sql sql-server-2008

您好我是MS SQL的新手,请原谅我,如果我问其他更有经验的人非常明显的事情。我可以编写查询以多种方式获取数据以获取相同的数据。现在我有两个SQL查询X和Y,如下所示

(查询1)

select column1, column2, column3
from 
Table1 a
inner join 
Table2 b on a.column1=b.column1
where Condition1 and condition2

EXCEPT

(select column1, column2, column3
from 
Table1 a
inner join 
Table2 b on a.column1=b.column1
where Condition3
)

(查询2)

select column1, column2, column3
from 
Table1 a
inner join 
Table2 b on a.column1=b.column1
where Condition1 and condition2

And column1 Not in 
(select column1
from 
Table1 a
inner join 
Table2 b on a.column1=b.column1
where Condition3
)

这两者都花费相似的时间,估计的子树成本也有最小的差异。我不确定哪一个是更好的查询,为什么。

3 个答案:

答案 0 :(得分:2)

EXCEPT 比较两个完整选择的所有(成对)列,并返回左结果集中不存在于右侧结果集中的不同行,而 NOT IN 根据 NOT EXISTS 关键字后面的子查询中WHERE子句中指定的条件比较两个或多个表,并执行相同但不返回不同的结果集。

EXCEPT 会返回不同的行,而 NOT IN 则不会返回不同的值。如果您分析执行计划,您会发现 EXCEPT 查询 更慢 而不是 NOT IN

EXCEPT中的独特排序运算符占总执行时间的65%左右。

根据此Link,可以使用 NOT EXISTS 重写 EXCEPT 。 (除了所有可以使用 ROW_NUMBER NOT EXISTS 重写。)

有关详细信息,请参阅LINK

答案 1 :(得分:1)

第二个似乎在第一个上略有优势。 第二个中的子查询仅获取一列,即column1。 如果该列被索引,则sql引擎以精确度和速度进行查询将会好得多。

答案 2 :(得分:0)

如果您修改下面的where条件怎么办?

idea.config.path