首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ORACLE查询计数慢

ORACLE查询计数慢
EN

Stack Overflow用户
提问于 2017-08-30 13:17:38
回答 3查看 367关注 0票数 0

我试图在蟾蜍上查询我的Oracle脚本,但是得到了缓慢的响应,大约4-8秒。

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

代码语言:javascript
运行
复制
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'))

我试图将索引添加到某些列中,但没有任何效果。

有什么办法来做那个查询吗?或者有什么诡计?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-30 13:27:45

本部分:

代码语言:javascript
运行
复制
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'

最好改写为:

代码语言:javascript
运行
复制
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上的任何索引。

票数 2
EN

Stack Overflow用户

发布于 2017-08-30 13:28:39

一个明显的怀疑是您在IN列表中的日期操纵。您永远不要在日期周围使用函数--这会扼杀Oracle在date列上使用索引的任何能力。

相反:

代码语言:javascript
运行
复制
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')

(第二个不等式是严格的,如果您想ex会社7:30下午7:30尖利)。

票数 2
EN

Stack Overflow用户

发布于 2017-08-30 13:26:06

我能够消除大多数子查询,但我不确定它是否会提高性能,从而获得表大小和索引的w/o知识。发布执行计划将帮助我们了解您的瓶颈所在。

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45961564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档