메뉴 건너뛰기

bysql.net

9. Static vs. Dynamic SQL

2010.07.04 05:43

balto 조회 수:18342

- Static vs Dynamic SQL 문에 따라 하드파싱 횟수에 영향을 끼친다.


Static SQL

- SQL 문을 string 형 변수에 담지 않고 코드에 직접 기술한 경우(Embedded SQL)

(예) *.pc 프로그램

EXEC SQL select * from emp where empno=:empno;

- *.pc 프로그램은 *.c 프로그램으로 precompile되고 다시 C 컴파일러로 compile된다.

- *.pc 프로그램내 SQL문에 오류가 있으면 컴파일타임에 오류를 발생한다.

- proc test.pc sqlcheck=syntax (문법만 체크)

- proc test.pc sqlcheck=full userid=scott/tiger (semantic도 체크, -> 테이블존재여부 등 점검)


Dynamic SQL

- SQL 문을 string 형 변수에 담아 기술한 경우(Embedded SQL)

(예) *.pc 프로그램

char select_stmt [50] = "select * from emp where empno=:empno";

- *syntax, semantics 체크가 불가능하므로 precompiler가 처리하지 않는다.

- 스칼라서브쿼리, 분석함수, ANSI 조인문 등은 Static SQL 문으로는 오류가 발생하므로 Dynamic SQL 문을 사용하면 된다.

- Pro*C에서 제공하는 Dynamic SQL도 dynamic 정도에 따라 다음 4가지로 구분된다.

(1) 입력 호스트 변수없는 Non-query

(예) 'delete from emp where deptno=20'

(2) 입력 호스트 변수가 고정적인 Non-query

(예) 'delete from emp where deptno=:deptno'

(3) select-list 컬럼 개수와 입력 호스트 변수가 고정적인 query

(예) 'select deptno, max(sal) from emp group by deptno'

(예) 'select ename, empno from emp where deptno=:deptno'

(4) select-list 컬럼 개수와 입력 호스트 변수가 가변적인 query

(예) 'insert into emp (<unknown>) values (<unknown>)'

(예) 'select <unknown> from emp where deptno=:deptno'


일반적인 프로그램 언어에서 SQL 작성법

- Java, Delphi, Visual Basic 언어에서는 모두 string 변수에 SQL 문을 치환한다.

   => 이들 언어는 모두 Dynamic SQL 문이다.

- Toad, Orange, SQL*Plus에서의 ad-hoc SQL은 모두 Dynamic SQL 이다.

- Static SQL을 지원하는 개발 언어로는 PowerBuilder, PL/SQL, Pro*C, SQLJ가 있다.


DBMS에서 SQL 처리

- Static SQL, Dynamic SQL은 응용 개발 측면에서의 구분이고 데이터베이스 입장에서는 차이가 없다 ?.

- PL/SQL, Pro*C에서 Static SQL일 경우 애플리케이션 커서 캐싱을 사용할 수 있다.

- 애플리케이션 커서 캐싱 기능을 사용하지 않는다면 Dynamic, Static 구분은 라이브러리 캐시 효율과 무관하다.

- 라이브러리 캐시 효율은 바인드 변수 사용 여부와 관계있다.

   => Dynamic SQL 사용 문제가 아니고 바인드 변수를 사용해야 효율적이다.