2016-07-15 13 views
-1

問合せ時間(1時間以上)を最適化する方法はありますか。私はクエリプランとインデックスを確認する可能性なしに、テーブルビューにのみアクセスできます。私は照会表記を変更することしかできません。テーブル 'c'は3,220億以上のレコードを持っています。Oracleの問合せ時間の最適化

SELECT 
a.APPLICATIONNUMBER,c.NEWSTATUSSYMBOL,c.MODDATE,c.NEXT_MODDATE 
FROM a 
LEFT JOIN 
(SELECT 
c000.ID,c000.NEWSTATUSSYMBOL,c000.MODDATE,c000.NEXT_MODDATE 
FROM 
(SELECT 
c00.ID,c00.NEWSTATUSSYMBOL,c00.MODDATE,LEAD(c00.MODDATE,1) OVER (ORDER BY c00.ID, c00.MODDATE) AS NEXT_MODDATE 
FROM 
(SELECT 
c0.ID,c0.STATUSSYMBOL,c0.NEWSTATUSSYMBOL,c0.MODDATE 
FROM c0 
WHERE (c0.STATUSSYMBOL in ('State1','State2','State3') OR c0.NEWSTATUSSYMBOL in ('State1','State2','State3'))                  
AND c0.TYPEID = 1 
AND c0.HDB_START >= '15/01/01' 
AND c0.HDB_LAST  = 'Y')c00 
)c000 
WHERE 
c000.NEWSTATUSSYMBOL in ('State1','State2','State3')) c 
ON a.ID = c.ID 

WHERE 
a.APPLICATIONNUMBER like 'P%' 
AND a.APPLICATIONSTATUSSYMBOL in ('State4','State5','State6') 
AND a.APPLICATIONDATE   >= to_timestamp('2015-01-01 00:00:01') 
AND a.MODIFIEDDATE >= to_timestamp('2016-07-04 00:00:01') 
AND a.MODIFIEDDATE <= to_timestamp('2016-07-10 23:59:59') 
AND a.HDB_LAST     = 'Y'; 
+0

は、私は、クエリプランをチェックするために:(私はインデックスがa.ID、c.ID上にあると仮定し –

+0

と計画クエリを投稿してください最適化。絵を変更するために車を速く動かすようなものです。エンジンを調整する必要があります。 – user3183215

+0

をデシベルでアクセスすることはできませんc0.HDB_START。 – user3183215

答えて

0

ここで少し推測します。前述のように、あなたが推測しているクエリプランやインデックスがなく、テーブルやデータがありません。同じクエリの下のクエリですか?彼らは2つのテーブルのように見えるあなたは外部に入社していると、それは正しいですか? cooとcはcoの上のクエリですか?あなたは一度共同に反対することができますか?

WITH t1 
    AS (SELECT ID, 
       STATUSSYMBOL, 
       NEWSTATUSSYMBOL, 
       MODDATE 
      FROM c0 
      WHERE  TYPEID = 1 
       AND HDB_START >= '15/01/01' 
       AND HDB_LAST = 'Y' 
       AND ( STATUSSYMBOL IN ('State1', 'State2', 'State3') 
        OR NEWSTATUSSYMBOL IN ('State1', 'State2', 'State3'))), 
    t2 
    AS (SELECT APPLICATIONNUMBER, ID 
      FROM a 
      WHERE  a.APPLICATIONNUMBER LIKE 'P%' 
       AND a.APPLICATIONSTATUSSYMBOL IN ('State4', 
                'State5', 
                'State6') 
       AND a.APPLICATIONDATE >= TO_TIMESTAMP ('2015-01-01 00:00:01') 
       AND a.MODIFIEDDATE >= TO_TIMESTAMP ('2016-07-04 00:00:01') 
       AND a.MODIFIEDDATE <= TO_TIMESTAMP ('2016-07-10 23:59:59') 
       AND a.HDB_LAST = 'Y') 
SELECT t2.APPLICATIONNUMBER, 
     t1.NEWSTATUSSYMBOL, 
     t1.MODDATE, 
     LEAD (t1.MODDATE, 1) OVER (ORDER BY t1.ID) AS NEXT_MODDATE 
    FROM t1 LEFT JOIN t2 ON t1.ID = t2.ID 
+0

40分、ありがとうございます:) – user3183215

+0

投稿されたクエリが実際に元のクエリと同じクエリであるかどうかわからない場合は、最初のクエリを実行できますMINUS 2番目のクエリUNIONすべて2番目のクエリMINUS最初のクエリ何も戻ってこないが、それは永遠に実行されます。以前は同じデータを取得していたのであれば、私はそれを書き直して最適化した後に正ではなかったのです。 –

+0

クエリーは古いクエリーと同じで、早いクエリーです。 – user3183215