1. SQL은 구조적, 집합적, 선언적 언어
사용자가 SQL을 던지면, 옵티마이저가 실행계획을 짜서 프로시저를 작성한다.
이 과정이 SQL 최적화
2. SQL 최적화
: SQL 파싱 -> SQL 최적화 -> 로우 소스 생성
SQL 파싱 : 파싱 트리 생성, Syntax 체크, Semantic 체크
SQL 최적화 : 옵티마이저가 생선한 실행경로 중 효율적인 하나를 선택
로우 소스 생성 : 로우 소수 생성기가 옵티마이저가 선택한 실행 경로를 실행 가능한 코드 또는 프로시저로 포맷팅
3. SQL 옵티마이저 : 데이터 액세스 경로 선택하는 DBMS 엔진
옵티마이저의 최적화 단계
: 쿼리를 수행하는데 후보군의 실행계획 찾기
-> 데이터 딕셔너리에 수집해 둔 오브젝트 통계 및 시스템 통계정보를 이용해 비용 산정
-> 최저 비용 나타내는 실행계획 선택
즉, 통계정보를 이용해 비용기반 옵티마이저가 결정트리를 통해 비용을 산정하고, 최저 비용의 실행계획을 도출한다.
4. 실행계획과 비용
SQL 실행경로를 미리보기를 이용해 처리절차를 확인하고, 예상과 다른 방식으로 처리될 때 실행경로 변경
옵티마이저의 실행계획 근거 : 예상비용
5. 옵티마이저 힌트
옵티마이저가 선택하지 않은 더 효율적인 액세스 경로가 있다면 옵티마이저 힌트를 이용해 데이터 액세스 경로 변경
SELECT /*+ INDEX(A 고객_PK) */
고객명, 연락처, 주소, 가입일시
FROM 고객 A
WHERE 고객ID= '000000008'
옵티마이저 힌트 사용법
1. 힌트 인자 나열시, 힌트와 힌트 사이가 아니라 힌트 안에 인자만
/*+ INDEX(A A_X01) INDEX(B, B_X03) */ --유효
/*+ INDEX(C), FULL(D) */ --첫 번째 힌트만 유효
2. 테이블 지정시 스카마명까지 명시 금지
SELECT /*+ FULL(SCOTT.EMP) */ --무효
FROM EMP
3. FROM 절 테이블명 앞에 ALIAS 지정시, 힌트에도 반드시 ALIAS 사용
SELECT /*+ FULL(EMP) */ --무효
FROM EMP
1. 주문 테이블 액세스시 주문일자 칼럼이 선두인 인덱스를 사용하고 다른 액세스는 옵티마이저가 지정
SELECT /*+ INDEX (A (주문일자)) */
2. 옵티마이저에게 모든 방식을 지정
SELECT /*+ LEADING(A) USE_NL(B) INDEX(A (주문일자)) INDEX(B 고객_PK) */
옵티마이저 힌트 목록
분류 | 힌트 |
최적화 목표 | ALL_ROWS, FIRST_ROWS(N) |
액세스 방식 | FULL, INDEX, INDEX_DESC, INDEX_FSS, INDEX_SS |
조인순서 | ORDERED, LEADING, SWAP_JOIN_INPUTS |
조인방식 | USE_NL, USE_MERGE, USE_HASH, NL_SJ, MERGE_SJ, HASH_SJ |
서브쿼리 팩토링 | MATERIALIZE, INLINE |
쿼리 변환 | MERGE, NO_MERGE, UNNEST, NO_UNNEST, PUSH_PRED, NO_PUSH_PRED, USE_CONCAT, NO_EXPAND |
병렬 처리 | PARALLEL, PARALLEL_INDEX, PQ_DISTRIBUTE |
기타 | APPEND, DRVING_SITE, PUSH_SUBQ, NO_PUSH_SUBQ |
'Data Science > SQLP' 카테고리의 다른 글
[SQLP] 1-3. 데이터 저장 구조 및 I/O 메커니즘 (0) | 2022.01.17 |
---|---|
[SQLP] 1-2. SQL 공유 및 재사용 (1) | 2022.01.13 |
[SQLP] 목차 (0) | 2022.01.13 |
[SQLP] 조인 기본 문제 (0) | 2022.01.06 |
[SQLP] 기본 SQL문법 정리 (0) | 2021.12.23 |