0
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 表。需要使用它来获取使用船舶数据的账单数据。上面的查询永远运行。是否可以优化或需要通过应用程序代码来完成。

4

1 回答 1

0

首先清理

将参数转换为日期

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”开头,因此它是多余的。按照 Bob 的建议使用中间值。

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. 在数据库上运行统计信息(也许使用直方图)。
  2. 向我们展示您在表上定义的索引
  3. 然后向我们展示一个解释计划
于 2012-10-08T21:19:07.823 回答