9. Static vs. Dynamic SQL
2010.07.04 05:43
- 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
![]() | 운영자 | 2010.05.17 | 154868 |
66 |
4. Prefetch
![]() | balto | 2010.07.10 | 28438 |
65 |
5. 오라클 Lock
![]() | 휘휘 | 2010.06.07 | 26368 |
64 |
2. DB 버퍼 캐시
![]() | 휘휘 | 2010.05.24 | 21919 |
63 |
3. SQL 트레이스
![]() | balto | 2010.06.06 | 21176 |
62 |
1. 기본 아키텍처
[1] ![]() | 휘휘 | 2010.05.23 | 19909 |
61 |
2. 트랜잭션 수준 읽기 일관성
![]() | 휘휘 | 2010.06.07 | 19568 |
60 |
5. Undo
![]() | 토시리 | 2010.05.31 | 18660 |
59 |
11. Shared Pool
![]() | 실천하자 | 2010.05.31 | 18512 |
» | 9. Static vs. Dynamic SQL [1] | balto | 2010.07.04 | 18347 |
57 |
4. Array Processing 활용
![]() | 휘휘 | 2010.07.05 | 18249 |
56 | 1 장. 오라클 아키텍처 | 운영자 | 2010.05.20 | 17850 |
55 |
5. Fetch Call 최소화
![]() | 휘휘 | 2010.07.05 | 16851 |
54 | 9. ASH(Active Session History) | 실천하자 | 2010.06.14 | 15608 |
53 |
2. SQL 처리과정
![]() | 휘휘 | 2010.06.28 | 15511 |
52 | 3. 버퍼 Lock [1] | 휘휘 | 2010.05.24 | 15232 |
51 |
6. 바인드 변수의 부작용과 해법
![]() | 실천하자 | 2010.06.28 | 14673 |
50 | 1. Explain Plan | 실천하자 | 2010.06.06 | 14666 |
49 | 8. PL/SQL 함수 호출 부하 해소 방안 | 토시리 | 2010.07.11 | 14029 |
48 | 7. Result 캐시 | 휘휘 | 2010.07.19 | 12969 |
다이나믹 SQL
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Database/Book/ProcPrograming/8.Dynamic_SQL