Oracle 等待事件(二)

2014-11-24 12:25:24 · 作者: · 浏览: 4
V$SQLTEXT视图就可以捕获这些SESSION正在执行的SQL语句。

重要等待事件

1. Db file sequential read(数据文件顺序读取)

Db file sequential read是个非常常见的I/O相关的等待事件,通常显示与单个数据块相关的读取操作,在大多数情况下,读取一个索引块或者通过索引读取一个数据块时,都会记录这个等待。

这个等待事件有3个参数P1、P2、P3,其中P1代表Oracle要读取的文件的绝对文件号,P2代表Oracle从这个文件中开始读取的起始数据块块号,P3代表读取的Block数量,通常这个值为1,表明是单个Block被读取。

SQL> select name,parameter1,parameter2,parameter3 from v$event_name where name='db file sequential read';

NAME PARAMETER1 PARAMETER2 PARAMETER3

------------------------------ ---------- ---------- ----------

db file sequential read file# block# blocks

如果这个等待事件比较显著,可能表示在多表连接中,表的连接顺序存在问题,可能没有正确的使用驱动表;或者可能索引的使用存在问题,并非索引总是最好的选择。

在大多数情况下,通过索引可以更为快速地获取记录,所以对于一个编码规范、调整良好的数据库,这个等待事件很大通常是正常的。但是在很多情况下,使用索引并不是最佳的选择,比如读取较大表中大量的数据,全表扫描可能会明显快于索引扫描,所以在开发中就应该注意,对于这样的查询应该避免使用索引扫描。

从Oracle 9iR2开始,Oracle引入了段级统计信息收集的新特性,收集的统计信息共有11类:

Select * from v$segstat_name;

在Oracle 10gR2中,这类统计信息增加为15个。

对于CBO模式下的数据库,应当及时收集统计信息,使SQL可以选择正确的执行计划,避免因为统计信息陈旧而导致的执行错误等。

2. Db file scattered read(数据文件离散读取)

SQL> select * from v$event_name where name='db file scattered read';

EVENT# EVENT_ID NAME PARAMETER1 PARAMETER2 PARAMETER3

---------- ---------- ------------------------- ---------- ---------- ----------

188 506183215 db file scattered read file# block# blocks

从V$EVENT_NAME视图可以看到,该事件有3个参数,分别代表文件号、起始数据块号、数据块的数量。

起始数据块号加上数据块的数量,这意味着Oracle session正在等待多块连续读操作的完成。这个操作可能与全表扫描(Full table scan)或者快速全索引扫描(Index Fast Full Scan)的连续读取相关。根据经验,通常大量的db file scattered read等待可能意味着应用问题或者索引缺失。

在实际环境的诊断过程中,可以通过v$session_wait视图发现session的等待,再结合其他视图找到存在问题的SQL等根本原因,从而从根本上解决问题。当这个等待事件比较显著时,也可结合v$session_longops动态性能视图来进行诊断,该视图记录了长时间(运行时间超过6秒的)运行的事务。

从Oracle 9i开始,Oracle新增加了一个视图V$SQL_PLAN用于记录当前系统Library Cache中SQL语句的执行计划,可以通过这个视图找到存在问题的SQL语句。

通过V$SQL_PLAN视图,可以获得大量有用的信息:

获得全表扫描的对象

Select distinct object_name,object_owner from v$sql_plan p Where p.operation='TABLE ACCESS'and p.options='FULL' and object_owner='SYS';

获得全索引扫描的对象

Select distinct object_name,object_owner from v$sql_plan p Where p.operation='INDEX' and p.options='FULL SCAN' and object_owner='SYS';

通过V$SQL_PLAN和V$SQLTEXT联合,获得全表扫描的SQL语句

Select sql_text from v$sqltext t,v$sql_plan p Where t.hash_value=p.hash_value And p.operation='TABLE ACCESS' And p.options='FULL' Order by p.hash_value,t.piece;

3. Direct path read/write(直接路径读/写)

直接路径读通常发生在Oracle直接读取数据到PGA时,这个读取不需要经过SGA。直接路径读等待事件的3个参数分别是:file#(指绝对文件号)、first block#和block数量。

这类读取通常在以下情况被使用:

磁盘排序IO操作

并行查询从属进程

预读操作

最常见的是第一种情况。在DSS系统中,存在大量的Direct path read是很正常的,但是在OLTP系统中,通常显著的直接路径读都意味着系统应用存在问题,从而导致大量的磁盘排序读取操作。

直接路径写通常发生在Oracle直接从PGA写数据到数据文件或临时文件,这个写操作可以绕过SGA。直接路径写等待事件的3个参数分别是:file#(指绝对文件号)、first block#和block数量。

这类读取通常在以下情况被使用:

直接路径加载

并行DML操作

磁盘排序

对未缓存的“LOB”段的写入,随后会记录为direct path write(lob)等待

最常见的直接路径写,多数因为磁盘排序导致。对于这一写入等待,应该找到I/O操作最为频繁的数据文件(如果有过多的排序操作,很有可能就是临时文件),分散负载,加快其写入操作。

如果系统存在过多的磁盘排序,会导致临时表空间操作频繁,对于这种情况,可以考虑为不同用户分配不同的临时表空间,使用多个临时文件,写入不同磁盘或者裸设备,从而降低竞争提高性能。

日志文件相关等待

SQL> select name from v$event_name where name like '%log%';

NAME

----------------------------------------------------------------

log switch/archive

log file sequential read

log file single write

log file parallel write

log buffer space

log file