比较(估计)query/solution 性能。 Return 两个表(堆)之间的差异

Compare (estimated) query/solution perfomance. Return differences between two tables (heaps)

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

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

一个。执行前

b。执行后

?

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

1st approach:

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

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

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

哪种方法更好?

或者取决于 (Advantages/Disadvantages)?

例2:几乎相同,但增加了returns源table列

1st approach:

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
;

第二种方法(和第 3 种 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
);

哪种方法更好?

或者取决于 (Advantages/Disadvantages)?

注意!以下问题不属于本主题:

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

P.S.

  1. 主要问题是关于性能比较。
  2. 解决方案改进是次要的。
  3. set statistics io on;都差不多
  4. set statistics time on; 可以在每个 运行.
  5. 之后提供不同的结果
  6. 看不出执行计划有太大区别(但不专业)。
  7. 我有查询性能差异的感觉,但不是知识。 如果有人有知识请分享。 ;)
  8. 您能否具体说明一种解决方案肯定优于另一种解决方案,反之亦然的情况?
  9. 关于第 2 种方法与第 3 种方法:重复删除工作更快的地方 - 在 UNIONEXCEPT/INTERSECT 之内?如果在 UNION 期间删除了重复项,EXCEPT/INTERSECT 会再次搜索吗?

您应该测试您的数据。

但是没有其他信息,我希望第一个更好。每个人都在对整个 table 进行三组操作。首先,"intermediate" table 较小,因此我希望性能更好。

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

请注意,在 SQL 服务器中,EXCEPTINTERSECT 也会删除重复项,这可能会增加额外的开销。