动态性能视图
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学习动态性能表第四篇-(1)-V$SQLTEXT
本视图包括Shared pool中SQL语句的完整文本,一条SQL语句可能分成多个块被保存于多个记录内。
注:V$SQLAREA只包括头1000个字符。
V$SQLTEXT中的常用列
HASH_VALUE:SQL语句的Hash值
ADDRESS:sql语句在SGA中的地址
SQL_TEXT:SQL文本。
PIECE:SQL语句块的序号
V$SQLTEXT中的连接列
Column View Joined Column(s)
HASH_VALUE, ADDRESS V$SQL, V$SESSION HASH_VALUE, ADDRESS HASH_VALUE. ADDRESS V$SESSION SQL_HASH_VALUE, SQL_ADDRESS
示例:已知hash_value:3111103299,查询sql语句:
select * from v$sqltext
where hash_value='3111103299'
order by piece
等待事件有两种类型:空闲事件(idle event)与非空闲事件(non-idle event)。
空闲事件主要指oracle正在等待某种工作,常见的空闲等待事件有:client message、null event、pipe get、pmon/smon timer、rdbms rpc message及sql*net等。
非空闲等待事件:buffer busy waits、db file scattered read、db file sequential read、enqueue、free buffer waits、latch free、log file sync、log file paralle write等。
有人要问什么是瓶颈?当我们熟悉了系统的等待事件,就可以把握问题的关键,并且能够用相应的方法去处理阻塞系统的瓶颈,请注意一定不要随便的进行优化,否则很可能使结果雪上加霜,我们可以通过v$system_event获取系统总的等待情况,然后通过v$session_event查看系统中session的等待情况,最后通过v$session_wait定位瓶颈对象。v$session_wait是会话级的,它包含session的实时信息,最重要的是:它显示了等待事件与相应资源的更深入信息,可确定出产生瓶颈的类型及其对象。
v$session_wait的p1、p2、p3告诉我们等待事件的具体含义,如果wait event是db file scattered read,p1=file_id/p2=block_id/p3=blocks,然后通过dba_extents即可确定出热点对象;如果是latch free 的话,p2为闩锁号,它指向的是v$latch。
◆求等待事件及其对应的latch
◆求等待事件及其热点对象
◆结合以上两条sql,同时显示latch及热点对象(注释:速度较慢)
◆如果是非空闲等待事件,通过等待会话的sid可以求出该会话在执行的sql
注释:DBA通过等待事件找出系统中消耗资源较严重的sql是常用的手段,唯一的缺点就是过程比较烦琐,由于session是动态的、瞬息万变、不可捕获,当你想捕获时,该session可能已经释放,但这种捕获是很有针对性的;也可以通过对v$sql或v$sqlarea进行过滤,找出存在性能问题的sql,长时间地对v$sql进行监控,并对捕获的sql进行优化处理,可以在很大程度上解决系统的性能问题。
等待事件
Oracle的等待事件是衡量Oracle运行状况的重要依据及指标。
等待事件的概念是在Oracle7.0.1.2中引入的,大致有100个等待事件。在Oracle 8.0中这个数目增加到了大约150个,在Oracle8i中大约有200个事件,在Oracle9i中大约有360个等待事件。
主要有两种类别的等待事件,即空闲(idle)等待事件和非空闲(non-idle)等待事件。空闲事件指Oracle正等待某种工作,在诊断和优化数据库的时候,我们不用过多注意这部分事件。
常见的空闲事件有:
• dispatcher tim er
• lock element cle anup
• Null event
• parallel query dequeue wait
• parallel query idle wait - Slaves
• pipe get
• PL/SQL lock tim er
• pm on tim er- pm on
• rdbms ipc m essage
• slave wait
• sm on timer
• SQL*Net break/reset to client
• SQL*Net m essage from client
• SQL*Net m ess age to client
• SQL*Net m ore data to client
• virtual circuit status
• client m essage
非空闲等待事件专门针对Oracle的活动,指数据库任务或应用运行过程中发生的等待,这些等待事件是我们在调整数据库的时候应该关注与研究的。
一些常见的非空闲等待事件有:
• db file scattered read
• db file sequential read
• buffer busy waits
• free buffer waits
• enqueue
• latch free
• log file parallel write
• log file sync
1. db file scattered read-DB 文件分散读取
这种情况通常显示与全表扫描相关的等待。
当数据库进行全表扫时,基于性能的考虑,数据会分散(scattered)读入Buffer Cache。如果这个等待事件比较显著,可能说明对于某些全表扫描的表,没有创建索引或者没有创建合适的索引,我们可能需要检查这些数据表已确定是否进行了正确的设置。
然而这个等待事件不一定意味着性能低下,在某些条件下Oracle 会主动使用全表扫描来替换索引扫描以提高性能,这和访问的数据量有关,在CBO 下Oracle 会进行更为智能的选择,在RBO 下Oracle 更倾向于使用索引。
因为全表扫描被置于LRU(Least Recently Used,最近最少适用)列表的冷端(cold end),对于频繁访问的较小的数据表,可以选择把他们Cache 到内存中,以避免反复读取。
当这个等待事件比较显著时,可以结合v$session_longops 动态性能视图来进行诊断,该视图中记录了长时间(运行时间超过6 秒的)运行的事物,可能很多是全表扫描操作(不管怎样,这部分信息都是值得我们注意的)。并且通过v$session_longops的字段SQL_HASH_VALUE与V$SQL的字段HASH_VALUE查出具体的SQL语句,即
select a.sql_text from v$sqlarea a,v$session_longops b where
a.HASH_VALUE=
b.SQL_HASH_VALUE;
2. db file sequential read-DB 文件顺序读取。
这一事件通常显示与单个数据块相关的读取操作(如索引读取)。
如果这个等待事件比较显著,可能表示在多表连接中,表的连接顺序存在问题,可能没有正确的使用驱动表;或者可能说明不加选择地进行索引。
在大多数情况下我们说,通过索引可以更为快速的获取记录,所以对于一个编码规范、调整良好的数据库,这个等待很大是很正常的。但是在很多情况下,使用索引并不是最佳的