一、CASE问题
同事反馈用系统管理员账号登录查询很快,但是用普通员工的账号登录查询却卡死,SQL语句查询需要5分钟。第一时间接到CASE后摸清情况得知,系统管理员账号是没有数据的。而普通帐号有几十万行数据。
二、解决方法
首选查到这个执行操作的SQL语句执行计划。
执行计划没有发现什么异常。
先debug 跟踪一下sql语句:
alter session set events '10046 trace name context forever, level 12';
query this sql;
alter session set events '10046 trace name context off';
通过tkprof 格式化这个跟踪日志解析一下:
由此我们看到这个NESTED LOOPS 嵌套循环消耗时间异常。于是我把这个索引进行在线重建了一下。发现效果好一点,查询SQL由原来的5分钟变成2分钟左右,但是这个还是不能接受的。于是接着看跟踪日志。
发现主要是db file sequential read 这个等待事件导致了系统查询卡死。
看到这个事件后我立马检查了一下SQL语句代码,发现语句中确实有排序问题。这时基本上可以判断是临时表空间不足了。
我接着查询了临时表空间。结果发现可用空间为0兆。
排查到这里问题就解决了,增加临时表空间。
alter tablespace temp add datafile '/u01/app/oradata/orcl/orcl/temp02.dbf' size 5000m autoextend on next 100m maxsize 25000m;
查询一下业务SQL语句:
最终优化后SQL查询时间0.187秒。