一、CASE问题

   同事反馈用系统管理员账号登录查询很快,但是用普通员工的账号登录查询却卡死,SQL语句查询需要5分钟。第一时间接到CASE后摸清情况得知,系统管理员账号是没有数据的。而普通帐号有几十万行数据。

二、解决方法

首选查到这个执行操作的SQL语句执行计划。

一次db file sequential read 事件处理

执行计划没有发现什么异常。

先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 格式化这个跟踪日志解析一下:

一次db file sequential read 事件处理

由此我们看到这个NESTED LOOPS 嵌套循环消耗时间异常。于是我把这个索引进行在线重建了一下。发现效果好一点,查询SQL由原来的5分钟变成2分钟左右,但是这个还是不能接受的。于是接着看跟踪日志。

一次db file sequential read 事件处理

一次db file sequential read 事件处理

发现主要是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语句:

一次db file sequential read 事件处理

最终优化后SQL查询时间0.187秒。

相关文章: