北方的_南先生 2019-09-25 17:25 采纳率: 0%
浏览 397
已结题

在表pms_actinst_orgemp中group by三个字段,查询某些字段里符合一定条件的数据的总量,将这些数据分页,一次取10条。只用到这一张表,oracle11g,一千四百多万数据。现在查询一分半左右,要降到20s以内。

SOL:
SELECT TMP_PAGE.*, ROWNUM ROW_ID
FROM (select upper(t.participant) participant,
max(t.partiname) partiname,
max(t.provinceorgname) provinceorgname,
max(t.cityorgname) cityorgname,
count(t.participant) total, --已完成工作量
count(case
when t.rollbackflag >= 1 then
1
end) as is_rollback, --被回退工作量
count(case
when (to_char(t.startTime, 'HH24') >= 8 and
to_char(t.startTime, 'HH24') <= 18 and
(to_char(startTime, 'D') != '7' and
to_char(startTime, 'D') != '1')) then
1
end) as workdaytotal8to18, -- 工作日8:00-18:00活动数量
count(case
when ((to_char(t.startTime, 'HH24') < 8 or
to_char(t.startTime, 'HH24') > 18) and
(to_char(startTime, 'D') != '7' and
to_char(startTime, 'D') != '1')) then
1
end) as workdaytotalnot8to18, -- 工作日不在8:00-18:00活动数量
count(case
when (to_char(startTime, 'D') = '7' or
to_char(startTime, 'D') = '1') then
1
end) as unworkdaytotal --非工作时间处理活动数量
from pms_actinst_orgemp t
WHERE t.currentstate = 7
and t.starttime > to_date('2019-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
group by upper(t.participant), t.provinceorg, t.cityorg) TMP_PAGE
WHERE ROWNUM <= 10

图片说明

执行计划:

图片说明

自己尝试过:1.优化SQL:①将rollbackflag>1改成rollbackflag>'1',因为rollbackflag为字符串型。
②将select *改成select +所有字段名③将(to_char(startTime, 'D') != '7' and
to_char(startTime, 'D') != '1')中的不等于1或7改为between2 and 6因为字段值为只能是1-7中的一个2.建立索引 ①给group by三个字段分别建立单个索引②给group by三个字段建立组合索引③给SQL中用到的字段都建立单个索引。最终效果都不明显,大家有啥好办法达到需求?

  • 写回答

2条回答 默认 最新

  • dabocaiqq 2019-09-25 22:16
    关注
    评论

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况