[英]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
This is my query joining 4 tables. 这是我的查询联接4表。 the sfxr table holds refrence to the ship and bill table.
sfxr表保存对ship和bill表的引用。 need to use it to get bill data using ship data.
需要使用它来获取使用船舶数据的账单数据。 The above query runs forever.
上面的查询将永远运行。 Can it be optimized or needs to be done through the application code.
可以优化它还是需要通过应用程序代码来完成。
First clean up 第一次清理
convert the parameters to dates 将参数转换为日期
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')
Drop the NOT IN the values do not start with 'C' so it's dedundant. 删除NOT IN的值不能以'C'开头,因此它是多余的。 Use the between as Bob suggested.
使用鲍勃建议的之间。
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')
For us to be able to help you we need you to do the following: 为了使我们能够为您提供帮助,我们需要您执行以下操作:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.