首页 > 数据库 > Oracle > 深入浅出等待事件和性能诊断记载03
近段时间在忙于年会舞蹈和过年回家的事情,主要是火车票难买,公司的年假又批得迟,搞得俺这些漂泊在外的人纠结啊,学习习惯也有点懒散了,收心!
先摘要记录几个等待事件
Db file sequential read(数据文件顺序读取)是个非常常见的I/O相关的等待事件,通常显示于单个数据块相关读取操作,读取索引块或者通过索引块读取数据块时,可能会记录这个等待事件。
SQL> col name for a20
SQL> col parameter1 for a20
SQL> col parameter2 for a20
SQL> col parameter3 for a20
SQL> col wait_class for a20
SQL> select name,parameter1,parameter2,parameter3,wait_class from v$event_name where name='db file sequential read';
NAME PARAMETER1 PARAMETER2 PARAMETER3 WAIT_CLASS
-------------------- -------------------- -------------------- -------------------- --------------------
db file sequential r file# block# blocks User I/O
ead
可以通过v$event_name视图发现db file sequential read等待事件的三个参数分别是绝对文件号 文件中开始读取的起始数据块块号以及读取的block数量,在oracle 10g中db file sequential read被划分为user I/O等待事件类。
这个等待事件很可能是:因为多表连接中,表的连接顺序存在问题,没有选择正确的驱动表;或者索引使用并不高效,不是最佳选择,例如读取表中大量数据时,由于索引是单块I/O,读取大量数据选择性并不高,
从oracle 9IR2开始,新增了阶级统计信息收集的新特性v$segment_statistics视图,在oracle 10g中v$segstat_statistics视图收集段级统计信息由oracle9IR2的11类变为15类,可以通过v$segstat_name视图来获取具体统计信息类别,可以查询物理读取显著的索引段或表段,是否采取重建索引 划分分区 存储参数等手段降低其I/O。sql语句消耗在I/O 解析 network三大方面。
Db file scattered read数据文件离散读取,和db file sequential read顺序读取参数意义一样,当这个等待事件比较显著时,很多都是采取了全表扫描,这里可以通过视图v$session_longops动态性能视图记录运行时间超过6秒的事务。
从oracle 9I后,oracle又新增视图v$sql_plan记录当前系统library_cache中sql语句执行计划,例如获得全表扫描的对象和全索引扫描的对象
执行计划是全表扫描的前4行
SQL> select object_owner,object_name,hash_value,address from v$sql_plan where operation='TABLE ACCESS'
2 and options='FULL' and rownum<5;
OBJECT_OWNER OBJECT_NAME HASH_VALUE ADDRESS
------------------------------ ------------------------------ ---------- --------
SYSMAN MGMT_DB_TABLESPACES_ECM 3776970919 1B266B14
SYSMAN MGMT_PERFORMANCE_NAMES 1396966618 25CE1408
执行计划是全索引扫描的前4行
SQL> select object_owner,object_name,hash_value,address from v$sql_plan where operation='INDEX'
2 and options='FULL SCAN' and rownum<5;
OBJECT_OWNER OBJECT_NAME HASH_VALUE ADDRESS
------------------------------ ------------------------------ ---------- --------
SYSTEM LOGMNR_SESSION_PK 1503528053 1AFF0F98
SYS SCHEDULER$_WINGRP_MEMBER_PK 593239587 1B1908A8
SYS SCHEDULER$_WINGRP_MEMBER_PK 593239587 1B1908A8
SYS SCHEDULER$_WINGRP_MEMBER_PK 593239587 1B1908A8
通过v$sql_plan的hash_value和address联合v$sql_text得到完整的sql语句,进而对sql语句进行进一步调优等。
SQL> select sql_text,cost from v$sqltext a,v$sql_plan b
2 where a.hash_value=b.hash_value and b.operation='TABLE ACCESS'
3 and b.options='FULL' and b.object_owner='XIAOYU';
SQL_TEXT COST
---------------------------------------------------------------- ----------
select * from test18 order by object_id desc 71
select count(*) from test01 2
SELECT * FROM test01 2
SELECT * FROM test18 71
这里梳理一下如何通过等待事件找到相应的sql语句和其执行计划然后对其进行进一步调整。
1 通过v$session_wait视图的等待事件找到sid
2 联合v$session视图通过sid找到sql_address和sql_hash_value
3 联合v$sqltext和v$sql_plan通过address和hash_value进而捕捉到完整的sql语句和执行计划
如果是oracle 10g由于v$session视图中已经添加了event字段,相应的等待事件已经联合到v$session中。
Direct path read/write直接路径读/写
Direct path read通常发生在oracle直接读数据到PGA时,这个读取不需要SGA,直接路径读等待事件的三个参数分别是:file#,file block#和block数量,这类等待事件被归于user I/O
这类读取通常在以下情况:
磁盘排序I/O操作
并行查询从属进程
预读操作
dss系统中,存在大量direct path read是正常的,但是OLTP系统中,通常显著的direct path read代表着系统存在大量的磁盘排序读取操作
direct path write通常发生在oracle直接从PGA写数据到数据文件或临时文件,期间绕过了SGA,direct path write的三个参数和direct path read一样,该等待事件同样被归于user I/O一类
这类写入通常在:
直接路径加载(sql语句直接路径加载,或者sqlldr利用direct=y绕过sga直接从pga到数据文件)
并行dml操作(并行插入时,就会采取绕过sga直接高水位插入)
磁盘排序
对未缓存的lob段写入,会记录为direct path write(lob)等待(对于eygle提出的关于lob等待)还是有颇多疑惑最为常见的是因为磁盘排序引起的。排序是很消耗资源的,而且也建议排序在pga中进行,因为涉及到磁盘效率就会下降很多,对于磁盘排序引起的direct path write等待,应该找到I/O操作频繁的数据文件,很多情况都是临时文件,分散负载加快磁盘I/O,如果是临时表空间引起的也可以采用临时表空间组的方式分散I/O负载。
在oracle 10g中区分特定的对于临时文件的直接读取操作,direct path read temp和direct path write temp
SQL> col name for a40
SQL> select name from v$event_name where name like 'direct%';
NAME
----------------------------------------
direct path read
direct path read temp
direct path write
direct path write temp
[@more@]来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25362835/viewspace-1057083/ ,如需转载,请注明出处,否则将追究法律责任。