为啥“OR”运算符比 oracle 中的 union 慢

Posted

技术标签:

【中文标题】为啥“OR”运算符比 oracle 中的 union 慢【英文标题】:why "OR" operator is slower than union in oracle为什么“OR”运算符比 oracle 中的 union 慢 【发布时间】:2021-02-05 01:51:56 【问题描述】:

有谁知道为什么“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 列未编入索引。

有人知道吗?

【问题讨论】:

【参考方案1】:

OR 允许独立评估每个子查询。

您必须查看执行计划才能了解实际情况。但是,在第一个子查询查询中,使用da.country 的索引可能正在使用索引。第二个是tr.transaction_date

【讨论】:

我检查了DA表确实没有被国家索引。 @ELeung 。 . .我应该清楚。这些是显而易见的优化,但可能还有其他优化。 知道了!谢谢!

以上是关于为啥“OR”运算符比 oracle 中的 union 慢的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Or子句

Oracle Or子句

为啥 UNION 比 OR 语句快 [重复]

HPCC-ECL 逻辑运算符 - 为啥 OR 不短路?

Oracle Or子句

为啥 MySQL BIT_OR() 返回的值与 PHP 位运算不同