정적 SQL의 이점
- 정적 SQL은 컴파일 시간에 검사된다.
- PL/SQL은 데이터 유형, 크기 등의 유효성을 검사한다.
- 종속성이 설정되고 데이터 사전에 유지된다.
- 데이터베이스 객체가 변경되더라도 코드가 자동으로 이 변화에 맞도록 진화한다.
- 정적 SQL은 한번 파싱된 후 여러번 실행된다.
- 정적 SQL이 보다 빠르다.
동적 SQL을 대체할 기회를 찾아라
CREATE OR REPLACE FUNCTION get_value_dyn(p_empno IN NUMBER, p_cname IN VARCHAR2)
RETURN VARCHAR2
AS
l_value VARCHAR2(4000);
BEGIN
EXECUTE IMMEDIATE
'SELECT ' || p_cname || ' FROM emp WHERE empno = :x'
INTO l_value
USING p_empno;
RETURN l_value;
END;
/
CREATE OR REPLACE FUNCTION get_value_static(p_empno IN NUMBER, p_cname IN VARCHAR2)
RETURN VARCHAR2
AS
l_value VARCHAR2(4000);
BEGIN
SELECT DECODE(UPPER(p_cname),'ENAME',ename
,'EMPNO',empno
,'HIREDATE',TO_CHAR(hiredate,'yyyymmdd') )
INTO l_value
FROM emp
WHERE empno = p_empno;
RETURN l_value;
END;
/
EXEC runstats_pkg.rs_start;
DECLARE
l_dummy VARCHAR2(30);
BEGIN
FOR i IN 1 .. 500
LOOP
FOR x IN (SELECT empno FROM emp)
LOOP
l_dummy := get_value_dyn(x.empno, 'ENAME');
l_dummy := get_value_dyn(x.empno, 'EMPNO');
l_dummy := get_value_dyn(x.empno, 'HIREDATE');
END LOOP;
END LOOP;
END;
/
EXEC runstats_pkg.rs_middle;
DECLARE
l_dummy VARCHAR2(30);
BEGIN
FOR i IN 1 .. 500
LOOP
FOR x IN (SELECT empno FROM emp)
LOOP
l_dummy := get_value_static(x.empno, 'ENAME');
l_dummy := get_value_static(x.empno, 'EMPNO');
l_dummy := get_value_static(x.empno, 'HIREDATE');
END LOOP;
END LOOP;
END;
/
EXEC runstats_pkg.rs_stop(1000);
Run1 ran in 1102 hsecs
Run2 ran in 703 hsecs
run 1 ran in 156.76% of the time
Name Run1 Run2 Diff
STAT...session cursor cache ya 21,003 4 -20,999
STAT...opened cursors cumulati 21,005 5 -21,000
STAT...parse count (total) 21,005 5 -21,000
LATCH.shared pool 63,565 21,566 -41,999
LATCH.library cache pin 127,062 43,064 -83,998
LATCH.library cache 127,087 43,088 -83,999
Run1 latches total versus runs -- difference and pct
Run1 Run2 Diff Pct
463,431 253,318 -210,113 182.94%
정적 SQL 요약
- 동적 SQL은 정적 SQL이 더이상 실용적이지 않을때, 즉, 수백줄의 코드 작성이 불가피할때에만 쓸수 있는 카드이다.
- 동적 SQL 작성시엔 DBMS_SQL 패키지를 이용하라
- DBMS_SQL 은 원시 동적 SQL에 없는 확장성을 높일 수 있는 가능성을 제공한다.
- DBMS_SQL 은 절차 API 이기 ?문에 한번 파스 여러번 실행을 제공한다.
- 극히 제한적으로 같은 동적 SQL문을 실행한다는 사실을 알고 있다면 원시 동적 SQL을 사용하는것이 좋다.