2017-08-30 113 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锐利)。