Data Base/SQL 튜닝

Row Cache Lock

잇꼬 2024. 2. 5. 23:11
728x90
반응형
SMALL

■ 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;

728x90
반응형
LIST