2017-08-30 6 views
0

Ich versuche, meine Oracle-Skript auf Toad abzufragen, bekam aber langsame Antwort, etwa 4-8 Sekunden.ORACLE Query Count Langsam

Das Skript Abfrage ist über Zahl, unten ist mein:

SELECT COUNT(*) 
AS TOTALS 
FROM(SELECT S.BADGEID_FK, S.SHIFT, S.STATUS, E.BADGEID, E.FIRSTNAME, E.LASTNAME 
    FROM WA_SEW_TBL_EMP_INFO S, WA_GA_TBL_EMPLOYEES E 
    WHERE S.BADGEID_FK = E.BADGEID AND S.STATUS = 'Attend' AND S.SHIFT = 'Morning' 
     AND S.BADGEID_FK NOT IN(SELECT EMPID 
           FROM WA_SEW_TBL_RESULTS 
           WHERE TO_CHAR(SYSTEM_DATE, 'YYYY-MM-DD') = '2017-08-30' 
           AND TO_CHAR(SYSTEM_DATE, 'HH24:MI') >= '07:00' 
           AND TO_CHAR(SYSTEM_DATE, 'HH24:MI') <= '19:29')) 

ich Indizierung zu einem gewissen Spalte hinzuzufügen versucht, aber es gibt keinen Effekt.

Gibt es eine Möglichkeit, diese Abfrage zu tun? oder irgendeinen Trick?

+0

Meinst du wirklich <= 19:29 oder meinst du <19:30? – xQbert

+0

@xQbert - wie geschrieben, sind sie gleichwertig: das OP schneidet im Wesentlichen den Sekundenanteil ab. – mathguy

+0

@all Danke für die Beantwortung. Ich habe jetzt das Ergebnis. –

Antwort

2

Dieser Teil:

WHERE TO_CHAR(SYSTEM_DATE, 'YYYY-MM-DD') = '2017-08-30' 
           AND TO_CHAR(SYSTEM_DATE, 'HH24:MI') >= '07:00' 
           AND TO_CHAR(SYSTEM_DATE, 'HH24:MI') <= '19:29' 

besser wäre, neu geschrieben als:

WHERE SYSTEM_DATE between to_date ('2017-08-30 07:00:00', 'YYYY-MM-DD HH24:MI:SS') 
         and to_date ('2017-08-30 19:29:59', 'YYYY-MM-DD HH24:MI:SS') 

, dass jeder Index auf SYSTEM_DATE ermöglichen wird, verwendet werden.

+1

Dies ist nicht ganz gleichbedeutend mit der ursprünglichen Abfrage ... die ursprüngliche Version erlaubte die Zeit, 19:29:55 zu sein, da sie nur Stunde und Minute extrahierte. Bei Datumsvergleichen sollte dies auf <19:30 geändert werden. – mathguy

+0

(... welche Beobachtung, offensichtlich, flog direkt über den Kopf des OP ...) – mathguy

+0

@mathguy Danke Ich habe meine Antwort geändert, um die gleichen Ergebnisse wie OPs Abfrage zurückzugeben. –

1

Ich konnte die meisten Unterabfragen eliminieren, aber ich bin mir nicht sicher, dass dies zu einem Leistungsgewinn ohne Kenntnis der Tabellengröße und Indizes führen wird. Durch die Veröffentlichung des Ausführungsplans können wir besser nachvollziehen, wo sich Ihr Engpass befindet.

SELECT count(*) as Totals 
FROM WA_SEW_TBL_EMP_INFO S 
INNER JOIN WA_GA_TBL_EMPLOYEES E 
    ON S.BADGEID_FK = E.BADGEID 
LEFT JOIN WA_SEW_TBL_RESULTS R 
    ON S.BADGEID_FK =R.EMPID 
    -- Others already addressed what needs to happen here. 
    AND TO_CHAR(R.SYSTEM_DATE, 'YYYY-MM-DD') = '2017-08-30' 
    AND TO_CHAR(R.SYSTEM_DATE,'HH24:MI') >= '07:00' 
    AND TO_CHAR(R.SYSTEM_DATE,'HH24:MI') <= '19:29' 
WHERE S.STATUS = 'Attend' 
    AND S.SHIFT = 'Morning' 
    AND R.EmpID is null 
2

Ein offensichtlicher Verdächtiger ist Ihre Datumsmanipulation in der IN Liste. Sie sollten niemals Funktionen rund um Daten verwenden - das bringt Oracle die Fähigkeit ab, einen Index für die Datumsspalte zu verwenden.

Statt:

where system_date >= to_date('2017-08-30 07:00', 'yyyy-mm-dd hh24:mi') 
    and system_date < to_date('2017-08-30 19:30', 'yyyy-mm-dd hh24:mi') 

(die zweite Ungleichung ist streng, wenn Sie ex wollen clude 07.30 scharf).