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,左右连接等等,如果表数据量很大的话,你这个语句性能不好是预料中的事情。如果你这条语句无法优化,建议从调整表结构角度考虑
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2018-04-13
(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的执行计划,看看有什么可以改进的

本回答被提问者和网友采纳
第2个回答  2013-10-14
你这样查询应该慢吧,用连接查询看看,用连接查询代替子查询
第3个回答  2013-10-14
你这么多子查询,那么多连接,能快么?看看能不能优化下写法吧,该建索引的建索引。

oracle 查询的sql语句特别慢,是什么原因,是or特别慢吗,用什么优化,急...
把查询计划的内容发出来,你这一大堆代码谁能看出来啥啊。看你的代码这么长,条件那么多,语句用了函数,很多低效的or,not in等操作,另外还用了group by,order by,左右连接等等,如果表数据量很大的话,你这个语句性能不好是预料中的事情。如果你这条语句无法优化,建议从调整表结构角度考虑 ...

oracle sql 用什么可以替代or,这样查询特别慢
可以用union,比如select 内容 from user where name='张三' union select 内容 from user where name='李四',相当于select 内容 from user where name='张三' or name='李四' ,因为union会用到索引,不知道你这个表有没有索引,表的数据多大?

oracle数据库运行sql很卡很慢很顿,看等待事件都是cursor:pin s on...
这种情况可能由于OS操作系统的实际情况或者使用Resource Manager而引起。需要配合AWR中的Host CPU、Instance CPu一起看。 已经被KILLED的SESSION仍持有Mutex 当session正持有Mutex,而其对应的Process被强制KILL掉, 则直到PMON彻底清理掉该Dead Process并释放Mutex,其他session才能不再等待。 诊断该类问题,最...

如何分析为什么oracle速度慢
7,增加服务器 CPU个数;但是必须明白并行处理串行处理更需要资源例如内存.使用并行还是串行程是MsSQL自动评估选择的.单个任务分解成多个任务,就可以在处理器上运行.例如耽搁查询的排序,连接,扫描和GROUP BY字句同时执行,SQL SERVER根据系统的负载情况决定最优的并行等级,复杂的需要消耗大量的CPU的查询最适合并行处理.但是...

oracle sql 查询我使用自已写的函数查询很快,加了函数做条件就很慢...
慢是因为 对于 几十万条记录左右,你那个 test(a) 函数, 需要执行 很多次, 每行执行一次, 然后判断 LIKE '%123%'至于:select a,b, test(a) c from demo; --只这样查很快 我估计你使用的是 PLSQL Developer。查询的时候, 默认是查询第一页, 因此很快。因为只显示少部分...

Oracle 视图查询有的时候很慢,有的时候查询很快
这种情况有很多可能性,首先,你的服务器的负载情况会影响到你的数据读取速度的,如果数据库服务器执行的进程过多,会导致查询速度下降很多。另外,第一次执行同一个SQL的时候,都会比较慢一些,再次执行的时候,由于数据等还在内存内,会速度快很多。再者,在Oracle中,有共享SQL语句的机制,在第一次解析...

oracle 查询语句 第一次执行很快,第二次执行就很慢 。是什么原因
大多数情况下,用oracle, 第一次查询慢, 第二次查询肯定比第二次查询快对吧,但对于这种情况,第一次查询快, 以后查询慢。Cardinality Feedback基数反馈, 是版本11.2中引入的关于SQL 性能优化的新特性,该特性主要针对 统计信息陈旧、无直方图或虽然有直方图但仍基数计算不准确的情况, Cardinality...

ORACLE优化SQL语句,提高效率(2)
假如索引是建立在多个列上 只有在他的第一个列(leading column)被where子句引用时 优化器才会选择使用该索引 这也是一条简单而重要的规则 当仅引用索引的第二个列时 优化器使用了全表扫描而忽略了索引 ( )用UNION ALL 替换UNION ( 假如有可能的话)当SQL语句需要UNION两个查询结果集合时 这两个...

oracle数据库约200W数据查询非常慢,查询需要10几秒,经常查询超时,这个...
先确认一下问题,是代码操作的查询还是连接oracle工具操作的查询,优化大数据量主要先从三两方式入手,第一,建索引,这个有讲究:主要是针于你的查询条件(即是在where后面的字段建索引,有几个条件字段就建几个,如果有组合条件查询,那建联合索引)。第二点,就是按表中的数据,进行表分区,如按时间...

SQL Server 视图查询慢,如何优化?请不要复制粘贴谢谢
慢的原因在:【DELETE_FLAG IN ('R', 'X', 'U', 'D')】,查询中出现【in】的话数据库会解析成下面这个样子去执行。【DELETE_FLAG='R' OR DELETE_FLAG='X' OR DELETE_FLAG='U' OR DELETE_FLAG='D'】而数据库一旦使用了【OR】条件做查询的话,索引就不会用到了,因此就会造成查询过...

相似回答