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
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特别慢吗,用啥优化,急急急!!!的主要内容,如果未能解决你的问题,请参考以下文章