<?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=Lob_%ED%85%8C%EC%8A%A4%ED%8A%B8</id>
	<title>Lob 테스트 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://dbstudy.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=Lob_%ED%85%8C%EC%8A%A4%ED%8A%B8"/>
	<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=Lob_%ED%85%8C%EC%8A%A4%ED%8A%B8&amp;action=history"/>
	<updated>2026-09-15T10:38:10Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=Lob_%ED%85%8C%EC%8A%A4%ED%8A%B8&amp;diff=1828&amp;oldid=prev</id>
		<title>Oracle: /* LOB ENABLE STORAGE IN ROW 성능 비교 테스트 */</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=Lob_%ED%85%8C%EC%8A%A4%ED%8A%B8&amp;diff=1828&amp;oldid=prev"/>
		<updated>2026-09-15T03:05:34Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;LOB ENABLE STORAGE IN ROW 성능 비교 테스트&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;a href=&quot;https://dbstudy.co.kr/w/index.php?title=Lob_%ED%85%8C%EC%8A%A4%ED%8A%B8&amp;amp;diff=1828&amp;amp;oldid=1827&quot;&gt;차이 보기&lt;/a&gt;</summary>
		<author><name>Oracle</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=Lob_%ED%85%8C%EC%8A%A4%ED%8A%B8&amp;diff=1827&amp;oldid=prev</id>
		<title>Oracle: 새 문서: === LOB ENABLE STORAGE IN ROW 성능 비교 테스트 === &lt;source lang=sql&gt; -- ============================================================ -- LOB ENABLE STORAGE IN ROW 성능 비교 테스트 -- 목적: 4000byte 이하(인라인) vs 4000byte 초과(아웃오브라인) 데이터를 --       삽입/조회할 때 성능(시간, 논리/물리 I/O, 공간 사용량) 차이를 측정 -- 구성: 하나의 테이블에 LOB 컬럼 2개(DOC_A, DOC_B)를 두어, --       컬럼별로 다...</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=Lob_%ED%85%8C%EC%8A%A4%ED%8A%B8&amp;diff=1827&amp;oldid=prev"/>
		<updated>2026-09-15T00:35:54Z</updated>

		<summary type="html">&lt;p&gt;새 문서: === LOB ENABLE STORAGE IN ROW 성능 비교 테스트 === &amp;lt;source lang=sql&amp;gt; -- ============================================================ -- LOB ENABLE STORAGE IN ROW 성능 비교 테스트 -- 목적: 4000byte 이하(인라인) vs 4000byte 초과(아웃오브라인) 데이터를 --       삽입/조회할 때 성능(시간, 논리/물리 I/O, 공간 사용량) 차이를 측정 -- 구성: 하나의 테이블에 LOB 컬럼 2개(DOC_A, DOC_B)를 두어, --       컬럼별로 다...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=== LOB ENABLE STORAGE IN ROW 성능 비교 테스트 ===&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- ============================================================&lt;br /&gt;
-- LOB ENABLE STORAGE IN ROW 성능 비교 테스트&lt;br /&gt;
-- 목적: 4000byte 이하(인라인) vs 4000byte 초과(아웃오브라인) 데이터를&lt;br /&gt;
--       삽입/조회할 때 성능(시간, 논리/물리 I/O, 공간 사용량) 차이를 측정&lt;br /&gt;
-- 구성: 하나의 테이블에 LOB 컬럼 2개(DOC_A, DOC_B)를 두어,&lt;br /&gt;
--       컬럼별로 다른 CHUNK/FREEPOOLS 설정을 줘도 비교할 수 있게 함&lt;br /&gt;
-- 실행: sqlplus 계정/비번@dsn @lob_inrow_perf_test.sql&lt;br /&gt;
-- ============================================================&lt;br /&gt;
&lt;br /&gt;
SET SERVEROUTPUT ON SIZE UNLIMITED&lt;br /&gt;
SET TIMING ON&lt;br /&gt;
SET LINESIZE 200&lt;br /&gt;
SET PAGESIZE 100&lt;br /&gt;
&lt;br /&gt;
-- ------------------------------------------------------------&lt;br /&gt;
-- 0. 기존 오브젝트 정리 (재실행 대비)&lt;br /&gt;
-- ------------------------------------------------------------&lt;br /&gt;
BEGIN&lt;br /&gt;
    EXECUTE IMMEDIATE &amp;#039;DROP TABLE PERF_TEST_LOB2 PURGE&amp;#039;;&lt;br /&gt;
EXCEPTION&lt;br /&gt;
    WHEN OTHERS THEN&lt;br /&gt;
        IF SQLCODE != -942 THEN RAISE; END IF;  -- ORA-00942: 테이블 없음은 무시&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
-- ------------------------------------------------------------&lt;br /&gt;
-- 1. 테스트 테이블 생성 (LOB 컬럼 2개, ENABLE STORAGE IN ROW)&lt;br /&gt;
--    DOC_A / DOC_B에 CHUNK를 다르게 줘서 컬럼별 영향도 비교도 가능&lt;br /&gt;
-- ------------------------------------------------------------&lt;br /&gt;
CREATE TABLE PERF_TEST_LOB2 (&lt;br /&gt;
    id           NUMBER          NOT NULL,&lt;br /&gt;
    size_group   VARCHAR2(10)    NOT NULL,   -- &amp;#039;SMALL&amp;#039; (&amp;lt;=4000B) / &amp;#039;LARGE&amp;#039; (&amp;gt;4000B)&lt;br /&gt;
    created_date DATE            DEFAULT SYSDATE,&lt;br /&gt;
    doc_a        CLOB,&lt;br /&gt;
    doc_b        CLOB,&lt;br /&gt;
    CONSTRAINT pk_perf_test_lob2 PRIMARY KEY (id)&lt;br /&gt;
)&lt;br /&gt;
LOB (doc_a) STORE AS SECUREFILE doc_a_lseg (&lt;br /&gt;
    TABLESPACE users&lt;br /&gt;
    ENABLE STORAGE IN ROW&lt;br /&gt;
    CHUNK 8192&lt;br /&gt;
    NOCACHE&lt;br /&gt;
    NOLOGGING&lt;br /&gt;
)&lt;br /&gt;
LOB (doc_b) STORE AS SECUREFILE doc_b_lseg (&lt;br /&gt;
    TABLESPACE users&lt;br /&gt;
    ENABLE STORAGE IN ROW&lt;br /&gt;
    CHUNK 8192&lt;br /&gt;
    NOCACHE&lt;br /&gt;
    NOLOGGING&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- ------------------------------------------------------------&lt;br /&gt;
-- 2. 세션 I/O 통계 측정용 헬퍼 프로시저&lt;br /&gt;
--    (V$SESSTAT 기반으로 논리적/물리적 읽기 변화량을 계산)&lt;br /&gt;
-- ------------------------------------------------------------&lt;br /&gt;
CREATE OR REPLACE PROCEDURE PRINT_SESS_IO_DELTA (&lt;br /&gt;
    p_label     IN VARCHAR2,&lt;br /&gt;
    p_start_lio IN NUMBER,&lt;br /&gt;
    p_start_pio IN NUMBER&lt;br /&gt;
) IS&lt;br /&gt;
    v_lio NUMBER;&lt;br /&gt;
    v_pio NUMBER;&lt;br /&gt;
BEGIN&lt;br /&gt;
    SELECT ss.value INTO v_lio&lt;br /&gt;
    FROM v$sesstat ss, v$statname sn&lt;br /&gt;
    WHERE ss.sid = SYS_CONTEXT(&amp;#039;USERENV&amp;#039;,&amp;#039;SID&amp;#039;)&lt;br /&gt;
      AND ss.statistic# = sn.statistic#&lt;br /&gt;
      AND sn.name = &amp;#039;session logical reads&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    SELECT ss.value INTO v_pio&lt;br /&gt;
    FROM v$sesstat ss, v$statname sn&lt;br /&gt;
    WHERE ss.sid = SYS_CONTEXT(&amp;#039;USERENV&amp;#039;,&amp;#039;SID&amp;#039;)&lt;br /&gt;
      AND ss.statistic# = sn.statistic#&lt;br /&gt;
      AND sn.name = &amp;#039;physical reads&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    DBMS_OUTPUT.PUT_LINE(&lt;br /&gt;
        RPAD(p_label, 28) ||&lt;br /&gt;
        &amp;#039; logical_reads(delta)=&amp;#039; || LPAD(v_lio - p_start_lio, 10) ||&lt;br /&gt;
        &amp;#039;  physical_reads(delta)=&amp;#039; || LPAD(v_pio - p_start_pio, 10)&lt;br /&gt;
    );&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION GET_SESS_LIO RETURN NUMBER IS&lt;br /&gt;
    v NUMBER;&lt;br /&gt;
BEGIN&lt;br /&gt;
    SELECT ss.value INTO v&lt;br /&gt;
    FROM v$sesstat ss, v$statname sn&lt;br /&gt;
    WHERE ss.sid = SYS_CONTEXT(&amp;#039;USERENV&amp;#039;,&amp;#039;SID&amp;#039;)&lt;br /&gt;
      AND ss.statistic# = sn.statistic#&lt;br /&gt;
      AND sn.name = &amp;#039;session logical reads&amp;#039;;&lt;br /&gt;
    RETURN v;&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION GET_SESS_PIO RETURN NUMBER IS&lt;br /&gt;
    v NUMBER;&lt;br /&gt;
BEGIN&lt;br /&gt;
    SELECT ss.value INTO v&lt;br /&gt;
    FROM v$sesstat ss, v$statname sn&lt;br /&gt;
    WHERE ss.sid = SYS_CONTEXT(&amp;#039;USERENV&amp;#039;,&amp;#039;SID&amp;#039;)&lt;br /&gt;
      AND ss.statistic# = sn.statistic#&lt;br /&gt;
      AND sn.name = &amp;#039;physical reads&amp;#039;;&lt;br /&gt;
    RETURN v;&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
-- ------------------------------------------------------------&lt;br /&gt;
-- 3. 테스트 1: SMALL 그룹 삽입 (각 LOB 3900byte, 4000byte 미만 -&amp;gt; 인라인)&lt;br /&gt;
-- ------------------------------------------------------------&lt;br /&gt;
DECLARE&lt;br /&gt;
    v_start_time   NUMBER;&lt;br /&gt;
    v_start_lio    NUMBER;&lt;br /&gt;
    v_start_pio    NUMBER;&lt;br /&gt;
    v_row_count    PLS_INTEGER := 2000;   -- 필요에 따라 조정&lt;br /&gt;
    v_small_text   CLOB;&lt;br /&gt;
BEGIN&lt;br /&gt;
    v_small_text := RPAD(&amp;#039;A&amp;#039;, 3900, &amp;#039;A&amp;#039;);   -- 3900byte, 4000byte 임계치 이하&lt;br /&gt;
&lt;br /&gt;
    v_start_time := DBMS_UTILITY.GET_TIME;&lt;br /&gt;
    v_start_lio  := GET_SESS_LIO;&lt;br /&gt;
    v_start_pio  := GET_SESS_PIO;&lt;br /&gt;
&lt;br /&gt;
    FOR i IN 1 .. v_row_count LOOP&lt;br /&gt;
        INSERT INTO PERF_TEST_LOB2 (id, size_group, doc_a, doc_b)&lt;br /&gt;
        VALUES (i, &amp;#039;SMALL&amp;#039;, v_small_text, v_small_text);&lt;br /&gt;
    END LOOP;&lt;br /&gt;
    COMMIT;&lt;br /&gt;
&lt;br /&gt;
    DBMS_OUTPUT.PUT_LINE(&amp;#039;=== [SMALL] &amp;#039; || v_row_count || &amp;#039;건 INSERT ===&amp;#039;);&lt;br /&gt;
    DBMS_OUTPUT.PUT_LINE(&amp;#039;경과시간(centisec): &amp;#039; || (DBMS_UTILITY.GET_TIME - v_start_time));&lt;br /&gt;
    PRINT_SESS_IO_DELTA(&amp;#039;SMALL INSERT I/O&amp;#039;, v_start_lio, v_start_pio);&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
-- ------------------------------------------------------------&lt;br /&gt;
-- 4. 테스트 2: LARGE 그룹 삽입 (각 LOB 8000byte, 4000byte 초과 -&amp;gt; 아웃오브라인)&lt;br /&gt;
-- ------------------------------------------------------------&lt;br /&gt;
DECLARE&lt;br /&gt;
    v_start_time   NUMBER;&lt;br /&gt;
    v_start_lio    NUMBER;&lt;br /&gt;
    v_start_pio    NUMBER;&lt;br /&gt;
    v_row_count    PLS_INTEGER := 2000;&lt;br /&gt;
    v_large_text   CLOB;&lt;br /&gt;
BEGIN&lt;br /&gt;
    v_large_text := RPAD(&amp;#039;B&amp;#039;, 8000, &amp;#039;B&amp;#039;);   -- 8000byte, 4000byte 임계치 초과&lt;br /&gt;
&lt;br /&gt;
    v_start_time := DBMS_UTILITY.GET_TIME;&lt;br /&gt;
    v_start_lio  := GET_SESS_LIO;&lt;br /&gt;
    v_start_pio  := GET_SESS_PIO;&lt;br /&gt;
&lt;br /&gt;
    FOR i IN 1 .. v_row_count LOOP&lt;br /&gt;
        INSERT INTO PERF_TEST_LOB2 (id, size_group, doc_a, doc_b)&lt;br /&gt;
        VALUES (2000 + i, &amp;#039;LARGE&amp;#039;, v_large_text, v_large_text);&lt;br /&gt;
    END LOOP;&lt;br /&gt;
    COMMIT;&lt;br /&gt;
&lt;br /&gt;
    DBMS_OUTPUT.PUT_LINE(&amp;#039;=== [LARGE] &amp;#039; || v_row_count || &amp;#039;건 INSERT ===&amp;#039;);&lt;br /&gt;
    DBMS_OUTPUT.PUT_LINE(&amp;#039;경과시간(centisec): &amp;#039; || (DBMS_UTILITY.GET_TIME - v_start_time));&lt;br /&gt;
    PRINT_SESS_IO_DELTA(&amp;#039;LARGE INSERT I/O&amp;#039;, v_start_lio, v_start_pio);&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
-- 통계 최신화 (조회 테스트 전 필수)&lt;br /&gt;
EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, &amp;#039;PERF_TEST_LOB2&amp;#039;, CASCADE =&amp;gt; TRUE);&lt;br /&gt;
&lt;br /&gt;
-- ------------------------------------------------------------&lt;br /&gt;
-- 5. 조회 성능 비교: SMALL 그룹 vs LARGE 그룹 (LOB 길이 합산으로 실제 LOB 접근 유도)&lt;br /&gt;
-- ------------------------------------------------------------&lt;br /&gt;
DECLARE&lt;br /&gt;
    v_start_time NUMBER;&lt;br /&gt;
    v_start_lio  NUMBER;&lt;br /&gt;
    v_start_pio  NUMBER;&lt;br /&gt;
    v_sum_len    NUMBER;&lt;br /&gt;
BEGIN&lt;br /&gt;
    -- SMALL 그룹 조회&lt;br /&gt;
    v_start_time := DBMS_UTILITY.GET_TIME;&lt;br /&gt;
    v_start_lio  := GET_SESS_LIO;&lt;br /&gt;
    v_start_pio  := GET_SESS_PIO;&lt;br /&gt;
&lt;br /&gt;
    SELECT SUM(DBMS_LOB.GETLENGTH(doc_a) + DBMS_LOB.GETLENGTH(doc_b))&lt;br /&gt;
    INTO v_sum_len&lt;br /&gt;
    FROM PERF_TEST_LOB2&lt;br /&gt;
    WHERE size_group = &amp;#039;SMALL&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    DBMS_OUTPUT.PUT_LINE(&amp;#039;=== [SMALL] 전체 조회 (sum_len=&amp;#039; || v_sum_len || &amp;#039;) ===&amp;#039;);&lt;br /&gt;
    DBMS_OUTPUT.PUT_LINE(&amp;#039;경과시간(centisec): &amp;#039; || (DBMS_UTILITY.GET_TIME - v_start_time));&lt;br /&gt;
    PRINT_SESS_IO_DELTA(&amp;#039;SMALL SELECT I/O&amp;#039;, v_start_lio, v_start_pio);&lt;br /&gt;
&lt;br /&gt;
    -- LARGE 그룹 조회&lt;br /&gt;
    v_start_time := DBMS_UTILITY.GET_TIME;&lt;br /&gt;
    v_start_lio  := GET_SESS_LIO;&lt;br /&gt;
    v_start_pio  := GET_SESS_PIO;&lt;br /&gt;
&lt;br /&gt;
    SELECT SUM(DBMS_LOB.GETLENGTH(doc_a) + DBMS_LOB.GETLENGTH(doc_b))&lt;br /&gt;
    INTO v_sum_len&lt;br /&gt;
    FROM PERF_TEST_LOB2&lt;br /&gt;
    WHERE size_group = &amp;#039;LARGE&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    DBMS_OUTPUT.PUT_LINE(&amp;#039;=== [LARGE] 전체 조회 (sum_len=&amp;#039; || v_sum_len || &amp;#039;) ===&amp;#039;);&lt;br /&gt;
    DBMS_OUTPUT.PUT_LINE(&amp;#039;경과시간(centisec): &amp;#039; || (DBMS_UTILITY.GET_TIME - v_start_time));&lt;br /&gt;
    PRINT_SESS_IO_DELTA(&amp;#039;LARGE SELECT I/O&amp;#039;, v_start_lio, v_start_pio);&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
-- ------------------------------------------------------------&lt;br /&gt;
-- 6. 실제 인라인/아웃오브라인 여부 확인 (LOB 세그먼트 공간 사용량 기준)&lt;br /&gt;
--    -&amp;gt; 인라인 저장분은 LOB 세그먼트를 거의 소비하지 않고,&lt;br /&gt;
--       아웃오브라인 저장분은 LOB 세그먼트 공간을 그만큼 소비함&lt;br /&gt;
-- ------------------------------------------------------------&lt;br /&gt;
COLUMN segment_name FORMAT A20&lt;br /&gt;
COLUMN mb FORMAT 999,999.99&lt;br /&gt;
&lt;br /&gt;
SELECT ds.segment_name, ds.segment_type, ROUND(ds.bytes/1024/1024, 2) AS mb&lt;br /&gt;
FROM dba_segments ds&lt;br /&gt;
WHERE ds.owner = USER&lt;br /&gt;
  AND ds.segment_name IN (&lt;br /&gt;
        SELECT segment_name FROM dba_lobs&lt;br /&gt;
        WHERE owner = USER AND table_name = &amp;#039;PERF_TEST_LOB2&amp;#039;&lt;br /&gt;
      )&lt;br /&gt;
ORDER BY ds.segment_name;&lt;br /&gt;
&lt;br /&gt;
-- LOB 세그먼트 상세 설정 확인&lt;br /&gt;
SELECT column_name, segment_name, chunk, in_row, securefile, cache&lt;br /&gt;
FROM dba_lobs&lt;br /&gt;
WHERE owner = USER AND table_name = &amp;#039;PERF_TEST_LOB2&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
-- ------------------------------------------------------------&lt;br /&gt;
-- 7. (선택) FREEPOOLS/CHUNK 값을 바꿔가며 재테스트하고 싶을 때&lt;br /&gt;
--    아래처럼 MOVE로 컬럼별 설정을 바꾼 뒤 3~6번을 재실행해서 비교&lt;br /&gt;
-- ------------------------------------------------------------&lt;br /&gt;
-- ALTER TABLE PERF_TEST_LOB2 MOVE LOB (doc_a) STORE AS (CHUNK 32768 FREEPOOLS 4);&lt;br /&gt;
-- ALTER TABLE PERF_TEST_LOB2 MOVE LOB (doc_b) STORE AS (CHUNK 32768 FREEPOOLS 4);&lt;br /&gt;
&lt;br /&gt;
-- ------------------------------------------------------------&lt;br /&gt;
-- 8. 정리 (재테스트 전 초기화하고 싶을 때)&lt;br /&gt;
-- ------------------------------------------------------------&lt;br /&gt;
-- TRUNCATE TABLE PERF_TEST_LOB2;&lt;br /&gt;
-- DROP TABLE PERF_TEST_LOB2 PURGE;&lt;br /&gt;
-- DROP FUNCTION GET_SESS_LIO;&lt;br /&gt;
-- DROP FUNCTION GET_SESS_PIO;&lt;br /&gt;
-- DROP PROCEDURE PRINT_SESS_IO_DELTA;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Oracle</name></author>
	</entry>
</feed>