ORACLE查询计数慢

时间:2017-08-30 13:17:39

标签: oracle

我试图在Toad上查询我的Oracle脚本,但响应速度很慢,大约4-8秒。

脚本查询是关于count的,下面是我的:

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

我尝试将索引添加到某些列,但没有效果。

有没有办法进行查询?或任何技巧?

3 个答案:

答案 0 :(得分: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 :(得分: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')

(第二个不平等是严格的,如果你想包括晚上7点30分。)

答案 2 :(得分:1)

我能够消除大多数子查询,但我不确定它是否会在不知道表大小和索引的情况下获得性能提升。发布执行计划将有助于我们了解您的瓶颈所在。

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