메뉴 건너뛰기

bysql.net

9. Static vs. Dynamic SQL

2010.07.04 05:43

balto 조회 수:18343

- 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 사용 문제가 아니고 바인드 변수를 사용해야 효율적이다.


번호 제목 글쓴이 날짜 조회 수
67 Front Page file 운영자 2010.05.17 154865
66 1 장. 오라클 아키텍처 운영자 2010.05.20 17842
65 1. 기본 아키텍처 [1] file 휘휘 2010.05.23 19899
64 3. 버퍼 Lock [1] 휘휘 2010.05.24 15225
63 2. DB 버퍼 캐시 file 휘휘 2010.05.24 21916
62 4. Redo file 휘휘 2010.05.24 11314
61 9. Snapshot too old balto 2010.05.30 8100
60 10. 대기 이벤트 balto 2010.05.30 8010
59 7. Consistent vs. Current 모드 읽기 휘휘 2010.05.31 10537
58 8. 블록 클린아웃 휘휘 2010.05.31 12283
57 11. Shared Pool file 실천하자 2010.05.31 18511
56 5. Undo file 토시리 2010.05.31 18651
55 1. 트랜잭션 동시성 제어 실천하자 2010.05.31 8631
54 6. 문장수준 읽기 일관성 file 토시리 2010.06.01 10432
53 2장. 트랜잭션과 Lock 운영자 2010.06.01 6895
52 1. Explain Plan 실천하자 2010.06.06 14663
51 2. AutoTrace 실천하자 2010.06.06 8597
50 3장. 오라클 성능 관리 운영자 2010.06.06 6694
49 3. SQL 트레이스 file balto 2010.06.06 21175
48 4. DBMS_XPLAN 패키지 balto 2010.06.06 10461