oracle 查询的sql语句特别慢,是啥原因,是or特别慢吗,用啥优化,急急急!!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 查询的sql语句特别慢,是啥原因,是or特别慢吗,用啥优化,急急急!!!相关的知识,希望对你有一定的参考价值。

select c.costsno,
c.coststype,
e.empno
from costsClaims c,
yjsemployee e,
Department dt,
project p,
yjsmeeting m,
(select cd.costsno,
NVL(sum(cd.Vehicleamount), 0) vehicleamount,
from costsclaimdetail cd, costsclaims c
where c.company = 1000
and c.costsno = cd.costsno(+)
group by cd.costsno) cd,
(select ca.costsno, sum(nvl(ca.amount, 0)) amount
from cardsdetail ca, costsclaims co
where ca.company = 1000
and ca.coststype = 'T'
and co.costsno = ca.costsno(+)
group by ca.costsno) am
where c.empno = e.empno(+)
and c.deptno = dt.Deptno(+)
and c.allprojectno = p.projectno(+)
and c.meetingno = m.meetingno(+)
and c.costsno = cd.costsno(+)
and c.costsno = am.costsno(+)
and exists (select 'x'
from appuser tuser
where tuser.userid = c.createdby
and tuser.company = 1000)
and c.company = 1000
and c.createddate >= TO_DATE('2013-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
and c.createddate <= TO_DATE('2013-12-31 23:59:59', 'yyyy-mm-dd hh24:mi:ss')
and ((c.createdby = 'liuqi' and c.state = 'return') or
(c.state = 'submit' and
(c.verfiedby = 'liuqi' or c.verfiedby = 'null')) or
c.state = 'verfied' or c.state = 'pass' or
c.state = 'passtwo' or c.state = 'passtwono' or
c.state = 'payamount' or c.state = 'payamounttwo' or
c.state = 'noinburse' or c.state = 'noinbursetwo')
and (c.coststype not in ('T', 'M'))
ORDER BY c.datesubmitted desc, c.costsno desc

把查询计划的内容发出来,你这一大堆代码谁能看出来啥啊。看你的代码这么长,条件那么多,语句用了函数,很多低效的or,not in等操作,另外还用了group by,order by,左右连接等等,如果表数据量很大的话,你这个语句性能不好是预料中的事情。如果你这条语句无法优化,建议从调整表结构角度考虑 参考技术A (select cd.costsno,
NVL(sum(cd.Vehicleamount), 0) vehicleamount,
from costsclaimdetail cd, costsclaims c
where c.company = 1000
and c.costsno = cd.costsno(+)
group by cd.costsno) cd,
对这个子查询2个问题:
1、为啥这里要用左连接呢?难道cd与c里的costsno不一样多?
2、外边又有costsClaims c,而且还是 c.costsno = cd.costsno(+),你不觉得重复么?
建议不要这个子查询,直接在最外一层costsclaimdetail与costsclaims连接并group by
另1个子查询类似
exists (select 'x'
from appuser tuser
where tuser.userid = c.createdby
and tuser.company = 1000)
这个子查询可以改成costsClaims与appuser做连接
另外,不知道为什么这么多左连接,左连接比连接要慢追问

那两个子查询是主要为了计算出金额。
(c.verfiedby = 'liuqi' or c.verfiedby = 'null')) or
c.state = 'verfied' .......省略..or c.state = 'noinbursetwo')
没有这一段话的数据是3000多条,还挺快,有这一段话的数据是500多条,非常慢

追答

那你把除了这个条件的做为一个子查询,然后对这个子查询做下这个where
不过costsclaimdetail与costsclaims还是多做一次left join,而且2个子查询算出来的值外面又没用,搞不懂

追问

外面用了,只是没有粘上来,有什么解决办法吗,这个sql语句不是我写的,现在数据太慢了,要让我改,有很多地方我也不清楚

追答

这个还是得靠你自己改了,我也不知道业务逻辑,以及表间关系

追问

恩,我又测试了一下,这个sql语句运行的不是特别慢,就是分页的sql语句特别慢,加了where rownum <= 20 需要10秒钟,去掉不到1秒就能运行完

追答

你应该看看这句sql的执行计划,看看有什么可以改进的

本回答被提问者和网友采纳
参考技术B 你这样查询应该慢吧,用连接查询看看,用连接查询代替子查询 参考技术C 你这么多子查询,那么多连接,能快么?看看能不能优化下写法吧,该建索引的建索引。

高手,执行insert into select 语句慢,一般是啥原因造成的了

执行insert into select 语句慢,一般是什么原因造成的了

: 两条你要分开独立执行,或者两条一起执行不能把代码贴在一起! 而且你也没贴代码,不好判断
参考技术A 在values子句中不能有子查询,这样就可以了:
insert
into
voterecord(ip,topicnum)
select
'"
+
ip
+
"',id
from
topic
where
[content]='"
+
topic
+
"'
实际生成的语句应该这样:
insert
into
voterecord(ip,topicnum)
select
'192.168.1.1',id
from
topic
where
[content]='123'
不过,为保证不发生错误,最好在子查询中加入top
1
子句或max()函数等,保证子查询记录是一条
insert
into
voterecord(ip,topicnum)
select
'192.168.1.1',max(id)
from
topic
where
[content]='123'

以上是关于oracle 查询的sql语句特别慢,是啥原因,是or特别慢吗,用啥优化,急急急!!!的主要内容,如果未能解决你的问题,请参考以下文章

vscode 占用cpu特别高是啥原因

多表级联删除表数据特别慢

oracle SQL查询时提示 用户数据中的connect by 循环 报错是啥原因?

为啥NATIVE FOR ORACLE查询速度慢

MySQL 执行慢原因分析

SQLITE查询速度很慢是啥原因呢,两个语句差异明显,请高人解释