sql - 为什么“OR”运算符比 oracle 中的 union 慢
问题描述
有谁知道为什么“OR”运算符比 ORACLE 中的 union 慢。
我有这样的查询:
Select
O.Order_number,
DA. ID,
DA.Country,
Sum(amount) Amount
from
Order O
left join Delivery_Address DA on
O.ID = DA.order_Id
left join TBL_A on
TBL_A.DA_ID = DA.ID
enter code here
< ... Left joining another 10 tables>
enter code here
Left join Transaction Tr on
TR.Order_id = Order.id
where
DA.Country = 'USA'
OR
Tr.transaction_Date between to_date('20200701','yyyymmdd') and sysdate
前 50 条记录需要 200 秒。
Select
O.Order_number,
DA.ID,
DA.Country,
Sum(amount) Amount
from
Order O
left join Delivery_Address DA on
O.ID = DA.order_Id
left join TBL_A on
TBL_A.DA_ID = DA.ID
enter code here
< ... Left joining another 10 tables>
enter code here
Left join Transaction Tr on
TR.Order_id = Order.id
where
DA.Country = 'USA'
union
Select
O.Order_number,
DA. ID,
DA.Country,
Sum(amount) Amount
from
Order O
left join Delivery_Address DA on
O.ID = DA.order_Id
left join TBL_A on
TBL_A.DA_ID = DA.ID
enter code here
< ... Left joining another 10 tables>
enter code here
Left join Transaction Tr on
TR.Order_id = Order.id
where
Tr.transaction_Date between to_date('20200701','yyyymmdd') and sysdate
对于前 50 条记录,第二个查询需要 13 秒。
Transaction 表中的 transaction_date 已编入索引,但 Country 列未编入索引。
有人知道吗?
解决方案
OR
允许独立评估每个子查询。
您将不得不查看执行计划以了解实际发生的情况。但是,在第一个子查询查询中,da.country
使用的索引可能正在使用索引。而在第二个中,tr.transaction_date
。
推荐阅读
- tensorflow - Tensorflow 对象检测 API 中的错误检测
- python - Python/Windows:使用 UNC 路径打开文件在由普通用户帐户运行时成功,但在由本地系统运行时失败并显示 [ERRNO 22]
- azure - 如何使用 REST API 在 azure devops 中创建环境
- c# - ASP.NET Core TestHost 集成测试“System.ArgumentNullException:字符串引用未设置为字符串的实例。”
- react-native - 用 svg 反应原生自定义动画标签栏
- javascript - 如何在 HTML 中使用复选框添加多个下拉列表?
- c++ - 在开罗绘制图像时的颜色差异
- flutter - 无法推断类型参数“T”
- python - 索引输出结果
- gdb - 在 GDB 中设置观察点