比较(估计)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)?
注意!以下问题不属于本主题:
- 如何为 table
定义主键
- 如何识别 table
中的重复项
P.S.
- 主要问题是关于性能比较。
- 解决方案改进是次要的。
set statistics io on;
都差不多
set statistics time on;
可以在每个 运行. 之后提供不同的结果
- 看不出执行计划有太大区别(但不专业)。
- 我有查询性能差异的感觉,但不是知识。
如果有人有知识请分享。 ;)
- 您能否具体说明一种解决方案肯定优于另一种解决方案,反之亦然的情况?
- 关于第 2 种方法与第 3 种方法:重复删除工作更快的地方 - 在
UNION
或 EXCEPT
/INTERSECT
之内?如果在 UNION
期间删除了重复项,EXCEPT
/INTERSECT
会再次搜索吗?
您应该测试您的数据。
但是没有其他信息,我希望第一个更好。每个人都在对整个 table 进行三组操作。首先,"intermediate" table 较小,因此我希望性能更好。
也就是说,UNION
/UNION ALL
将创建一个更大的 table(在第二个解决方案中),然后需要对其进行处理。
请注意,在 SQL 服务器中,EXCEPT
和 INTERSECT
也会删除重复项,这可能会增加额外的开销。
两个查询提供相同的结果。
如何定义性能更好的查询:
一个。执行前
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)?
注意!以下问题不属于本主题:
- 如何为 table 定义主键
- 如何识别 table 中的重复项
P.S.
- 主要问题是关于性能比较。
- 解决方案改进是次要的。
set statistics io on;
都差不多set statistics time on;
可以在每个 运行. 之后提供不同的结果
- 看不出执行计划有太大区别(但不专业)。
- 我有查询性能差异的感觉,但不是知识。 如果有人有知识请分享。 ;)
- 您能否具体说明一种解决方案肯定优于另一种解决方案,反之亦然的情况?
- 关于第 2 种方法与第 3 种方法:重复删除工作更快的地方 - 在
UNION
或EXCEPT
/INTERSECT
之内?如果在UNION
期间删除了重复项,EXCEPT
/INTERSECT
会再次搜索吗?
您应该测试您的数据。
但是没有其他信息,我希望第一个更好。每个人都在对整个 table 进行三组操作。首先,"intermediate" table 较小,因此我希望性能更好。
也就是说,UNION
/UNION ALL
将创建一个更大的 table(在第二个解决方案中),然后需要对其进行处理。
请注意,在 SQL 服务器中,EXCEPT
和 INTERSECT
也会删除重复项,这可能会增加额外的开销。