반응형

parsing

  • soft parsing
    • 입력받은 sql이 이전에 실행된 적 있는지 메모리를 검사하고, 실행한 기록이 있으면 기존에 실행했던 방식으로 실행하는 것
  • hard parsing
    • 입력받은 sql이 이전에 실행된 적 없다면 어떤방식으로 처리할 것인지 실행계획을 세운 후 실행하는 것

SQL 처리 과정

  • SQL 입력 > 문법 검사 > SHARED POOL 안에 동일 SQL 실행 기록이 있는지 확인
  • 있음
  • 그냥 실행
  • 없음
  • 객체 및 컬럼에 대한 접근 권한 검사
  • 옵티마이저 모드에 따른 최적의 실행 계획 수립
  • SHARED POOL에 실행계획 저장
  • 실행

옵티마이저

  • 가장 효율적인 방법으로 SQL을 실행할 수 있도록 실행 계획을 세우는 DBMS의 핵심 엔진

규칙 기반 옵티마이저

  • RBO : Rule Based Optimizer
  • 처리 방식의 우선순위를 정해 놓고 우선순위가 앞서는 방식을 채택
    • ex) primary key로 조회가 full table scan 조회보다 우선순위가 높다
  • 우선순위가 정해져 있으므로 쿼리 실행 방식을 미리 예측할 수 있음
  • 오라클 10g 버전 이후부터는 지원하지 않음
  • Hint와 Hash Join을 사용할수 없다는 단점을 갖는다.

비용 기반 옵티마이저

  • CBO : Cost Based Optimizer
  • 각 실행 계획별 비용을 계산하여 최소의 비용을 사용하는 실행 계획을 채택

옵티마이저의 구성 요소

  • Query Transformer
    • parsing 과정을 거친 쿼리를 좀 더 나은 실행계획을 갖는 SQL로 변형하는 작업을 수행
  • Estimator
    • Query Transformer로부터 받은 SQL을 수행하는데 드는 총 비용을 계산
  • Plan Generator
    • Estimator로 계산된 값들을 토대로 여러 실행 계획들을 비교하여 최종 실행 계획을 선발

옵티마이저 모드

  • CHOOSE
    • 규칙 기반 옵티마이저를 사용할 것인지 비용 기반 옵티마이저를 사용할 것인지를 설정
    • 현재는 거의 사용하지 않음
  • FIRST_ROWS
    • 첫 건을 출력하는 데 걸리는 시간이 최소인 실행 계획을 채택하는 설정
    • 규칙 기반과 비용 기반 옵티마이저의 혼용 형태, 비권장
  • FIRST_ROWS_n
    • n건을 출력하는 데 걸리는 시간이 최소인 실행 계획을 채택하는 설정
    • FIRST_ROWS를 보완한 형태
  • ALL_ROWS
    • 모든 데이터를 출력하는데 걸리는 시간이 최소인 실행 계획을 채택하는 설정
    • ORACLE 10g 버전 이후로 이 설정이 디폴트

옵티마이저 파라미터

  • OPTIMIZER_MODE
    • 어떤 방식의 옵티마이저를 사용할지 설정
  • OPTIMIZER_DYNAMIC_SAMPLING
    • SQL PARSING 작업을 할 때 통계 정보가 없는 객체들을 자동으로 통계 정보를 수집할지 여부를 설정
  • OPTIM_PEEK_USER_BIND
    • 바인드 변수를 사용한 SQL의 실행 계획을 파라미터가 다른 동일한 SQL을 수행했을 때 그대로 사용하는 것을 BIND PEEKING이라 하는데 이것을 사용할지 여부를 설정

통계 정보

  • 실행 계획을 선택할 때 참고하는 자료
  • 테이블, 칼럼, 인덱스, 시스템 등 각각의 값이나 평균 수치 정보들을 나타냄
  • 적절한 시기에 갱신해주어야 참고자료로서 효용가치가 생김

통계 정보 생성 방법

  • ANALYZE 명령문
  • DBMS_STATS 패키지
    • 오라클에서 제공하는 방식
    • 병렬로 통계 정보 수집 가능
    • 파티션에 대한 글로벌 통계 수집 가능
    • 권장하는 방식
반응형

'Development > MySQL' 카테고리의 다른 글

[MySQL] Storage Engine  (0) 2020.12.29
[MySQL] Transaction Isolation Level  (0) 2020.12.29
[MySQL] 쿼리  (0) 2020.12.29
[MySQL] 설치하기  (0) 2019.09.29
[Database] 정규화  (0) 2018.07.15

+ Recent posts