■ row cache lock
- row cache lock : 'dictionary cache' 또는 'row cache' 에 관련된 정보에 접근하거나 수정하는 경우 발생하는 시스템 lock 이다.
- oracle dictionary 정보에 대한 cache 영역으로, 유저, 테이블, 인덱스, 시퀀스, 컬럼, 함수, 프로시저, 패키지, 트리거 등
▶ 주로 딕셔너리 객체를 조작하는 DDL 작업이나 SQL문이 실행될 때 발생
▶ DDL 작업(테이블 생성, 수정, 삭제 등)을 수행하면 딕셔러리 정보가 입력, 수정, 삭제 → 딕셔러리 경합 발생
ex) 시퀀스 object (주문발생)
▶ SQL문 수행 시에 semantic(의미론적) 분석, 권한 체크 시 → 딕셔러리 정보를 이용해서 체크한다.
- row cache lock은 dirctionary object를 보호하는 시스템 lock 이다.
▶ 목적 : 딕셔너리 객체를 보호하기 위한 시스템 lock으로서, 여러 session에서 동시에 딕셔너리 정보에 접근하거나 수정하는 것을 방지.
▶ 중요성
- SQL문의 실행 계획을 수립하거나 권한을 검사하는 등의 작업에서 딕셔너리 정보를 활용.
#) row cache 사이즈 확인
select pool, name, bytes from v$sgastat where name = 'row cache';
#) row cache 확인
select cache#, type, parameter from v$rowcache;
#) 시퀀스 생성
<hr session>
create sequence seq_1 nocache;
<sys session>
=> v$rowcache의 13 PARENT dc_sequences
select * from dba_sequences where sequence_owner = 'HR' and sequence_name = 'SEQ_1';
<sess_1>
exec dbms_application_info.set_client_info('sess_1')
<sess_2>
exec dbms_application_info.set_client_info('sess_2')
<sys session>
select client_info, sid from v$session where client_info in ('sess_1', 'sess_2');
select sid, event, wait_class, wait_time, seconds_in_wait, state
from v$session_wait
where sid in (25, 16);
#) row cache lock 에 대한 뷰 정보 확인
select h.address, h.saddr, s.sid, h.lock_mode
from v$rowcache_parent h, v$rowcache_parent w, v$session s
where h.address = w.address
and w.saddr = (select saddr from v$session where event = 'row cache lock' and rownum = 1)
and h.saddr = s.saddr
and h.lock_mode > 0;
<sess_1>
<hr session>
declare
v_value number;
begin
for idx in 1..100000 loop
select seq_1.nextval into v_value from dual;
end loop;
end;
/
<sess_2>
<hr session>
declare
v_value number;
begin
for idx in 1..100000 loop
select seq_1.nextval into v_value from dual;
end loop;
end;
/
# row cache lock 확인 작업 #
<sess_1>, <sess_2> 동시 작업 후
<sys_1 session>
select sid, event, wait_class, wait_time, seconds_in_wait, state
from v$session_wait
where sid in (25, 16);
<sys_2 session>
select h.address, h.saddr, s.sid, h.lock_mode
from v$rowcache_parent h, v$rowcache_parent w, v$session s
where h.address = w.address
and w.saddr = (select saddr from v$session where event = 'row cache lock' and rownum = 1)
and h.saddr = s.saddr
and h.lock_mode > 0;
<sys session>
#) 시퀸스 사용하고 있는 sql문장 확인
select sql_text
from v$sql
where address = (select prev_sql_addr from v$session where sid = 16);
select sql_text
from v$sql
where address = (select prev_sql_addr from v$session where sid = 25);
# row cache lock 경합 중에 sequence nocache 속성으로 인해 많이 발생한다.
#) nocache -> cache 사이즈 변경해 달라 전달!
- nextval 수행할 때마다 dictionary 정보를 변경하기 위해서 ssx(shared sub exclusive, LOCK_MODE:5, 일반적인 모드x) 모드를 획득해야 함으로 이때 경합이 발생한다.
문제1) cache 크기가 작을 경우 enq: SQ - contention wait event 발생 → cache 크기 조절.
ex) 주문 체결 상황에서 빈번하게 발생함.
- 해결방법 수정 : alter sequence seq_1 cache 100;
문제2) nocache 일 경우 : cache 사이즈 설정.
- 해결방법 cache mode 변경: create sequence seq_1 cache 100;
'Data Base > SQL 튜닝' 카테고리의 다른 글
FLM(FreeList Management) & ASSM(Auto Segment Space Management) (0) | 2024.02.06 |
---|---|
Buffer Busy Wait, LRU LIST, LRUW LIST (1) | 2024.02.06 |
Version Count_ 바인드 변수 size 설정 (0) | 2024.02.05 |
Shared Pool Latch, library cache latch (1) | 2024.02.05 |
Library Cache Pin _ procedure 생성 후 library cache pin 확인 (0) | 2024.02.05 |