首页 > 解决方案 > 比较(估计的)查询/解决方案性能。返回两个表(堆)之间的差异

问题描述

两个查询提供相同的结果。

如何定义性能更好的查询:

一个。执行前

湾。执行后

?

示例 1:以下查询返回两个堆之间的差异

第一种方法

(   SELECT * FROM TABLE1    EXCEPT
    SELECT * FROM TABLE2
)   
UNION ALL
(   SELECT * FROM TABLE2    EXCEPT
    SELECT * FROM TABLE1
) 
;

第二种方法(和第三种方法UNION ALL):

(   SELECT * FROM TABLE1    UNION --ALL --?!
    SELECT * FROM TABLE2
)   
EXCEPT
(   SELECT * FROM TABLE2    INTERSECT
    SELECT * FROM TABLE1
) 
;

哪种方法更好?

还是取决于(优点/缺点)?

示例 2:几乎相同,但另外返回源表列

第一种方法

SELECT 'TABLE1-ONLY' AS SRC, T1.*
FROM (
      SELECT * from TABLE1
      EXCEPT
      SELECT * from TABLE2
      ) AS T1
UNION ALL
SELECT 'TABLE2-ONLY' AS SRC, T2.*
FROM (
      SELECT * from TABLE2
      EXCEPT
      SELECT * from TABLE1
      ) AS T2
;

第二种方法(和第三种方法UNION ALL):

(   SELECT SRC='TABLE1-ONLY', * FROM TABLE1    UNION --ALL --?!
    SELECT SRC='TABLE2-ONLY', * FROM TABLE2
)   
EXCEPT
(   SELECT * FROM (select SRC='TABLE1-ONLY' UNION ALL 
                   select SRC='TABLE2-ONLY'
                  ) s 
                 ,(SELECT * FROM TABLE2     INTERSECT
                   SELECT * FROM TABLE1
                  ) i
);

哪种方法更好?

还是取决于(优点/缺点)?

注意!以下问题不在本主题范围内:

  1. 如何为表定义主键
  2. 如何识别表中的重复项

附言

  1. 主要问题是关于性能比较。
  2. 解决方案改进是次要的。
  3. set statistics io on;几乎一样。
  4. set statistics time on;每次运行后可以提供不同的结果。
  5. 在执行计划上看不出很大的不同(但在这个领域并不专业)。
  6. 我有一种查询性能差异的感觉,但不是知识。如果有人有知识,请分享。;)
  7. 您能否指定一种解决方案绝对优于另一种解决方案的场景,反之亦然?
  8. 关于第 2 种与第 3 种方法:在哪里重复删除工作得更快 - 在 / 内UNION还是在EXCEPT/内INTERSECT?如果在 期间删除了重复项UNION,是否会EXCEPT/INTERSECT再次搜索它?

标签: sqlsql-serversql-execution-planintersectexcept

解决方案


你应该测试你的数据。

但如果没有其他信息,我希望第一个会更好。每个都在整个表上做三个集合操作。首先,“中间”表更小,所以我期待更好的性能。

也就是说,UNION/UNION ALL将创建一个更大的表(在第二个解决方案中),然后需要对其进行处理。

请注意,在 SQL Server 中,EXCEPT还要INTERSECT删除重复项,这可能会增加额外的开销。


推荐阅读