CLASS COUNT TIME ------------------ ---------- ---------- data block 453 6686 undo header 391 1126 undo block 172 3
latch free: latch释放 latch 是一种低级排队机制,用于保护SGA 中共享内存结构。 latch就像是一种快速地被获取和释放的内存锁。latch用于防止共享内存结构被多个用户同时访问。如果latch不可用,就会记录latch释放失败(latch free miss)。 有两种与闩有关的类型: ■ 立刻。 ■ 可以等待。 假如一个进程试图在立刻模式下获得闩,而该闩已经被另外一个进程所持有,如果该闩不能立刻可用的话,那么该进程就不会为获得该闩而等待。它将继续执行另一个操作。 大多数latch 问题都与以下操作相关: 没有很好的是用绑定变量(library cache latch)、重作生成问题(redo allocation latch)、缓冲存储器竞争问题(cache buffers LRU chain),以及buffer cache中的存在"热点"块(cache buffers chain)。 通常我们说,如果想设计一个失败的系统,不考虑绑定变量,这一个条件就够了,对于异构性极强的系统,不使用绑定变量的后果是极其严重的。 另外也有一些latch 等待与bug 有关,应当关注Metalink 相关bug 的公布及补丁的发布。 当latch miss ratios大于0.5%时,就应当研究这一问题。 Oracle 的 latch 机制是竞争,其处理类似于网络里的CSMA/CD,所有用户进程争夺latch,对于愿意等待类型(willing-to-wait)的latch,如果一个进程在第一次尝试中没有获得latch,那么它会等待并且再尝试一次,如果经过_spin_count 次争夺不能获得latch, 然后该进程转入睡眠状态,持续一段指定长度的时间,然后再次醒来,按顺序重复以前的步骤.在8i/9i 中默认值是 _spin_count=2000。 如果SQL语句不能调整,在8.1.6版本以上,Oracle提供了一个新的初始化参数: CURSOR_SHARING,可以通过设置CURSOR_SHARING = force 在服务器端强制绑定变量。设置该参数可能会带来一定的副作用,对于Java的程序,有相关的bug,具体应用应该关注Metalink的bug公告。
enqueue enqueue 是一种保护共享资源的锁定机制。该锁定机制保护共享资源,如记录中的数据,以避免两个人在同一时间更新同一数据。enqueue 包括一个排队机制,即FIFO(先进先出)排队机制。 Enqueue 等待常见的有ST、HW 、TX 、TM 等 ST enqueue 用于空间管理和字典管理的表空间(DMT)的分配。对于支持LMT 的版本,可以考虑使用本地管理表空间,对于Oracle8i,因为相关bug 不要把临时表空间设置为LMT. 或者考虑预分配一定数量的区。 HW enqueue 指段的高水位标记相关等待;手动分配适当区段可以避免这一等待。 TX 是最常见的enqueue 等待。TX enqueue 等待通常是以下三个问题之一产生的结果。 第一个问题是唯一索引中的重复索引,你需要执行提交(commit)/回滚(rollback)操作来释放enqueue。 第二个问题是对同一位图索引段的多次更新。因为单个位图段可能包含多个行地址(rowid),所以当多个用户试图更新同一段时,等待出现。直到提交或回滚, enqueue 释放。 第三个问题,也是最可能发生的问题是多个用户同时更新同一个块。如果没有自由的ITL 槽,就会发生块级锁定。通过增大initrans 和/或maxtrans 以允许使用多个ITL 槽,或者增大表上的pctfree值,就可以很轻松地避免这种情况。 TM enqueue 在DML 期间产生,以避免对受影响的对象使用DDL。如果有外键,一定要对它们进行索引,以避免这种常见的锁定问题。
Log Buffer Space: 日志缓冲空间 当你将日志缓冲(log buffer)产生重做日志的速度比LGWR 的写出速度快,或者是当日志转换(log switch)太慢时,就会发生这种等待。为解决这个问题,可以增大日志文件的大小,或者增加日志缓冲器的大小. 另外一个可能的原因是磁盘I/O 存在瓶颈,可以考虑使用写入速度更快的磁盘。
log file switch (archiving needed) 这个等待事件出现时通常是因为日志组循环写满以后,第一个日志归档尚未完成,出现该等待可能是 IO 存在问题。 解决办法: 可以考虑增大日志文件和增加日志组 移动归档文件到快速磁盘 调整log_archive_max_processes .
log file switch (checkpoint incomplete): 日志切换(检查点未完成) 当你的日志组都写完以后,LGWR 试图写第一个log file,如果这时数据库没有完成写出记录在第一个log file 中的dirty 块时(例如第一个检查点未完成),该等待事件出现。
上一篇:Recordset.Open方法参数介绍
下一篇:很有用的oracle 函数
|