您好我是MS SQL的新手,请原谅我,如果我问其他更有经验的人非常明显的事情。我可以编写查询以多种方式获取数据以获取相同的数据。现在我有两个SQL查询X和Y,如下所示
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
)
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
)
这两者都花费相似的时间,估计的子树成本也有最小的差异。我不确定哪一个是更好的查询,为什么。
答案 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