9. Static vs. Dynamic SQL
2010.07.03 20: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 사용 문제가 아니고 바인드 변수를 사용해야 효율적이다.
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|
| 27 | 8. 애플리케이션 커서 캐싱 | 토시리 | 2010.06.29 | 17834 |
| » | 9. Static vs. Dynamic SQL [1] | balto | 2010.07.03 | 28849 |
| 25 | 10. Dynamic SQL 사용 기준 | balto | 2010.07.03 | 18857 |
| 24 |
11. Static SQL 구현을 위한 기법들
| 실천하자 | 2010.07.04 | 20131 |
| 23 |
4. Array Processing 활용
| 휘휘 | 2010.07.04 | 35132 |
| 22 | 1. Call 통계 | 실천하자 | 2010.07.04 | 19172 |
| 21 |
5. Fetch Call 최소화
| 휘휘 | 2010.07.05 | 27455 |
| 20 | 5장. 데이터베이스 Call 최소화 원리 | 휘휘 | 2010.07.05 | 16631 |
| 19 |
2. User Call vs. Recursive Call
| 토시리 | 2010.07.07 | 19502 |
| 18 |
3. 데이터베이스 Call이 성능에 미치는 영향
| 토시리 | 2010.07.07 | 21934 |
| 17 | 6장. I/O 효율화 원리 | 휘휘 | 2010.07.07 | 16958 |
| 16 |
4. Prefetch
| balto | 2010.07.10 | 39247 |
| 15 |
5. Direct Path I/O
| balto | 2010.07.10 | 22564 |
| 14 | 8. PL/SQL 함수 호출 부하 해소 방안 | 토시리 | 2010.07.11 | 24566 |
| 13 | 6. 페이지 처리의 중요성 | 실천하자 | 2010.07.11 | 17352 |
| 12 | 2. Memory vs. Disk I/O | 휘휘 | 2010.07.11 | 17734 |
| 11 | 3. Single Block vs. Multiblock I/O | 휘휘 | 2010.07.11 | 17744 |
| 10 | 7. PL/SQL 함수의 특징과 성능 부하 | 실천하자 | 2010.07.12 | 22965 |
| 9 |
1. 블록 단위 I/O
| 토시리 | 2010.07.12 | 19708 |
| 8 |
1. Library Cache Lock
| balto | 2010.07.17 | 23184 |
다이나믹 SQL
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Database/Book/ProcPrograming/8.Dynamic_SQL