더북(TheBook)

RESULT CACHE 함수 사용

그럼 실제로 RESULT CACHE 기능이 탑재된 함수를 만들어 보자.

입력

    CREATE OR REPLACE FUNCTION fn_get_depname_rsltcache ( pv_dept_id VARCHAR2 )
      RETURN VARCHAR2
      RESULT_CACHE
      RELIES_ON ( DEPARTMENTS )
    IS
      vs_dep_name DEPARTMENTS.DEPARTMENT_NAME%TYPE;
    BEGIN

      SELECT department_name
        INTO vs_dep_name
        FROM DEPARTMENTS
       WHERE department_id = pv_dept_id;

      RETURN vs_dep_name;

    EXCEPTION WHEN OTHERS THEN
      RETURN '';

    END;

결과

    FUNCTION FN_GET_DEPNAME_RSLTCACHE이(가) 컴파일되었습니다.

이제 FN_GET_DEPNAME_RSLTCACHE 함수를 사용해 보자.

입력

    DECLARE
      vn_cnt        NUMBER := 0;
      vd_sysdate    DATE;
      vn_total_time NUMBER := 0;

    BEGIN
      vd_sysdate := SYSDATE;
      -- RESULT CACHE 기능이 탑재된 함수 호출
      UPDATE emp_bulk
      SET dep_name = fn_get_depname_rsltcache ( department_id )
      WHERE bulk_id BETWEEN 1 AND 1000;

      vn_cnt := SQL%ROWCOUNT;

      COMMIT;

      -- 총 소요 시간 계산(초로 계산하기 위해 60 * 60 * 24을 곱함)
      vn_total_time := (SYSDATE - vd_sysdate) * 60 * 60 * 24;

      -- UPDATE 건수 출력
      DBMS_OUTPUT.PUT_LINE('전체건수 : ' || vn_cnt);
      -- 총 소요 시간 출력
      DBMS_OUTPUT.PUT_LINE('소요시간 : ' || vn_total_time);

    END;

결과

    전체건수 : 108000
    소요 시간 : 3

fn_get_depname_normal 함수를 사용했을 때는 8초였지만 fn_get_depname_rsltcache 함수를 사용하니 대략 3초가 소요되었다. 성능 향상 효과를 분명히 확인할 수 있다. 그리고 V\$RESULT_CACHE_STATISTICS라는 시스템 뷰를 보면 RESULT CACHE에 대한 통계 정보를 알 수 있다.

입력

    SELECT *
      FROM V$RESULT_CACHE_STATISTICS;

결과

위 결과에서 ‘Create Count Success’란 항목의 값이 12인데 이는 emp_bulk 테이블에서 NULL을 포함한 부서번호 값의 종류인 12개와 일치한다. 이 항목은 성공적으로 생성된 캐시 결과 수를 의미한다. 그리고 ‘Find Count’ 항목은 RESULT 캐시에서 성공적으로 데이터를 찾은 수를 의미한다.

지금까지 내용을 정리하면 동일한 매개변수를 전달해 동일한 결과 값을 받는 함수를 사용하려면 가급적 RESULT CACHE 기능을 이용하는 것이 좋다. 하지만 아무리 RESULT CACHE 기능을 적용해도 대량의 데이터를 조회할 때 함수의 사용이 많아지면 성능은 떨어질 수 밖에 없다. 따라서 이럴 때는 함수 대신 조인문으로 변경한 뒤 SQL 튜닝을 하는 것이 좋다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.