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等待事件就会舒缓许多

posted on   数据与人文  阅读(1023)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享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安装包下载)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示