[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

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

【完】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM