enq: SQ - contention等待事件解析
enq: SQ - contention等待事件,咱来一步步分析awr报告找到问题所在。
在快照期间数据库一定发生了什么事情。
第一条便是enq:SQ - contention,占用了大部分的DB Time
然后查找enq:SQ - contention的MOS文档,很容易就找到其cause:
The most common cause is that one or more sequences are getting used heavily, and the cache size for those sequences may not be adequate for RAC
也就是说是由于sequence设置不合理导致
为了解决这个问题,我们来着重理解一下sequence的cache特性
sequence也就是我们说的序列号,一般来说建立sequence是为了完成所求变量的自增。在sequence中有非常关键的属性cache,cache就是sequence的缓存,当我们建立sequence的时候,就需要指定cache值(当然也有默认值),比如说当sequence从1一直nextval到20,这个时候缓存中的sequence值都取完了,必须重新取缓存值21,内存中的值也就到了21-40。
这个cache的问题有什么意义呢?
如果sequence定义为nocache,也就是不缓存,每次取nextval都会重新计算nextval的值,而不是直接从内存中读取,从性能上来讲这肯定效率较低。
为什么oracle不直接把默认值设置的很大?
首先内存肯定是有限的,为了一个sequence就牺牲数据库的内存也太不应该了。其次,为了安全。当oracle数据库宕机的时候,内存中的sequence cache也都找不到了,比如说cache值为10000,nextval已经取到了9999,内存中的cache值仍为1-10000,这个时候数据库宕机,内存中的数据找不回来了,数据库重新启动后业务的sequence重新取值,就得从1开始取,而不是10000。所有cache值设置的太大也不合适
了解了sequence,就能理解mos提供的解决办法:
1.尽量把非cache noorder的sequence设置成cache noorder
2.如果是cache noorder,且cache值小于100,设置成更大的值(cache默认值为20),mos建议值为10000.
(参考文档:High "enq: SQ - contention" waits in RAC (文档 ID 2156730.1))
马上查找了数据库中所有sequence的cache设定,很多用户都是设置的默认值20或者或者很小的值.
但是sequence有几百个,全部修改的话动作较大,找到问题sequence修改就足够了。
所以再继续看awr
从上面的TOP SQL和对应的SQL Text就可以看出,
在快照时间内,数据库一定发生了大量的插入操作,在插入操作中使用了大量的sequence,所以将这些sequence做出修改,enq:SQ - contention等待事件就会舒缓许多
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2021-04-07 MySQL聚集索引
2021-04-07 MySQL从二叉树到B+树
2021-04-07 Linux最全基础指令
2021-04-07 数据库要不要部署在docker容器内?
2021-04-07 MySQL启动报错-The server quit without updating PID file[FAILED]mysql/mysql.pid).
2021-04-07 MySQL数据库启动异常-[ERROR] [MY-011971]
2021-04-07 Windows环境下安装EPDFree和pandas(包含epd_free-7.3-2安装包下载)