<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://dbstudy.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=Enq%3Ahw-contention</id>
	<title>Enq:hw-contention - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://dbstudy.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=Enq%3Ahw-contention"/>
	<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=Enq:hw-contention&amp;action=history"/>
	<updated>2026-11-07T18:08:20Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=Enq:hw-contention&amp;diff=1915&amp;oldid=prev</id>
		<title>Oracle: /* HW(High Water Mark) Enqueue가 무엇인가? */</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=Enq:hw-contention&amp;diff=1915&amp;oldid=prev"/>
		<updated>2026-09-21T23:34:08Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;HW(High Water Mark) Enqueue가 무엇인가?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ko&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 이전 판&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2026년 9월 22일 (화) 08:34 판&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l8&quot;&gt;8번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;8번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* HWM(High Water Mark)란?&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* HWM(High Water Mark)란?&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;:&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;= &lt;/del&gt;이 세그먼트가 지금까지 한 번이라도 사용한 적 있는 블록의 최대 경계선&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;: &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;:&lt;/ins&gt;이 세그먼트가 지금까지 한 번이라도 사용한 적 있는 블록의 최대 경계선&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Oracle</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=Enq:hw-contention&amp;diff=1914&amp;oldid=prev</id>
		<title>Oracle: 새 문서: == enq: HW - Contention == * LOB Segment 이슈와 밀접하게 연결되는 대기 이벤트입니다.  * 특히 동시성 높은 환경에서 LOB 컬럼에 INSERT가 몰릴 때 자주 발생하는 이슈  ---- === HW(High Water Mark) Enqueue가 무엇인가?  === * 개념: 세그먼트(Table, Index, LOB Segment 등)가 &quot;새로운 블록 영역으로 확장&quot; 될 때 걸리는 직렬화 락(Lock)  * HWM(High Water Mark)란? := 이 세그먼트가 지금까지 한 번이라도...</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=Enq:hw-contention&amp;diff=1914&amp;oldid=prev"/>
		<updated>2026-09-21T23:33:40Z</updated>

		<summary type="html">&lt;p&gt;새 문서: == enq: HW - Contention == * LOB Segment 이슈와 밀접하게 연결되는 대기 이벤트입니다.  * 특히 동시성 높은 환경에서 LOB 컬럼에 INSERT가 몰릴 때 자주 발생하는 이슈  ---- === HW(High Water Mark) Enqueue가 무엇인가?  === * 개념: 세그먼트(Table, Index, LOB Segment 등)가 &amp;quot;새로운 블록 영역으로 확장&amp;quot; 될 때 걸리는 직렬화 락(Lock)  * HWM(High Water Mark)란? := 이 세그먼트가 지금까지 한 번이라도...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== enq: HW - Contention ==&lt;br /&gt;
* LOB Segment 이슈와 밀접하게 연결되는 대기 이벤트입니다. &lt;br /&gt;
* 특히 동시성 높은 환경에서 LOB 컬럼에 INSERT가 몰릴 때 자주 발생하는 이슈&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
=== HW(High Water Mark) Enqueue가 무엇인가?  ===&lt;br /&gt;
* 개념: 세그먼트(Table, Index, LOB Segment 등)가 &amp;quot;새로운 블록 영역으로 확장&amp;quot; 될 때 걸리는 직렬화 락(Lock)&lt;br /&gt;
&lt;br /&gt;
* HWM(High Water Mark)란?&lt;br /&gt;
:= 이 세그먼트가 지금까지 한 번이라도 사용한 적 있는 블록의 최대 경계선&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
[세그먼트 내부 이미지]&lt;br /&gt;
┌────────┬────────┬────────┬────────┬─────────────┐&lt;br /&gt;
│ 사용중 │ 사용중 │ 사용중  │ 미사용  │   미사용    │&lt;br /&gt;
│ Block1 │ Block2 │ Block3 │ Block4 │   Block5    │&lt;br /&gt;
└────────┴────────┴────────┴────────┴─────────────┘&lt;br /&gt;
                            ▲&lt;br /&gt;
                           HWM (여기까지가 &amp;quot;사용해본 적 있는&amp;quot; 경계)&lt;br /&gt;
&lt;br /&gt;
→ HWM을 넘어 Block4, Block5로 최초 진입(확장)하려면 &lt;br /&gt;
  &amp;quot;누군가 한 명만&amp;quot; HWM을 이동시키는 작업을 해야 함&lt;br /&gt;
→ 그 &amp;quot;한 명만 하도록 강제&amp;quot;하는 직렬화 장치가 바로 enq: HW 이다&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*핵심: HW 이동 자체는 원자적(Atomic)이어야 하므로, 여러 세션이 동시에 HWM을 넘기려고 시도하면 한 세션만 실제로 이동시키고 나머지는 대기합니다. &lt;br /&gt;
이 대기가 `enq: HW - contention`입니다.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 어떤 상황에서 자주 발생하는가? ===&lt;br /&gt;
&lt;br /&gt;
# 발생 빈발 시나리오 TOP 3&lt;br /&gt;
#:&amp;lt;source&amp;gt;&lt;br /&gt;
1순위: LOB Segment 동시 INSERT (가장 빈번)&lt;br /&gt;
:   → 여러 세션이 동시에 CLOB/BLOB 컬럼에 대량 데이터를 INSERT&lt;br /&gt;
:   → 특히 NOCACHE + 병렬 세션 조합에서 극심&lt;br /&gt;
&lt;br /&gt;
2순위: 병렬 Direct-Path INSERT (APPEND Hint)&lt;br /&gt;
 :  → 여러 병렬 슬레이브가 동시에 같은 테이블 뒤쪽에 데이터 적재&lt;br /&gt;
&lt;br /&gt;
3순위: 시퀀스 없는 대량 동시 INSERT (일반 Heap 테이블)&lt;br /&gt;
:   → ASSM(Automatic Segment Space Management)이라도 &lt;br /&gt;
     극단적으로 짧은 시간에 너무 많은 세션이 몰리면 발생 가능&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
#:* SecureFile LOB에 다수 세션이 동시에 대용량 데이터를 넣는 배치/API 환경이라면, LOB Segment의 HWM 확장 경쟁이 바로 이 대기 이벤트의 주요 원인&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===  실습으로 재현해보기 ===&lt;br /&gt;
# 테스트 테이블&lt;br /&gt;
#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
CREATE TABLE hw_contention_test (&lt;br /&gt;
    id       NUMBER,&lt;br /&gt;
    data_lob CLOB&lt;br /&gt;
)&lt;br /&gt;
LOB (data_lob) STORE AS SECUREFILE hw_lob_seg (&lt;br /&gt;
    DISABLE STORAGE IN ROW&lt;br /&gt;
    NOCACHE&lt;br /&gt;
    CHUNK 8192&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
# 다수 세션에서 동시 INSERT 발생시키기 (개념적 재현)&lt;br /&gt;
#: 여러 세션에서 동시에 아래를 실행 (SQL*Plus 여러 창 or 병렬 Job):&lt;br /&gt;
#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Session 1~10 동시 실행&lt;br /&gt;
DECLARE&lt;br /&gt;
    l_clob CLOB;&lt;br /&gt;
BEGIN&lt;br /&gt;
    FOR i IN 1..1000 LOOP&lt;br /&gt;
        l_clob := gen_clob(50000, &amp;#039;X&amp;#039;);  -- 50KB LOB&lt;br /&gt;
        INSERT INTO hw_contention_test VALUES (i, l_clob);&lt;br /&gt;
        COMMIT;&lt;br /&gt;
    END LOOP;&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
# 실시간 대기 이벤트 모니터링&lt;br /&gt;
#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT sid, event, state, seconds_in_wait, p1, p2, p3&lt;br /&gt;
FROM v$session&lt;br /&gt;
WHERE event = &amp;#039;enq: HW - contention&amp;#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
#:&lt;br /&gt;
#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SID   EVENT                    STATE    SECONDS_IN_WAIT   P1          P2      P3&lt;br /&gt;
----  -----------------------  -------  ----------------  ----------  ------  ------&lt;br /&gt;
 145  enq: HW - contention     WAITING                 2   1213908993   65543       0&lt;br /&gt;
 152  enq: HW - contention     WAITING                 2   1213908993   65543       0&lt;br /&gt;
 168  enq: HW - contention     WAITING                 1   1213908993   65543       0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
#:&lt;br /&gt;
#:* P1, P2 해석: &lt;br /&gt;
#:*:- `P1 = 1213908993` → `Type=&amp;#039;HW&amp;#039;(0x48 0x57), Mode` 조합 인코딩 값&lt;br /&gt;
#:*:- `P2 = 65543` → 대상 세그먼트의 **Tablespace# + Relative File#** 조합 (같은 세그먼트를 다투고 있다는 증거)&lt;br /&gt;
#:&lt;br /&gt;
#:* 동일한 P2 값을 가진 세션들이 정확히 같은 세그먼트(여기서는 hw_lob_seg)에서 경쟁 중임을 의미합니다.&lt;br /&gt;
# 원인이 되는 세그먼트를 정확히 찾아내는 방법&lt;br /&gt;
#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- P2 값을 이용해 실제 경쟁 중인 세그먼트 역추적&lt;br /&gt;
SELECT s.sid, s.event, &lt;br /&gt;
       o.owner, o.object_name, o.object_type&lt;br /&gt;
FROM v$session s,&lt;br /&gt;
     v$lock l,&lt;br /&gt;
     dba_extents e,&lt;br /&gt;
     dba_objects o&lt;br /&gt;
WHERE s.event = &amp;#039;enq: HW - contention&amp;#039;&lt;br /&gt;
AND l.sid = s.sid&lt;br /&gt;
AND l.type = &amp;#039;HW&amp;#039;&lt;br /&gt;
AND e.relative_fno = MOD(l.id2, 65536)&lt;br /&gt;
AND e.file_id = e.relative_fno   -- 환경에 맞게 조정 필요&lt;br /&gt;
AND o.object_id = e.segment_id&lt;br /&gt;
AND o.object_name = e.segment_name;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
#: * 더 실무적으로 간단한 방법: P1/P2로 직접 조회하는 대신, 실시간으로 어느 세그먼트가 확장 중인지 ASH로 확인&lt;br /&gt;
#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT sample_time, session_id, &lt;br /&gt;
       current_obj#, &lt;br /&gt;
       (SELECT object_name FROM dba_objects WHERE object_id = ash.current_obj#) AS obj_name,&lt;br /&gt;
       event&lt;br /&gt;
FROM v$active_session_history ash&lt;br /&gt;
WHERE event = &amp;#039;enq: HW - contention&amp;#039;&lt;br /&gt;
ORDER BY sample_time DESC&lt;br /&gt;
FETCH FIRST 20 ROWS ONLY;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SAMPLE_TIME              SESSION_ID   CURRENT_OBJ#   OBJ_NAME         EVENT&lt;br /&gt;
-----------------------  -----------  -------------  ---------------  ---------------------&lt;br /&gt;
2024-01-15 14:23:01.123          145         123457   HW_LOB_SEG       enq: HW - contention&lt;br /&gt;
2024-01-15 14:23:01.456          152         123457   HW_LOB_SEG       enq: HW - contention&lt;br /&gt;
2024-01-15 14:23:01.789          168         123457   HW_LOB_SEG       enq: HW - contention&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
#:* 확인 완료 : 세 세션 모두 `HW_LOB_SEG`에서 경쟁 중임이 명확히 드러납니다.&lt;br /&gt;
&lt;br /&gt;
===  왜 이런 구조적 한계가 존재하는가?  (ASSM이라도 못 피하는 이유) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
오해: &amp;quot;ASSM(자동 세그먼트 공간 관리)이면 &lt;br /&gt;
       Freelist Contention이 해결됐으니 HW Contention도 없겠지?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
실제: ASSM은 &amp;quot;이미 HWM 아래에 있는 블록들 사이의 공간 찾기 경쟁&amp;quot;만 해결한다.&lt;br /&gt;
      &amp;quot;HWM 자체를 넘어서 새 영역으로 처음 진입하는 순간&amp;quot;의 &lt;br /&gt;
      직렬화는 ASSM 여부와 무관하게 항상 존재한다.&lt;br /&gt;
&lt;br /&gt;
즉, Freelist Contention(구시대) ≠ HW Contention(구조적으로 항상 존재)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# LOB Segment는 특히 취약한 이유*:&lt;br /&gt;
#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
일반 Table Segment&lt;br /&gt;
→ 여러 세션이 각기 다른 블록에 흩어져서 쓸 수 있음 (ASSM Bitmap 분산 배정)&lt;br /&gt;
→ HWM 확장 빈도 자체가 상대적으로 낮음&lt;br /&gt;
&lt;br /&gt;
LOB Segment (특히 NOCACHE 대용량 INSERT)&lt;br /&gt;
→ 각 LOB 값이 통째로 CHUNK 단위(8K, 16K...)를 즉시 소비&lt;br /&gt;
→ 대용량 LOB을 빠르게 연속 INSERT하면 HWM이 &amp;quot;매우 자주&amp;quot; 이동해야 함&lt;br /&gt;
→ HWM 이동 빈도가 높을수록 Contention 발생 확률 급증&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  해결 방안 (실전 우선순위 순) ===&lt;br /&gt;
# SECUREFILE의 경우 - Concurrency 관련 파라미터 확인&lt;br /&gt;
#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 현재 LOB의 상세 스토리지 옵션 확인&lt;br /&gt;
SELECT table_name, column_name, securefile, &lt;br /&gt;
       cache, logging, retention&lt;br /&gt;
FROM user_lobs&lt;br /&gt;
WHERE table_name = &amp;#039;HW_CONTENTION_TEST&amp;#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
#:&lt;br /&gt;
#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
TABLE_NAME            COLUMN_NAME  SECUREFILE  CACHE      LOGGING  RETENTION&lt;br /&gt;
--------------------  -----------  ----------  ---------  -------  ----------&lt;br /&gt;
HW_CONTENTION_TEST    DATA_LOB     YES         NO         YES      AUTO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
#:&lt;br /&gt;
#:*개선안: SecureFile은 내부적으로 Space Management를 위한 여러 최적화가 있지만, 극단적 동시성에서는 여전히 근본적 해결이 안 됨. 아래 항목들과 병행 필요.&lt;br /&gt;
#  파티셔닝으로 세그먼트 자체를 분산 (가장 효과적)&lt;br /&gt;
#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Hash Partition으로 LOB Segment 자체를 물리적으로 분산&lt;br /&gt;
CREATE TABLE hw_contention_test_part (&lt;br /&gt;
    id       NUMBER,&lt;br /&gt;
    data_lob CLOB&lt;br /&gt;
)&lt;br /&gt;
LOB (data_lob) STORE AS SECUREFILE (&lt;br /&gt;
    DISABLE STORAGE IN ROW&lt;br /&gt;
    NOCACHE&lt;br /&gt;
)&lt;br /&gt;
PARTITION BY HASH (id) PARTITIONS 8;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
#:&lt;br /&gt;
#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 파티션별로 별도의 LOB Segment가 생성되는지 확인&lt;br /&gt;
SELECT table_name, partition_name, segment_name&lt;br /&gt;
FROM user_lob_partitions&lt;br /&gt;
WHERE table_name = &amp;#039;HW_CONTENTION_TEST_PART&amp;#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
#:&lt;br /&gt;
#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
TABLE_NAME                PARTITION_NAME   SEGMENT_NAME&lt;br /&gt;
-------------------------  ---------------  ------------------------&lt;br /&gt;
HW_CONTENTION_TEST_PART    SYS_P101         SYS_LOB_P101_00001$$&lt;br /&gt;
HW_CONTENTION_TEST_PART    SYS_P102         SYS_LOB_P102_00002$$&lt;br /&gt;
HW_CONTENTION_TEST_PART    SYS_P103         SYS_LOB_P103_00003$$&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 효과 : 세션들이 `id` 값에 따라 8개의 서로 다른 파티션(=서로 다른 LOB Segment)으로 흩어지므로, 동일 세그먼트를 다투는 확률이 1/8로 감소합니다.&lt;br /&gt;
# 동시 INSERT 세션 수 자체를 조절 (애플리케이션 레벨)&lt;br /&gt;
#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Resource Manager로 동시 병렬도 제한 (배치 작업의 경우)&lt;br /&gt;
BEGIN&lt;br /&gt;
  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(&lt;br /&gt;
    plan =&amp;gt; &amp;#039;BATCH_PLAN&amp;#039;,&lt;br /&gt;
    group_or_subplan =&amp;gt; &amp;#039;BATCH_GROUP&amp;#039;,&lt;br /&gt;
    comment =&amp;gt; &amp;#039;LOB Insert 동시성 제한&amp;#039;,&lt;br /&gt;
    parallel_degree_limit_p1 =&amp;gt; 4  -- 동시 병렬도 제한&lt;br /&gt;
  );&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
# CACHE 옵션 재검토 (단, 대용량이면 신중히)&lt;br /&gt;
#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- NOCACHE → CACHE READS로 변경 시 HWM 확장 패턴이 달라질 수 있음&lt;br /&gt;
-- (단, Buffer Cache 압박이 커지므로 LOB이 매우 크면 비추천)&lt;br /&gt;
ALTER TABLE hw_contention_test MOVE LOB(data_lob) STORE AS (&lt;br /&gt;
    CACHE READS&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
#:&lt;br /&gt;
# 배치 커밋 간격 조정 (Commit 빈도와 HWM 확장 빈도는 별개지만 병행 효과 있음)&lt;br /&gt;
#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 매 row마다 COMMIT → 500 row마다 COMMIT으로 변경&lt;br /&gt;
-- (트랜잭션 오버헤드 감소로 전체 처리시간 단축, HW Contention 절대량은 불변이나 &lt;br /&gt;
--  세션 간 타이밍이 분산되어 충돌 확률 감소하는 부수 효과)&lt;br /&gt;
DECLARE&lt;br /&gt;
    l_clob CLOB;&lt;br /&gt;
BEGIN&lt;br /&gt;
    FOR i IN 1..1000 LOOP&lt;br /&gt;
        l_clob := gen_clob(50000, &amp;#039;X&amp;#039;);&lt;br /&gt;
        INSERT INTO hw_contention_test VALUES (i, l_clob);&lt;br /&gt;
        IF MOD(i, 500) = 0 THEN&lt;br /&gt;
            COMMIT;&lt;br /&gt;
        END IF;&lt;br /&gt;
    END LOOP;&lt;br /&gt;
    COMMIT;&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
# 실전 진단 체크리스트&lt;br /&gt;
#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- AWR에서 HW Contention이 Top Wait Event로 잡히는지 확인&lt;br /&gt;
SELECT event, total_waits, time_waited_micro/1000000 AS time_waited_sec&lt;br /&gt;
FROM dba_hist_system_event&lt;br /&gt;
WHERE event = &amp;#039;enq: HW - contention&amp;#039;&lt;br /&gt;
AND snap_id BETWEEN (SELECT MIN(snap_id) FROM dba_hist_snapshot WHERE begin_interval_time &amp;gt; SYSDATE-1)&lt;br /&gt;
                AND (SELECT MAX(snap_id) FROM dba_hist_snapshot)&lt;br /&gt;
ORDER BY time_waited_sec DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
#:&lt;br /&gt;
#:&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
EVENT                    TOTAL_WAITS   TIME_WAITED_SEC&lt;br /&gt;
-----------------------  ------------  ----------------&lt;br /&gt;
enq: HW - contention             8421            342.56&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 이 정도 수치(하루 5분 이상 누적 대기)라면 명백히 튜닝 대상 입니다.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 최종 정리 ===&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
enq: HW - contention 핵심 요약&lt;br /&gt;
&lt;br /&gt;
원인: 세그먼트의 High Water Mark를 넘어 새 영역으로 확장할 때 &lt;br /&gt;
      발생하는 필연적 직렬화 경쟁&lt;br /&gt;
&lt;br /&gt;
가장 흔한 실전 상황: 다수 세션의 동시 LOB INSERT (특히 NOCACHE 대용량)&lt;br /&gt;
&lt;br /&gt;
ASSM으로도 해결 안 되는 구조적 이슈 (Freelist Contention과는 다른 문제)&lt;br /&gt;
&lt;br /&gt;
가장 효과적인 해결책 우선순위:&lt;br /&gt;
  1. 파티셔닝으로 세그먼트 자체를 분산 (근본 해결)&lt;br /&gt;
  2. 동시 세션 수/병렬도 제한 (부하 조절)&lt;br /&gt;
  3. CACHE 옵션, 배치 커밋 조정 (보조적 완화)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Oracle</name></author>
	</entry>
</feed>