今天下午,有台服务器出现异常,响应特别慢,io等待奇高,awr top 5事件如下:

经回查ash,找到了造成这些事件的sql语句,如下:

select * from v$active_session_history where event='enq: TM - contention'
select * from v$active_session_history where event='enq: KO - fast object checkpoint'

enq-TM的事件主要由insert /*+ append */语句引起,如下:

enq-TM是一个表级别锁,在本例中主要是由于append引起。

TM 锁在下列场景中被申请:

  1. 在OPS(早期的RAC)中LGWR会以ID1=0 &  ID2=0去申请该队列锁来检查 DML_LOCKS 在所有实例中是全0还是全非0
  2. 当一个单表或分区 需要做不同的表/分区操作时,ORACLE需要协调这些操作,所以需要申请该队列锁。包括:
  3. 启用参考约束 referential constraints
  4. 修改约束从DIASABLE NOVALIDATE 到DISABLE VALIDATE
  5. 重建IOT
  6. 创建视图或者修改ALTER视图时可能需要申请该队列锁
  7. 分析表统计信息或validate structure时
  8. 一些PDML并行DML操作
  9. 所有可能调用kkdllk()函数的操作
  10. 。。。。

enq:KO主要由下列select引起:

enq: KO - fast object checkpoint 发生的原因是:当进行TABLE FULL SCAN (全表扫描) 或并行查询整个segment时, 11g下,因_adaptive_direct_read 默认为true,  达到阀值_small_table_threshold大小的表会被认为是大表,读取数据时不会读入SGA , 而是直接路径读取(direct path read),而direct path read 是需要将数据从磁盘读取到各session 的PGA中,因为不是读入SGA, 所以读取这些表之前需要在所有数据库节点(如果是RAC)触发object level checkpoint,将这些表被修改过的dirty buffer写入磁盘,以保证读取数据的一致性 。

在本服务器中,_small_table_threshold的值如下:

大约为250M。

由于我们的系统是清算系统,故一方面考虑加大_small_table_threshold到1G-2G左右左右,以避免大量的不必要物理读写。如果发生这种等待事件,一个简单的查询可能也会变得非常慢。

至于free buffer waits,不是主因,主要是受前两者牵连所致。造成free buffer waits还有一个原因,就是大DML造成的延迟块清除或者delete造成的undo块写入文件(磁盘子系统慢,io很高,将undo移动到另外一块快的存储之后,性能极大提升):

什么是延迟块清除?
在事务提交前,这个事务修改得block已经被dbwr写到disk中去了。我们知道,块头会记录这个块有活动事务存在,后来这个事务commit时,oracle不可能再把它读回到内存中来修改块头。只能等下回用它时,到undo段里查询事务记录后,再修改块标志为已commit。比如如果对一个大表有delete操作,后续有人对这个表有select操作,因为延迟块清除的特性,就会占用大量buffer。这也是为什么select也会产生redo的原因。(select的时候要修改块头)
delay block cleanout :
主要针对大事务,可能在commit的时候,一些数据脏快已写入数据文件,提交时,无法把这些数据块标记commit,该数据块的下一个读者对其进行delay block cleanout 。数据块的下一个读者首先检查该块的事务状态是否为活动,不活动的话,修改事务的标志(flag)。这样可以避免不必要的事务读。

enq: TM - contention一例的更多相关文章

  1. 等待事件:enq: HW - contention和enq: TM - contention

    今天生成了生产库前几日的AWR报告,发现等待事件中出现了一个陌生的event--enq: HW - contention,google一下是ASSM(Auto Segment Space Manage ...

  2. oracle 11g enq: JI – contention等待事件

    最近使用物化视图同步的环境在大量刷新的时候频繁出现enq: JI – contention等待事件,经查: JI enqueue is acquired in exclusive mode on th ...

  3. 【故障处理】队列等待之enq IV - contention案例

    [故障处理]队列等待之enq IV -  contention案例 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也 ...

  4. 【等待事件】序列等待事件总结(enq: SQ - contention、row cache lock、DFS lock handle和enq: SV - contention)

    [等待事件]序列等待事件总结(enq: SQ - contention.row cache lock.DFS lock handle和enq: SV -  contention) 1  BLOG文档结 ...

  5. enq: SQ - contention

    --每分钟操作 SQL> select  sql_id, mi, count(mi)   2    from (select event, sql_id, to_char(sample_time ...

  6. Analyzing 'enq: HW - contention' Wait Event (Doc ID 740075.1)

    Analyzing 'enq: HW - contention' Wait Event (Doc ID 740075.1) In this Document   Symptoms   Cause   ...

  7. enq: FB - contention

    Troubleshooting 'enq: FB - contention' Format Block Enqueues. (Doc ID 1379986.1) In this DocumentPur ...

  8. 奇怪的等待事件“enq: ss - contention”

    数据库有时会遇到大量的进程发生'enq: ss - contention'等待,持续5到10分钟,然后自动消失.从字面上看,'SS'是Sort Segment: select * from v$loc ...

  9. undo表空间居高不下和enq: US - contention

    这几天遇到一个错误,我也不知道算不算错误吧,因为没有报错,只是在那突然的短短2分钟内表的操作突然降低了,导致了该软件重新启动.查看alert日志没有报错,而是在ASH里找到了TOP SQL框有一个这样 ...

随机推荐

  1. 后续使用dubbo的必要性的思考

    要做微服务,要做分布式,就得先解决网络调用即rpc的问题

  2. PowerDesigner安装及破解

    1.复制pdflm16.dll文件. 2.. 找到PowerDesigner16.5的安装目录,然后粘贴pdflm16.dll,替换安装目录里面的pdflm16.dll文件: 3.重新启动PowerD ...

  3. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(十)使用JRTPLIB传输RTP数据

    myRtspClient通过简单修改JRTPLIB的官方例程作为其RTP传输层实现.因为JRTPLIB使用的是CMAKE编译工具,这就是为什么编译myRtspClient时需要预装CMAKE. 该部分 ...

  4. Xgboost调参总结

    一.参数速查 参数分为三类: 通用参数:宏观函数控制. Booster参数:控制每一步的booster(tree/regression). 学习目标参数:控制训练目标的表现. 二.回归 from xg ...

  5. python while for else

    python的循环挺有意思 while和for体中可以带上else项 while中的else表示循环条件不成立时,去执行一次,也就是退出循环前去做一次 for中的else表示固定循环正常完成后,去执行 ...

  6. iOS 新浪微博-3.0 新特性

    每个程序在第一次启动的时候,都会显示新特性.效果如下: 思路: 添加一个ViewController,里面放两个View,一个是UISrollView,另一个pageControl 往UISrollV ...

  7. cocos2dx 3.x(打开网页webView)

    #include "ui/CocosGUI.h" using namespace cocos2d::experimental::ui; WebView *webView = Web ...

  8. 开源unittest测试报告源码BSTestRunner.py

    开源BSTestRunner 生成HTML测试报告源码: 保存代码到BSTestRunner.py 配合Unittest使用,很完美. python2: """ A Te ...

  9. hbase-java-api003(put list)

    package api; import java.io.IOException; import java.util.ArrayList; import java.util.List; import o ...

  10. Python记录5:函数1

    函数 ''' 1. 什么是函数     在程序中具备某一功能的工具->函数     函数的使用必须遵循原则:         先定义         后调用 函数分为两大类:         1 ...