2016-07-15 118 views
-1

如何優化下面的查詢時間(超過1小時)?我只能訪問表視圖,無法檢查查詢計劃和視圖索引。我只能改變查詢符號。表'c'已經獲得了超過32億的記錄。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

請張貼與predicats –

+0

計劃查詢我在DB沒有獲得檢查查詢計劃:( – user3183215

+0

我想索引的a.ID,c.ID,c0.HDB_START。 – user3183215

回答

0

在這裏猜測一下。如上所述,沒有查詢計劃和您正在猜測的索引,並且我沒有您的表或數據。但在相同查詢下方的查詢是?看起來他們是2表,你是外部連接co和a是否正確? coo和c是在公司的頂部查詢?所以你可以反對一次嗎?

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第二個查詢union所有第二個查詢MINUS第一個查詢並確保沒有東西會回來,但它會運行永遠。我之前做過這件事的時候,當我通過重寫優化一個查詢後,如果它實際上拉動了相同的數據,我並不積極。 –

+0

該查詢與舊版本相同,速度更快。 – user3183215