首页 > 其他分享 >记一次由sequence引发的enq sv-contention等待事件

记一次由sequence引发的enq sv-contention等待事件

时间:2024-05-11 21:41:06浏览次数:11  
标签:00 contention seq sequence cache sv test ash

转自:https://www.cnblogs.com/lijiaman/p/10423272.html#4237610

数据库版本:11.2.0.4 RAC
(1)问题现象
从EM里面可以看到,在23号早上8:45~8:55时,数据库等待会话暴增,大约到了80个会话。通过查看EM的SQL信息,发现等待产生于SQL语句

select TIMEKEYID.nextval from dual

image

image

 

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

image

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

image

从执行的语句可以看出,使用到的数据库对象是一个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;
复制代码

image

(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;
复制代码

image

(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;
复制代码

image

至此可以得出结论:
程序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;

image

ps:

读者评论:

  1. SV等待是order导致的,不是因为cache过小;
  2. RAC场景下序列使用order模式,cache的作用不大,改成noorder后cache的作用才能体现;
  3. noorder模型下,如果cache过小,会出现SQ等待,增大cache能够减少争用;
  4. 修改序列的maxvalue是为了进一步增大cache,因为cache的最大值受限于maxvalue;
  5. 以上4条至少在B5,B8,B10三个工厂验证过;

满格回复:

SV等待确实是由于order导致的。
当时也考虑改为noorder,由于这个sequence是用来与date类型结合增加时间精度(yyyy-mm-dd hh24:mi:ss || sequence)的 ,被业务否决了。所以后续再测试时就一直往cache方向找原因了。在order + cache的情况下,能够加快sequence的分配,效果还是比较明显的,SV减少但是不会完全消失,当时有些走偏了。

标签:00,contention,seq,sequence,cache,sv,test,ash
From: https://www.cnblogs.com/dclogs/p/18187201

相关文章

  • MDT 的 Bootstrap.ini 中设置随机计算机名称,你可以使用预定义的 Task Sequence 变量和
    MDT的Bootstrap.ini中设置随机计算机名称,你可以使用预定义的TaskSequence变量和自定义脚本来实现。以下是一个示例:创建PowerShell脚本:powershellCopyCodefunctionGenerate-RandomComputerName{$prefix="PC"#可以是你希望的计算机名称前缀$rand......
  • SVN 免密登录
    最近觉得在使用svn操作时,总是需要输入密码太烦了,所以想要免密登录。但是在网上找了好几种方法都没有实现,直到最后一种才有用,所以记录一下。不知道为什么之前的几种方法都没有用,先看有用的方法。1.先将之前的配置删除rm-rf~/.subversion/*2.执行相关的svn命令,生成配置文......
  • Python随机波动性SV模型:贝叶斯推断马尔可夫链蒙特卡洛MCMC分析英镑/美元汇率时间序列
    全文链接:https://tecdat.cn/?p=33885原文出处:拓端数据部落公众号本文描述了帮助客户使用马尔可夫链蒙特卡洛(MCMC)方法通过贝叶斯方法估计基本的单变量随机波动模型,就像Kim等人(1998年)所做的那样。定义模型以及从条件后验中抽取样本的函数的代码也在Python脚本中提供。  ......
  • vite react 使用 svg 文件当作图标
    svg可以当做图标导入react里面,如果用img标签弄的话,无法控制图标颜色和字体大小,但是把他当组件导入的话,就可以这么控制了,比较方便,并且也方便webstorm预览首先安装vite-plugin-svgrpnpmaddvite-plugin-svgr-D然后使用修改vite.config.jsimport{defineConfi......
  • svn
    svnsvn安装yum-yinstallsubversion创建版本库mkdir/var/svn/           #这不是仓库,只是一个普通目录svnadmincreate/var/svn/project    #这是仓库ls/var/svn/project/conf/  db/  format  hooks/  locks/  README.txt  ......
  • SVN与Git的区别
    SVN与Git的区别1、Git是分布式的,而SVN不是分布式的2、Git把内容按元数据方式存储,而SVN是按文件3、Git没有一个全局版本号,SVN有4、Git的内容的完整性要优于SVN:GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破......
  • idea使用svn报错-Error:Can not get current revision for file
    idea中使用svn结果报错:Error:CannotgetcurrentrevisionforfileD:/IDEADire…,并且idea提示一下警告:解决方案:安装svn的时候要主要勾选上第二个选项,如下图所示:最后在idea中配置svn的安装路径下的svn.exe,File->settings->VersionControl–>Subversion......
  • https://github.com/long36708/long36708/blob/main/resources/img/grid-snake.svg 请
    对于这个文件,你可以将它放在你的GitHub仓库的"resources"目录下,通常也可以选择"assets"、"images"或者其他类似的名称。如果你还没有这样的目录,你可以按照以下步骤操作:在你的GitHub仓库中创建一个新的目录,可以命名为"resources"、"assets"、"images"或者其他你喜欢......
  • 240229-mo-ni-sai-t1-xu-lie-sequence-ti-jie
    P4778240229模拟赛T1序列(sequence)的第二问。题意求一个排列每次交换两个位置变成$1\dotsn$的方案数。思路分开考虑每个环。设$f_i$表示大小为$i$的环的答案。每交换一次就将一个环分为两个环。枚举分成的较小的一边是什么,乘两边单独的方案数,两边独立乘一个组合数,......
  • dataframe的构造,取值,赋值,移动,交集,并集,排序,打印,转List,导出csv
    一、构造  da=pd.read_csv(filepath_or_buffer='data.csv',sep='\t')  print(da)  datas=pd.DataFrame(da)2、直接赋值df=pd.DataFrame([[1.4,np.nan],[7,-4],[np.nan,np.nan],[0.75,-1.3]],index=[1,2,3,4],         columns=[......