简体   繁体   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

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: 为了使我们能够为您提供帮助,我们需要您执行以下操作:

  1. run statistic on the database (maybee use histograms). 在数据库上运行统计信息(maybee使用直方图)。
  2. Show us the indexes you have defined on the table 向我们显示您在表上定义的索引
  3. Then show us an explain plan 然后给我们看一个解释计划

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

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