반응형

1. Function Scalar Subquery 변경

ㅇ 서브쿼리의 위치에 따른 명칭
    - SELECT문에 있는 서브쿼리 : 스칼라 서브쿼리
    - FROM절에 있는 서브쿼리 : 인라인 뷰
    - WHERE절에 있는 서브쿼리 : 서브쿼리
ㅇ 스칼라 서브쿼리(Scala Subquery)
    - SELECT문에서 사용하는 서브쿼리로 1행만 반환

-- 1. 수정 전
SELECT PRODUCT_CD,
PRODUCT_NAME,
SUM(GET_AVG_STOCK(PRODUCT_CD, :B1, :B2)) AVG_STOCK
FROM PRODUCT
WHERE CATEGORY_CD = ’20’
GROUP BY PRODUCT_CD,
PRODUCT_NAME


-- 2. 수정 후(스칼라 서브쿼리 적용)
SELECT PRODUCT_CD,
PRODUCT_NAME,
SUM((SELECT GET_AVG_STOCK(PRODUCT_CD, :B1, :B2)
FROM DUAL
)) AVG_STOCK
FROM PRODUCT
WHERE CATEGORY_CD = ’20’
GROUP BY PRODUCT_CD,
PRODUCT_NAME
;

 

2. Deterministic Function 사용

입력값이 동일하면 리턴값도 받드시 동일한 함수에서 사용할 수 있는데 이점을 이용해서
함수가 반복 호출될때 이전에 호출한 값이 호출되면 함수가 호출되지 않고
바로 값을 되돌려 줘서 함수호출 부하를 줄이는 것이다.

  • Deterministic 키워드는, 함수의 입력 값이 같다면 출력값도 항상 같음을 선언하려는 데 목적이 있다.
  • 이러한 본래 의미를 무시하고 캐싱 효과를 얻을 목적으로 함부로 Deterministic 함수로 선언하면 안된다.

Good Bad
CREATE OR REPLACE FUNCTION f1 (
  p1 NUMBER
) RETURN NUMBER DETERMINISTIC
IS
BEGIN
  RETURN p1 * 2;
END;
/
CREATE OR REPLACE FUNCTION lookup (
  l_input NUMBER
) RETURN VARCHAR2 DETERMINISTIC
IS 
BEGIN
  select value into l_output from LookupTable where key = l_input;
END;
/

  • Deterministic Function의 Cache 기능은 10g에서부터 지원된다.
  • 이전 버전에서 이 효과를 누리려면 (Scalar) Subquery를 사용한다.
  • Cache는 Query Level이 아닌 Fetch Level에서 이루어진다.
  • 따라서 Cache 효과를 누리려면 Fetch Array Size를 크게 지정해야 한다.

  •  

    반응형
    LIST

    + Recent posts