数据库版本: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等待事件的更多相关文章

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

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

  2. Oracle中常见的33个等待事件小结

    在Oracle 10g中的等待事件有872个,11g中等待事件1116个. 我们可以通过v$event_name 视图来查看等待事件的相关信息     一. 等待事件的相关知识 1.1 等待事件主要可 ...

  3. ORACLE 常见等待事件

    一. 等待事件的相关知识 1.1 等待事件主要可以分为两类,即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件.1). 空闲等待事件指ORACLE正等待某种工作,在诊断和优化数据库的时候, ...

  4. Oracle等待事件之等待事件详解

    一. 等待事件的相关知识:1.1 等待事件主要可以分为两类:即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件.1). 空闲等待事件指ORACLE正等待某种工作,在诊断和优化数据库的时候, ...

  5. 【Oracle】等待事件详细内容

    一.等待事件的相关知识 1.1 等待事件主要可以分为两类,即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件.1). 空闲等待事件指ORACLE正等待某种工作,在诊断和优化数据库的时候,不 ...

  6. Oracle 常见的33个等待事件

    一. 等待事件的相关知识: 1.1 等待事件主要可以分为两类,即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件. 1). 空闲等待事件指Oracle正等待某种工作,在诊断和优化数据库的时 ...

  7. ORACLE等待事件:enq: TX - row lock contention

    enq: TX - row lock contention等待事件,这个是数据库里面一个比较常见的等待事件.enq是enqueue的缩写,它是一种保护共享资源的锁定机制,一个排队机制,先进先出(FIF ...

  8. Oracle常见的几种等待事件

    1. CPU time CPU time其实不是真正的等待事件.是衡量CPU是否瓶颈的一个重要指标.一般来讲,一个良好的系统,CPU TIME 应该排在TOP 5 TIME Event的最前面. 当然 ...

  9. Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence

    Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence 使用oracle11g插入数据时遇到这样一个问题: 1 --创建测试表-- 2 CREATE T ...

随机推荐

  1. 【PyQt5 学习记录】001:第一个界面

    PyQt5 的安装很简单: pip3 install PyQt5 然后就是写一个最简单的界面试试手: import sys from PyQt5.QtWidgets import QApplicati ...

  2. PHP实用系统函数之数组篇

    PHP中十分实用的系统函数 array array_merge 说明:array  array_merge ( array $array1 [, array $... ] ) 将一个或多个数组的单元合 ...

  3. Web前端面试指导(十六):为什么要初始化CSS样式?

    题目点评 这个题目乍一看感觉怪怪的,什么叫初始化样式了?如果换一句话你可能就理解了,就是通用样式.这道题目主要涉及的是理论方面的知识,不用写代码,只要描述清楚就可以了 初始化样式的原因 因为浏览器的兼 ...

  4. vscode 实用的插件

    REST-Client api接口测试插件 在项目中新建以.http后缀名的文件即可. 右键使用 可以生产多种语言的请求代码块.可以说是非常舒服了. 使用代码块功能生成了node环境的http请求. ...

  5. Vue打包桌面程序

    开源的地址:https://github.com/electron/electron-quick-start 一.运行 1. 安装依赖 cnpm install electron --save cnp ...

  6. js获取上一页、当前页及域名url

    一个业务中可能会用到,跳转到另个页面后, 又后退回之前的页面,之前的页面上有个判断提示一定会出 网上搬了下代码 console.log("js获取当前域名"+window.loca ...

  7. PRINCE2考试用什么语言?

    PRINCE2考试可用英语之外的阿拉伯语.中文.日语.马来西亚/印度尼西亚语.泰国语.越南语.菲律宾语.波兰语和盖尔语等9种语言进行. PRINCE2手册目前已有英文.中文.丹麦语和日语,正在翻译成荷 ...

  8. centos虚拟机下安装nginx

    通过yum安装 yum install epel-release -y(企业级的镜像源) yum install nginx-y 启动.停止.重启 service nginx start servic ...

  9. 2.bootstrap安装

    1.下载 您可以从 http://getbootstrap.com/ 上下载 Bootstrap 的最新版本(或者 http://www.bootcss.com/  中文网) Download Boo ...

  10. Django 的视图层

    什么是视图: 之前我们也了解了urls路由 那么路由的主要作用是决定你下一步走哪个视图函数 ,视图就是用来存放一个个的函数的python文件,主要存储的函数就是你Django主要的流程的控制 都存放在 ...