[Oracle]记一次由sequence引发的enq sv-contention等待事件
数据库版本:11.2.0.4 RAC
(1)问题现象
从EM里面可以看到,在23号早上8:45~8:55时,数据库等待会话暴增,大约到了80个会话。通过查看EM的SQL信息,发现等待产生于SQL语句
select TIMEKEYID.nextval from dual


(二)问题追踪
获取AWR报告观察,在TOP事件中,排名第二的enq:SV-contention

再去查看AWR报告,发现该语句执行频率非常的高,在8:00~9:00期间执行了51万多次。

从执行的语句可以看出,使用到的数据库对象是一个sequence,查询可看到该sequence的语法:
CREATE SEQUENCE MODMGR.TIMEKEYID
START WITH 1000
MAXVALUE 999
MINVALUE 0
CYCLE
CACHE 100
ORDER;
(1)定位哪些程序执行该SQL
select to_char(sample_time,'yyyy-mm-dd hh24:mi:ss') timekey,
ash.session_id,
ash."SESSION_SERIAL#",
ash."MODULE"
--count(*) as sql_count
from dba_hist_active_sess_history ash
where ash.instance_number = 1
and ash."SQL_ID" = '6ac0x1yudr8gq'
and ash.sample_time between to_date('2018-12-23 08:00:00','yyyy-mm-dd hh24:mi:ss')
and to_date('2018-12-23 09:00:00','yyyy-mm-dd hh24:mi:ss')
group by to_char(sample_time,'yyyy-mm-dd hh24:mi:ss'),
ash.session_id,
ash."SESSION_SERIAL#",
ash."MODULE"
order by timekey;

(2)定位该语句的执行频率
select to_char(sample_time,'yyyy-mm-dd hh24:mi:ss') timekey,
--ash.session_id,
--ash."SESSION_SERIAL#",
--ash."MODULE"
count(*) as sql_count
from dba_hist_active_sess_history ash
where ash.instance_number = 1
and ash."SQL_ID" = '6ac0x1yudr8gq'
and ash.sample_time between to_date('2018-12-23 08:00:00','yyyy-mm-dd hh24:mi:ss')
and to_date('2018-12-23 09:00:00','yyyy-mm-dd hh24:mi:ss')
group by to_char(sample_time,'yyyy-mm-dd hh24:mi:ss')
--ash.session_id,
--ash."SESSION_SERIAL#",
--ash."MODULE"
order by timekey;

(3)再把时间扩长一些,查看最近4天的该sql捕获记录,发现其它时间段该sequence的使用并不是如此频繁,真正出问题是在大约23日8:49
select sample_time,
ash.session_id,
ash."SESSION_SERIAL#",
ash."MODULE",
ash.event
from dba_hist_active_sess_history ash
where ash.instance_number = 1
and ash."SQL_ID" = '6ac0x1yudr8gq'
and ash.sample_time between to_date('2018-12-20 00:00:00','yyyy-mm-dd hh24:mi:ss')
and to_date('2018-12-24 00:00:00','yyyy-mm-dd hh24:mi:ss')
order by sample_time;

至此可以得出结论:
程序BidmMES在早上8:49产生了大量的“select TIMEKEYID.nextval from dual”语句,导致缓存的100个sequcence快速使用完,缓存使用完后,数据库实例会为其分配新的缓存,异常就发生在分配缓存的时候,Oracle会更新sequence的字典信息,频繁的数据字典更新会导致要使用该sequence的session产生enq:SV-contention等待。
(三)解决方案
如果确认业务没问题,那么需要修改序列的最大值为9999和cache值为1000
alter sequence modmgr.TIMEKEYID maxvalue 9999 cache 1000;
另外,需要考虑,业务上是采用3位的sequence来与其它字符做连接,如果需要保持业务一致,需要截取数字。
(四)案例重现
(1)创建sequence
CREATE SEQUENCE b7dba.seq_test
START WITH 1
MAXVALUE 99999999
MINVALUE 0
CYCLE
CACHE 10
ORDER;
(2)创建一个plsql来消耗seq_test
create or replace procedure p_seq_test is
seq_value number ;begin
--for seq in 1..50 loop
select seq_test.nextval into seq_value from dual;
--end loop;end p_seq_test;
(3)创建400个job来调用该pl/sql
create or replace procedure create_more_job is
v_counter number;begin
for v_counter in 1..400 loop
declare
job1 number;
begin
sys.dbms_job.submit(job => job1,
what => 'p_seq_test;',
next_date => sysdate,
interval => 'sysdate + 1/(1440*60)' --每隔1s执行一次
);
commit;
end;
end loop;end create_more_job;
(4)通过修改cache来查看等待
alter sequence b7dba.seq_test cache {cache数量};
(4.1)no cacahe
drop SEQUENCE b7dba.seq_test;CREATE SEQUENCE b7dba.seq_test
START WITH 1
MAXVALUE 99999999
MINVALUE 0
CYCLE
NOCACHE
ORDER;
(4.2)cache = 2
drop SEQUENCE b7dba.seq_test;
CREATE SEQUENCE b7dba.seq_test
START WITH 1
MAXVALUE 99999999
MINVALUE 0
CYCLE
CACHE 2
ORDER;
(4.3)cache = 10
alter sequence b7dba.seq_test cache 10;
(4.4)cache = 100
alter sequence b7dba.seq_test cache 100;
(4.5)cache = 1000
alter sequence b7dba.seq_test cache 1000;

【完】
[Oracle]记一次由sequence引发的enq sv-contention等待事件的更多相关文章
- oracle 11g enq: JI – contention等待事件
最近使用物化视图同步的环境在大量刷新的时候频繁出现enq: JI – contention等待事件,经查: JI enqueue is acquired in exclusive mode on th ...
- Oracle中常见的33个等待事件小结
在Oracle 10g中的等待事件有872个,11g中等待事件1116个. 我们可以通过v$event_name 视图来查看等待事件的相关信息 一. 等待事件的相关知识 1.1 等待事件主要可 ...
- ORACLE 常见等待事件
一. 等待事件的相关知识 1.1 等待事件主要可以分为两类,即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件.1). 空闲等待事件指ORACLE正等待某种工作,在诊断和优化数据库的时候, ...
- Oracle等待事件之等待事件详解
一. 等待事件的相关知识:1.1 等待事件主要可以分为两类:即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件.1). 空闲等待事件指ORACLE正等待某种工作,在诊断和优化数据库的时候, ...
- 【Oracle】等待事件详细内容
一.等待事件的相关知识 1.1 等待事件主要可以分为两类,即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件.1). 空闲等待事件指ORACLE正等待某种工作,在诊断和优化数据库的时候,不 ...
- Oracle 常见的33个等待事件
一. 等待事件的相关知识: 1.1 等待事件主要可以分为两类,即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件. 1). 空闲等待事件指Oracle正等待某种工作,在诊断和优化数据库的时 ...
- ORACLE等待事件:enq: TX - row lock contention
enq: TX - row lock contention等待事件,这个是数据库里面一个比较常见的等待事件.enq是enqueue的缩写,它是一种保护共享资源的锁定机制,一个排队机制,先进先出(FIF ...
- Oracle常见的几种等待事件
1. CPU time CPU time其实不是真正的等待事件.是衡量CPU是否瓶颈的一个重要指标.一般来讲,一个良好的系统,CPU TIME 应该排在TOP 5 TIME Event的最前面. 当然 ...
- Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence
Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence 使用oracle11g插入数据时遇到这样一个问题: 1 --创建测试表-- 2 CREATE T ...
随机推荐
- 原生Ajax(XMLHttpRequest)
一.什么是Ajax: 全称Asynchronous JavaScript and XML: 异步的 JavaScript 和 XML: 可以在不重新加载整个页面的情况下(偷偷发数据),与服务器交换数据 ...
- laravel之注册中间件
1.添加中间件的命令:php artisan make:middleware 中间件名称 2.给中间件指定key值:在kernel.php中 3.在中间件中添加逻辑代码
- Eclipse 分屏显示同一个代码文件
描述: 今天在使用Eclipse开发的时候不知按错哪个键,出现编辑框分屏显示同一个代码,由于之前没有使用过这一功能,所以就去查了一下,原来是Eclipse的分屏功能. 快捷键: 方式一:Window ...
- SSM 框架-05-详细整合教程(Eclipse版)(Spring+SpringMVC+MyBatis)
SSM 框架-05-详细整合教程(Eclipse版)(Spring+SpringMVC+MyBatis) 如果你使用的是 Intellij IDEA,请查看: SSM的配置流程详细的写了出来,方便很少 ...
- Windows Server 2008 R2 /2012 修改密码策略(摘抄 原文地址 https://www.cnblogs.com/mili3/p/7799347.html)
今天建了域环境,在添加新用户的时候,发现用简单的密码时域安全策略提示密码复杂度不够,于是我就想在域安全策略里面把密码复杂度降低一点. 问题: 在“管理工具 >> 本地安全策略 > ...
- Windows环境下使用Nginx搭建负载均衡
前言 最近没有什么事情,喜欢总结并学习东西!前几天写来一个Session共享,那么我们为什么需要Session共享?因为我们的应用程序分布在多个服务器上,为了合理分配用户的请求,就需要用到负载均衡技术 ...
- Exchange2016 & Skype for business集成之二 OWA集成IM
Microsoft Outlook Web App 和IM集成部署或升级Exchange server 2016与Skype for business 2015后使用原来2013版本方法集成OWA网页 ...
- 1、Docker 架构详解
本文来自clouldman ,有增删. Docker 的核心组件包括: Docker 客户端 - Client Docker 服务器 - Docker daemon Docker 镜像 - Image ...
- Salesforce和SAP Netweaver里数据库表的元数据设计
从Salesforce官网可以了解到Salesforce的force.com平台里数据库表的设计:https://developer.salesforce.com/page/Multi_Tenant_ ...
- 创建工程支持scala代码开发
第一步:idea当中创建创建普通maven工程 File ==> New ==> Project 第二步:修改pom.xml添加scala的版本以及打包插件 <dependencie ...