深入解析Oracle学习笔记(第九章)

等待事件  oracle7 开始引入

v$event_name 记录当前数据库支持的等待事件及其基本信息

desc v$event_name

p1  p2  p3  不同等待事件参数其意义不同

wait_class(等待事件分类)


空闲等待     非空闲等待(调整数据库的时候需要研究的)


v$system_wait_class  视图显示各类主要等待事件的等待时间和等待次数等信息。分类统计。


V$SESSION   视图记录的是数据库当前连接的Session信息。
V$SESSION_WAIT   视图记录的是当前数据库连接的活动Session正在等待的资源或
事件信息。
V$SYSTEM_EVENT  由于V$SESSION记录的是动态信息,和 Session 的生命周期相关,并不记录历史信
息, 所以 Oracle ᨀ供另外一个视图 V$SYSTEM_EVENT 来记录数据库自启动以来所有等待事
件的汇总信息。 通过 V$SYSTEM_EVENT 视图, 可以迅速地获得数据库运行的总体概况。


10g 开始 v$session_wait整合到v$session 中。还增加了blocking_session字段。10gR2又增加了sql_trace相关信息。

11gR1又增加了sql_exec_start  sql_exec_id  prev_exec_start  prev_exec_id等字段


v$session_event  同一会话在其整个周期等待事件的累积,因为v$session,v$session_wait都是动态变化的。和会话的生命周期相关。

v$system_event  数据库整体等待信息的累积。


v$event_histogram  同一等待事件,不同等待时长的柱状分布图。比如shared pool latch 10毫秒以内的等待有几次,200毫秒以上的等待有几次。


oracle 11g 实时sql监控   (通过在v$session中增加sql_exec_start等字段实现)

11g之前,某个操作超过6s,会被记录在v$session_longops视图中

11g开始,超过5s的CPU或者IO等操作,会被记录在v$sql_monitor视图中,还包含一些sql执行的统计信息,如buffer gets等。结合v$sql_plan_monitor视图可以进一步查询sql的执行计划等信息。每秒刷新一次,接近实时。sql执行完毕,信息不会被立即删除,而是会在这两个视图中保留1分钟。


根据session id获取当前session正在执行的sql语句:

SELECT sql_text FROM v$sqltext a
WHERE a.hash_value = (SELECT sql_hash_value FROM v$session b WHERE b.SID = '&sid')
ORDER BY piece ASC;


v$session_wait_history  记录session最近10次等待事件。可以查看该session过去某个时间所经历的等待事件,解决了现象消失后,无法获取发生问题时系统正在经历那些等待的问题。追溯。不是累积。
10g开始ASH  v$active_session_history 以v$session为基础,每秒采样一次,记录活动session等待信息,不活动的会话不记录。由10g新引入的后台进程MMNL完成。
ASH信息存储在shared pool内存中,存满了,需要的时候可以被覆盖。
oracle提供的ASH报告工具,可以以几分钟或者几小时或者几天为跨度,对数据库提供概要分析。


内存中记录的ASH的信息毕竟是有限的,为了保存历史数据,这些数据最终要写入磁盘。这些信息就是AWR信息。
oracle以固定的时间间隔(默认每小时一次)为其所有重要的统计信息和负载信息执行一次快照,并将这些信息保存在AWR中。这些信息在AWR中保留给定的时间(默认为一周),然后被清除。AWR采样工作由后台进程MMON每60分钟执行一次。ASH信息同样会被采样写出到AWR负载库。

虽然ASH buffers 被设计为保留 1 小时的信息,但是很多时候这个内存是不足够的,当ASH buffers 写满之后,另外一个后台进程 MMNL 将会主动将 ASH 信息写出。 由于数据量巨大, 把所有的 ASH 数据写到磁盘上是不可接受的。一般是在写到磁盘的时候过滤这个数据,写出的数据占采样数据的10%,写出时通过direct-path insert 完成,尽量减少日志生成,从而最小化数据库性能影响。

AWR报告  $ORACLE_HOME/rdbms/admin/awrrpt.sql
AWR比较报告   $ORACLE_HOME/rdbms/admin/awrddrpt.sql


AWR信息的导入导出   awrextr.sql   awrload.sql

oracle 10g   ADDM


db file sequential read(数据文件顺序读取),与单个数据块相关的读取操作。大多数情况下是读取一个索引块或者通过索引读取一个数据块。
如果此等待事件比较显著,可能是在多表连接中,表的连接顺序存在问题,驱动表选择错误。或者使用索引并非总是最好的选择。
但是在一个编码规范,调整良好的数据库中,这个等待事件很大通常是正常的。——————定期的数据整理和空间回收是必须的。


db file scattered read  离散读,将存储上连续的数据块离散的读取到多个不连续的内存位置(并发,性能考虑),通常是多块读。  DB_FILE_MULTIBLOCK_COUNT
应用问题,或者索引缺失。


direct path read/write 直接路径读写。直接路径读通常发生在oracle直接读数据到进程PGA,而不经过SGA。通常是磁盘排序IO,在DSS系统中常见,OLTP中意味着应用有问题。   直接路径写通常发生在直接从PGA写数据到数据文件或临时文件,绕过SGA。直接路径加载,并行DML,磁盘排序等。
存在过多的磁盘排序,会导致临时表空间操作频繁。

重要性能指标:内存排序率  in-memory-sort ratio  = sort(memory)/ sort(disk) + sort(memory)
9i之前,增加sort_area_size,9i开始,增加P_A_T,避免磁盘排序。同时检查应用,避免过度排序。
并行操作也会direct path read/write。但并行不一定带来性能提升。

10g开始  direct path read/write temp


日志文件相关等待:
log file switch   日志切换,在此期间所有DML处于停顿状态,直至切换完成
两个子事件   log file switch(archiving needed)   归档未完成,磁盘IO,log_archive_max_processes。 
                       log file switch (checkpoint incomplete)脏数据没写完,不能覆盖日志文件,DBWR。


log file sync 用户提交或回滚数据,LGWR将重做由缓冲写入重做日志的过程。LGWR写出太慢,或者提交过于频繁(LGWR过度激活,系统产生redo很多,但每次写的较少)。


log file single write 写日志文件头块相关,通常发生在日志切换或增加新的组成员期间。

log file parallel write 从log buffer写redo到日志文件,主要指常规操作(相对于log file sync的commit操作)。

log buffer space 数据库产生日志的速度比LGWR的写出速度快,或者日志切换慢发生等待。通常表明log buffer设置过小,考虑增大buffer大小或者增加日志文件大小。或者磁盘IO出问题。



enqueue(队列等待) 一种保护共享资源的锁定机制。排队机制,FIFO。
10g之前,是一组锁定事件的集合。
10g之后,对于队列等待进行了细分。
oracle的锁按类型可以分为排它锁(X)和共享锁(S)。

oracle通过enqueue等待来记录锁定,通过latch free等待事件来记录闩。


最重要,最常见的锁定:TM  、  TX
TX:事务锁,在行级获得。每行都存在一个锁定为(lb-Lock Byte) ,用于判断该记录是否被锁定,同时在数据块的头部存在一个称为ITL的结构,用于记录事务等信息。只有排他模式,没有共享模式。
TM:表级锁,可以通过手工发出lock命令获得,或者通过DML操作以及select for update获得,表级锁可以防止其他进程对表加X排他锁,防止在对数据修改时,其他任务通过DDL来修改表结构或者执行truncate、drop等操作。

当执行DML操作室,首先加TM锁,如果能获得锁定,则继续加TX事务锁。

最常见的锁定:MR与AE
MR:介质恢复锁(media recovery),用户保护数据库文件,使得文件在数据库打开,表空间online时不能执行恢复。
AE:11g开始,每个登录数据库的会话都会获得一个AE锁。

ST:空间事务锁,用于空间管理和字典管理的表空间的区间分配。

latch free(闩锁释放):
低级排队机制(串行),用于保护SGA中共享内存结构。快速获取释放的内存锁,用于防止共享内存被多个用户同时访问。
v$latch  视图记录不同类型latch统计信息
按获取和等待方式不同进行分类:willing-to-wait (愿意等待类型)  、     immediate(立即类型)
willing-to-wait  :如果所请求的latch不能立即得到,则等待一段很短时间再请求,一直重复此过程直到获得latch。
immediate:所请求的latch不能立即得到,进程不再等待,继续执行下去。

gets  、  misses 、 sleeps、  immediate_gets 、  immediate_misses
获得         等待           休眠           立即获得                         立即模式不成功


willing-to-wait (愿意等待类型)模式时,如果没有获得latch,且系统存在多个CPU,则进程围绕该latch进行自旋(spin),自旋的过程中,进程会一直持有CPU。如果直接采用sleep的方式,引起的上下文切换会非常昂贵。

immediate类型的latch通常是因为存在多个可用的latch,比如常见的redo copy latch。另外一个原因是latch有level的概念。
10g开始,latch被细分。

10g开始引入mutex机制,来代替传统的latch机制。更轻量,所需指令数更少,占用空间更小。使用更少的CPU资源获得更好的性能。







你可能感兴趣的:(深入解析Oracle学习笔记(第九章))