sql - 比较(估计的)查询/解决方案性能。返回两个表(堆)之间的差异
问题描述
两个查询提供相同的结果。
如何定义性能更好的查询:
一个。执行前
湾。执行后
?
示例 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
);
哪种方法更好?
还是取决于(优点/缺点)?
注意!以下问题不在本主题范围内:
- 如何为表定义主键
- 如何识别表中的重复项
附言
- 主要问题是关于性能比较。
- 解决方案改进是次要的。
set statistics io on;
几乎一样。set statistics time on;
每次运行后可以提供不同的结果。- 在执行计划上看不出很大的不同(但在这个领域并不专业)。
- 我有一种查询性能差异的感觉,但不是知识。如果有人有知识,请分享。;)
- 您能否指定一种解决方案绝对优于另一种解决方案的场景,反之亦然?
- 关于第 2 种与第 3 种方法:在哪里重复删除工作得更快 - 在 / 内
UNION
还是在EXCEPT
/内INTERSECT
?如果在 期间删除了重复项UNION
,是否会EXCEPT
/INTERSECT
再次搜索它?
解决方案
你应该测试你的数据。
但如果没有其他信息,我希望第一个会更好。每个都在整个表上做三个集合操作。首先,“中间”表更小,所以我期待更好的性能。
也就是说,UNION
/UNION ALL
将创建一个更大的表(在第二个解决方案中),然后需要对其进行处理。
请注意,在 SQL Server 中,EXCEPT
还要INTERSECT
删除重复项,这可能会增加额外的开销。
推荐阅读
- android - Android 管理 API - 应用程序退出自助服务终端模式
- database - Go中的弹性搜索客户端无法索引多条记录
- python - 确保消息在主题之间保持一致的顺序
- python - 读取数据框中的 json 文件并将其转换回精确的 json
- python - 模块“thinc”没有属性“层”
- python - 在python中着色时间序列图
- diff - 如何在执行差异操作时忽略文件的时间戳
- javascript - 这是关于 javascript 动态创建的 div,它不在脚本标签中工作,而是在 HMTL 的正文标签中工作
- google-cloud-platform - 导入工作流 Google Cloud Build
- angular - 按钮单击后的角度单元测试 ng-template 触发器不起作用