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 | 6624 |
» | 9. Static vs. Dynamic SQL [1] | balto | 2010.07.03 | 18388 |
25 | 10. Dynamic SQL 사용 기준 | balto | 2010.07.03 | 8653 |
24 | 11. Static SQL 구현을 위한 기법들 | 실천하자 | 2010.07.04 | 12144 |
23 | 4. Array Processing 활용 | 휘휘 | 2010.07.04 | 18312 |
22 | 1. Call 통계 | 실천하자 | 2010.07.04 | 10474 |
21 | 5. Fetch Call 최소화 | 휘휘 | 2010.07.05 | 16902 |
20 | 5장. 데이터베이스 Call 최소화 원리 | 휘휘 | 2010.07.05 | 6107 |
19 | 2. User Call vs. Recursive Call | 토시리 | 2010.07.07 | 9063 |
18 | 3. 데이터베이스 Call이 성능에 미치는 영향 | 토시리 | 2010.07.07 | 11676 |
17 | 6장. I/O 효율화 원리 | 휘휘 | 2010.07.07 | 6430 |
16 | 4. Prefetch | balto | 2010.07.10 | 28472 |
15 | 5. Direct Path I/O | balto | 2010.07.10 | 12217 |
14 | 8. PL/SQL 함수 호출 부하 해소 방안 | 토시리 | 2010.07.11 | 14062 |
13 | 6. 페이지 처리의 중요성 | 실천하자 | 2010.07.11 | 6828 |
12 | 2. Memory vs. Disk I/O | 휘휘 | 2010.07.11 | 7453 |
11 | 3. Single Block vs. Multiblock I/O | 휘휘 | 2010.07.11 | 9183 |
10 | 7. PL/SQL 함수의 특징과 성능 부하 | 실천하자 | 2010.07.12 | 12624 |
9 | 1. 블록 단위 I/O | 토시리 | 2010.07.12 | 9403 |
8 | 1. Library Cache Lock | balto | 2010.07.17 | 12819 |
다이나믹 SQL
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Database/Book/ProcPrograming/8.Dynamic_SQL