2016-07-15 10 views
-1

Wie kann die Abfragezeit (über 1h) unten optimiert werden? Ich habe nur Zugriff auf Tabellenansichten, ohne die Möglichkeit, Abfragepläne zu überprüfen und Indizes anzuzeigen. Ich kann nur die Abfrage-Notation ändern. Tabelle 'c' hat mehr als 3,2 Milliarden Datensätze.Oracle Abfragezeitoptimierung

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

Bitte schreiben Plan Abfrage mit predicats –

+0

ich keinen Zugang in db haben Abfrage-Plan zu prüfen :( – user3183215

+0

Ich nehme an Indizes sind auf a.ID, c.ID, c0.HDB_START. – user3183215

Antwort

0

raten hier ein bisschen. Wie oben erwähnt, ohne Abfrageplan und Indizes, die Sie erraten, und ich habe Ihre Tabellen oder Daten nicht. aber ist die Abfrage unter derselben Abfrage? sieht aus wie sie 2 Tabellen sind Sie äußere Beitritt co und a ist das richtig? coo und c sind Anfragen auf Co? kannst du also mal gegen co gehen?

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 Minuten, vielen Dank :) – user3183215

+0

Wenn Sie nicht sicher sind, ob die gepostete Abfrage tatsächlich die gleiche Abfrage wie Ihr Original ist, können Sie die erste Abfrage MINUS die zweite Abfrage Union alle zweite Abfrage MINUS die erste Abfrage und stellen Sie sicher nichts kommt zurück, aber es wird für immer laufen. Ich habe das schon vorher gemacht, als ich nicht positiv war, nachdem ich eine Abfrage optimiert hatte, indem ich sie neu schrieb, wenn sie tatsächlich die gleichen Daten zog. –

+0

Die Abfrage ist die gleiche vs alte und schneller. – user3183215