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」で始まらないため、不要になります。ボブが提案したように、その間を使用してください。

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 に答える