繁体   English   中英

oracle SQL查询优化

[英]oracle SQL query Optimization

SELECT SHIP.SHIPID, SHIP.SHIPID_SFX, SHIP.DATE_SOURCE, SHIP.DATE_SHIP, SHIP.WT_TOTAL, SHIP.LINK, SHIP.CARR,
MBSH.MB_ID, MBSH.MB_ID_SFX
, FBIL.DATE_BILL, FBIL.DATE_CHECK, FBIL.STATUS
FROM SHIP,
     MBSH,
    SFXR,
     FBIL
WHERE SHIP.DATE_SOURCE Between '2012/08/31' And '2012/09/28' 
AND SUBSTR(SHIP.CARR,1,1) = 'C'
AND substr(SHIP.CARR,2,1) between '0' and '9' 
And SHIP.CARR not in ('7','41','11','15')
AND SHIP.MOVE_MB Is Null 
AND SHIP.SOURCE03='JDE'
And MBSH.MB_SHIPID_SFX = SHIP.SHIPID_SFX
AND MBSH.MB_SHIPID = SHIP.SHIPID
And SFXR.SHIPID = SHIP.SHIPID
And SFXR.SHIPID_SFX = SHIP.SHIPID_SFX
And SFXR.CARR = SHIP.CARR
And FBIL.BILL_ID = SFXR.BILL_ID
And FBIL.BILL_BD = SFXR.BILL_BD

这是我的查询联接4表。 sfxr表保存对ship和bill表的引用。 需要使用它来获取使用船舶数据的账单数据。 上面的查询将永远运行。 可以优化它还是需要通过应用程序代码来完成。

第一次清理

将参数转换为日期

SHIP.DATE_SOURCE Between '2012/08/31' And '2012/09/28'    
SHIP.DATE_SOURCE Between to_date('2012/08/31','YYYY/MM/DD') And to_date('2012/09/28','YYYY/MM/DD')

删除NOT IN的值不能以'C'开头,因此它是多余的。 使用鲍勃建议的之间。

AND SUBSTR(SHIP.CARR,1,1) = 'C'    
AND substr(SHIP.CARR,2,1) between '0' and '9'       
-- AND SHIP.CARR not in ('7','41','11','15') 

为了使我们能够为您提供帮助,我们需要您执行以下操作:

  1. 在数据库上运行统计信息(maybee使用直方图)。
  2. 向我们显示您在表上定义的索引
  3. 然后给我们看一个解释计划

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM