프린트 하기

OS환경 : Oracle Linux6.8(64bit)


DB 환경 : Oracle Database 10.2.0.4


방법 : 

HW락

1. HWM을 여러 프로세스가 동시에 변경하는 것을 막기 위한 락이다

2. HW락을 획득하는 과정에서 경합이 발생하면 enq HW - contention 대기 이벤트 발생한다.

3. 대부분 대량 insert에 의해 발생한다.

4. 대량 update시 언두세그먼트의 급속한 확장이 필요하기 때문에 언두세그먼트에서 HW락 경합 현상 발생한다.

5. HW락의 ID1값은 테이블스페이스 번호, ID2값으 세그먼트 헤더블록의 DBA이다.

6. 세그먼트 공간관리기법을 FLM을 사용라는 경우에 FREELISTS 속성의 기본값이 1로 세팅되기 떼문에 HW락 경합이 발생할 가능성이 높다.


대기 이벤트 발생 테스트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
show parameter db_block_size;
NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
db_block_size                 integer     8192
 
create tablespace hwm_test_tbs datafile '/orcl/oracle/app/oracle/oradata/hwm01.dbf' size 300M autoextend on
extent management local uniform size 1M  segment space management manual;
 
create table hwm_test (
name1 char(2000default ' ',
name2 char(2000default ' ',         
name3 char(2000default ' ',
name4 char(1500default ' ') tablespace hwm_test_tbs;
 
Table created.
 
create or replace procedure massive_insert 
is
begin
 for idx in 1 .. 10000 loop
  insert into hwm_test(name1) values(' ');
  commit;
 end loop;
end;
/
 
Procedure created.
 
#5개 세션에서 수행
exec massive_insert;
 
PL/SQL procedure successfully completed.
 
select event, total_waits, time_waited
from v$session_event
where sid = (select sid from v$mystat where rownum = 1)
order by 3 desc;
EVENT                                 TOTAL_WAITS TIME_WAITED
---------------------------------------------------------------- ----------- -----------
enq: HW - contention                                                48434        7776

+ 11gR2에서는 동일하게 진행해도 이벤트 미발생


참조 : http://wiki.gurubee.net/display/CORE/enq+HW+-+contention