메뉴 건너뛰기

bysql.net

2. SQL 처리과정

2010.06.28 07:24

휘휘 조회 수:15340

[SQL 처리 과정 ]

seh2tsdM1zLJvRP8hxgOr6A.png


  • 소프트 파싱 (Soft Parsing) 
    • SQL 커서를 메모리에서 찾아 곧바로 실행단계로 넘어가는것
  • 하드 파싱(Hard Parsing) 
    • SQL커서가 메모리에 없을경우(라이브러리 캐시 Miss) 최적화 및 Row-Source 생성 단계후 실행




SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSE
  NO_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") SAMPLESUB


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        6      0.00       0.01          0          0          0           0
Execute      6      0.01       0.02          0          0          0           0
Fetch        6      0.00       0.00          0         24          0           6
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       18      0.01       0.04          0         24          0           6

Misses in library cache during parse: 3
Misses in library cache during execute: 3
Optimizer mode: ALL_ROWS


6번의 Parse Call 중 3번의 하드 파싱 발생



(1) SQL 파싱

  • SQL 파서 
    • 사용자가 실행한 SQL을 가장 먼저 받아서 처리하는 엔진
  • 파싱 과정
    1. Syntax 채크
      • SQL 의 문법적 오류 체크 - 사용 불가능한 키워드, 올바르지 않은 순서, 키워드 누락등 채크
    2. Semantic 채크
      • 존재 하지 않거나 권한 없는 오브잭트 사용 유무, 존재 하지 않은 컬럼 참조 유무
    3. Shared Pool 캐싱확인
      • SQL ASCII텍스트를 해싱값으로 변환후 사용자, 옵티마이저값을 참조하여  Shared Pool 에서 기존 사용 커서 찾음
      • SQL 문이 없거나 새로운 SQL를 생성해야 한다면 최적화 수행을 위해 최적화 수행 (옵티마이져)

(2) SQL 최적화

  • 옵티마이져
    • 통계정보 ( 시스템, 오브젝트) 를 기준으로 다양한 ACCESS PATH를 비교한후 가장 효율적인 실행계획을 생성해주는 DBMS의 핵심 엔진

  • 옵티마이저의 3가지 서브 엔진
    1. Query Transformer
      • 동일한 결과를 보장하는 최적화하기 쉬운쿼리로 변환
    2. Plan Generator 
      • 쿼리 수행시 수행 가능한 실행계획들을 생성
    3. Estimator 
      • 선택도, 카디널리티, 비용등의 예상치 계산 (각 단계 수행시 필요한 I/O,CPU,메모리 사용등을 예측)
  • 최적화 수행 시간 단축을 위한 테크닉
    1. Adaptive search strategy(적응적 탐색전략)
      • 쿼리 수행시 예상되는 총 수행시간에 비해 쿠리 최적화에 걸리는 시간이 일정비율을 넘지않도록 하는것
    2. Multiple Initial orderings heuristic
      • 최적의 실행계획을 발견한 가능성이 높은 순서대로 비용을 평가

         2005년 6월 오라클 백서 , Query Optimization in Oracle Database 10g Release2
        



(3) Row-Source Generation

  • 촤적화 과정을 거친 실행계획을 실행가능한 코드 또는 프로시저 형태로 포멧팅 


실행계획


Execution Plan

--------------------------------------------------
0    SELECT STATEMENT Optimizer=ALL_ROWS
1    0    NESTED LOOPS
2    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>>
LOOP
    outer_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>>
    LOOP
        inner_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)





번호 제목 글쓴이 날짜 조회 수
67 Front Page file 운영자 2010.05.17 154865
66 4. Prefetch file balto 2010.07.10 28434
65 5. 오라클 Lock file 휘휘 2010.06.07 26365
64 2. DB 버퍼 캐시 file 휘휘 2010.05.24 21916
63 3. SQL 트레이스 file balto 2010.06.06 21175
62 1. 기본 아키텍처 [1] file 휘휘 2010.05.23 19899
61 2. 트랜잭션 수준 읽기 일관성 file 휘휘 2010.06.07 19566
60 5. Undo file 토시리 2010.05.31 18648
59 11. Shared Pool file 실천하자 2010.05.31 18511
58 9. Static vs. Dynamic SQL [1] balto 2010.07.04 18343
57 4. Array Processing 활용 file 휘휘 2010.07.05 18238
56 1 장. 오라클 아키텍처 운영자 2010.05.20 17842
55 5. Fetch Call 최소화 file 휘휘 2010.07.05 16839
54 9. ASH(Active Session History) 실천하자 2010.06.14 15606
» 2. SQL 처리과정 file 휘휘 2010.06.28 15340
52 3. 버퍼 Lock [1] 휘휘 2010.05.24 15225
51 1. Explain Plan 실천하자 2010.06.06 14663
50 6. 바인드 변수의 부작용과 해법 file 실천하자 2010.06.28 14661
49 8. PL/SQL 함수 호출 부하 해소 방안 토시리 2010.07.11 14023
48 7. Result 캐시 휘휘 2010.07.19 12969