트러블슈팅 오라클 퍼포먼스 2판 (2017년)
로우 프리페칭과 배열 처리 인터페이스 0 0 20,253

by 구루비스터디 ROW PREFETCHING 배열 처리 [2023.09.09]


로우 프리페칭

ROW PREFETCHING

  • 하나의 로우 요청 한번에 여러 로우를 미리 가져오는 것


PL/SQL 에서 프리 페칭



-- 커서를 이용한 FOR LOOP 문에서는 자동 프리페치(100 row)
BEGIN
    FOR c IN (SELECT * FROM t)
    LOOP
        -- 데이터 처리
        NULL;
    END LOOP;
END;
-- 다른 유형의 커서에서는 bulk collect into 사용
DECLARE
    TYPE t_t IS TABLE OF t%ROWTYPE;
    l_t t_t;
BEGIN
    SELECT * BULK COLLECT INTO l_t FROM t;
    FOR i IN l_t.FIRST..l_t.LAST
    LOOP
        -- 데이터 처리
        NULL;
    END LOOP;
END;
/
DECLARE
    CURSOR c IS SELECT * FROM t;
    TYPE t_t IS TABLE OF t%ROWTYPE;
    l_t t_t;
BEGIN
    OPEN c;
    LOOP
        FETCH c BULK COLLECT INTO l_t LIMIT 100;
        EXIT WHEN l_t.COUNT = 0;
        FOR i IN l_t.FIRST..l_t.LAST
            -- 데이터 처리
            NULL;
        END LOOP;
    END LOOP;
    CLOSE c;
END;
/


배열처리 인터페이스

array interface

  • 단순 값이 아닌 배열을 바인드 할 수 있다.


PL/SQL 에서 배열처리



DECLARE
    TYPE t_id  IS TABLE OF t.id%TYPE;
    TYPE t_pad IS TABLE OF t.pad%TYPE;
    l_id  t_id  := t_id();
    l_pad t_pad := t_pad();
BEGIN
    -- 데이터 준비
    l_id.EXTEND(100000);
    l_pad.EXTEND(100000);
    FOR i IN 1..100000
    LOOP
        l_id(i)  := i;
        l_pad(i) := RPAD('*', 100, '*');
    END LOOP;
    -- 데이터 입력
    FORALL i IN l_id.FIRST..l_id.LAST
        INSERT INTO t VALUES (l_id(i), l_pad(i));
END;

-- FORALL 이 사용되었다는 것이 루프를 의미하지는 않는다
-- 단 한번의 호출로 모든 로우가 전달된다.


"데이터베이스 스터디모임" 에서 2017년에 "전문가를 위한 트러블슈팅 오라클 퍼포먼스(Second Edition) " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/4402

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입