2. SQL 처리과정
2010.06.27 22:24
[SQL 처리 과정 ]

- 소프트 파싱 (Soft Parsing)
- SQL 커서를 메모리에서 찾아 곧바로 실행단계로 넘어가는것
- 하드 파싱(Hard Parsing)
- SQL커서가 메모리에 없을경우(라이브러리 캐시 Miss) 최적화 및 Row-Source 생성 단계후 실행
SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSENO_PARALLEL(SAMPLESUB) opt_param('parallel_execution_enabled', 'false')NO_PARALLEL_INDEX(SAMPLESUB) NO_SQL_TUNE */ NVL(SUM(C1),:"SYS_B_0"),NVL(SUM(C2),:"SYS_B_1")FROM(SELECT /*+ NO_PARALLEL("PLAN_TABLE") FULL("PLAN_TABLE")NO_PARALLEL_INDEX("PLAN_TABLE") */ :"SYS_B_2" AS C1, :"SYS_B_3" AS C2 FROM"SYS"."PLAN_TABLE$" "PLAN_TABLE") SAMPLESUBcall count cpu elapsed disk query current rows------- ------ -------- ---------- ---------- ---------- ---------- ----------Parse 6 0.00 0.01 0 0 0 0Execute 6 0.01 0.02 0 0 0 0Fetch 6 0.00 0.00 0 24 0 6------- ------ -------- ---------- ---------- ---------- ---------- ----------total 18 0.01 0.04 0 24 0 6Misses in library cache during parse: 3Misses in library cache during execute: 3Optimizer mode: ALL_ROWS6번의 Parse Call 중 3번의 하드 파싱 발생
(1) SQL 파싱
- SQL 파서
- 사용자가 실행한 SQL을 가장 먼저 받아서 처리하는 엔진
- 파싱 과정
- Syntax 채크
- SQL 의 문법적 오류 체크 - 사용 불가능한 키워드, 올바르지 않은 순서, 키워드 누락등 채크
- Semantic 채크
- 존재 하지 않거나 권한 없는 오브잭트 사용 유무, 존재 하지 않은 컬럼 참조 유무
- Shared Pool 캐싱확인
- SQL ASCII텍스트를 해싱값으로 변환후 사용자, 옵티마이저값을 참조하여 Shared Pool 에서 기존 사용 커서 찾음
- SQL 문이 없거나 새로운 SQL를 생성해야 한다면 최적화 수행을 위해 최적화 수행 (옵티마이져)
(2) SQL 최적화
- 옵티마이져
- 통계정보 ( 시스템, 오브젝트) 를 기준으로 다양한 ACCESS PATH를 비교한후 가장 효율적인 실행계획을 생성해주는 DBMS의 핵심 엔진
- 옵티마이저의 3가지 서브 엔진
- Query Transformer
- 동일한 결과를 보장하는 최적화하기 쉬운쿼리로 변환
- Plan Generator
- 쿼리 수행시 수행 가능한 실행계획들을 생성
- Estimator
- 선택도, 카디널리티, 비용등의 예상치 계산 (각 단계 수행시 필요한 I/O,CPU,메모리 사용등을 예측)
- 최적화 수행 시간 단축을 위한 테크닉
- Adaptive search strategy(적응적 탐색전략)
- 쿼리 수행시 예상되는 총 수행시간에 비해 쿠리 최적화에 걸리는 시간이 일정비율을 넘지않도록 하는것
- Multiple Initial orderings heuristic
- 최적의 실행계획을 발견한 가능성이 높은 순서대로 비용을 평가
2005년 6월 오라클 백서 , Query Optimization in Oracle Database 10g Release2
(3) Row-Source Generation
- 촤적화 과정을 거친 실행계획을 실행가능한 코드 또는 프로시저 형태로 포멧팅
실행계획
Execution Plan
--------------------------------------------------0 SELECT STATEMENT Optimizer=ALL_ROWS1 0 NESTED LOOPS2 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'3 2 INDEX (RANGE SCAN) OF 'DEPT_X01' (NON-UNIQUE)4 1 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'5 4 INDEX (RANGE SCAN) OF 'EMP_X01' (NON-UNIQUE)
내부수행코드
<<outer_loop>>LOOPouter_rid := index_range_scan ('DEPT_X01',search_key);outer_rec:=table_access_by_index_rowid('DEPT',outer_rid);EXIT outer_loop WHEN outer_rec IS NULL;<<inner_loop>>LOOPinner_rid :=index_range_SCAN ('EMP_X01',outer_rec.deptino);inner_rec :=table_access_by_index_rowid ('EMP',inner_rid);EXIT inner_loop WHEN inner_rec IS NULL;add_into_resultset(outer-rec,inner_rec);selected_rows := selected_rows +1;END LOOP inner_loop;END LOOP outer_loop;DBMS_OUTPUT.PUT_LINE(selected_rows || 'rows selected.');
- 데이타 처리의 대부분의 과정은 I/O에 집중되지만
- 하드 파싱이 발생하면 CPU 소비가 많아진다.
( Shared Pool 과 라이브러리 캐시에 대해 래치경합발생, 데이터 딕셔네리 죄회등의 작업이 수반됨)
참고: 오라클 옵티마이저의 원리(02winter_optimizer.pdf)
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
47 |
2. 트랜잭션 수준 읽기 일관성
![]() | 휘휘 | 2010.06.06 | 20213 |
46 | 3. 비관적 vs. 낙관적 동시성 제어 | 휘휘 | 2010.06.06 | 8329 |
45 | 4. 동시성 구현 사례 | 토시리 | 2010.06.06 | 11079 |
44 |
5. 오라클 Lock
![]() | 휘휘 | 2010.06.06 | 26512 |
43 |
7. Response Time Analysis 방법론과 OWI
![]() | balto | 2010.06.13 | 8202 |
42 | 8. Statspack / AWR | balto | 2010.06.13 | 12910 |
41 | 9. ASH(Active Session History) | 실천하자 | 2010.06.13 | 15731 |
40 | 11. End-To-End 성능관리 | 휘휘 | 2010.06.13 | 8248 |
39 |
12. 데이터베이스 성능 고도화 정석 해법
![]() | 휘휘 | 2010.06.13 | 7248 |
38 |
5. V$SYSSTAT
[1] ![]() | 토시리 | 2010.06.13 | 9977 |
37 | 10. V$SQL | 실천하자 | 2010.06.13 | 12803 |
36 | 6. V$SYSTEM_EVENT | 토시리 | 2010.06.14 | 6641 |
35 |
3. 라이브러리 캐시 구조
![]() | balto | 2010.06.27 | 9957 |
34 |
4. 커서 공유
![]() | balto | 2010.06.27 | 9324 |
33 |
1. SQL과 옵티마이저
![]() | 휘휘 | 2010.06.27 | 7326 |
» |
2. SQL 처리과정
![]() | 휘휘 | 2010.06.27 | 20929 |
31 | 4장. 라이브러리 캐시 최적화 원리 | 휘휘 | 2010.06.27 | 7032 |
30 | 5. 바인드 변수의 중요성 | 실천하자 | 2010.06.27 | 11862 |
29 |
6. 바인드 변수의 부작용과 해법
![]() | 실천하자 | 2010.06.27 | 14868 |
28 |
7. 세션 커서 캐싱
![]() | 토시리 | 2010.06.29 | 10711 |