2017-08-30 137 views
0

我想查詢我的Oracle腳本上的蟾蜍,但得到緩慢的響應,約4-8秒。ORACLE查詢計數緩慢

腳本查詢是約數,下面是我的:

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')) 

我試圖索引添加一些列,但沒有效果。

有沒有辦法做這個查詢?或任何詭計?

+0

你真的是指<= 19:29還是你的意思是<19:30? – xQbert

+0

@xQbert - 正如所寫,它們是等價的:OP基本上截斷了秒部分。 – mathguy

+0

@all謝謝你的回答。我現在得到了結果。 –

回答

2

這一部分:

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' 

會更好改寫爲:

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') 

這將允許在SYSTEM_DATE任何索引使用。

+1

這不完全等同於原始查詢......原始版本允許時間爲19:29:55,因爲它只是提取小時和分鐘。在日期比較中,應該將其改爲<19:30。 – mathguy

+0

(......顯然,這個觀察結果直接飛過了OP的頭......) – mathguy

+0

@mathguy謝謝我修改了我的答案,以便返回與OP的查詢相同的結果。 –

1

我能夠消除大多數子查詢,但我不確定它會導致性能增益w/o知道表大小和索引。發佈執行計劃將幫助我們瞭解您的瓶頸所在。

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

一個明顯的嫌疑犯是你在IN列表中的日期操縱。你永遠不應該在日期周圍使用函數 - 這會導致Oracle在日期列中使用索引的任何能力。

相反:

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') 

(第二個不等式是嚴格的,如果你想 CLUDE下午7:30銳利)。