본문 바로가기

Data Science/SQLP

[SQLP] 1-1. SQL 파싱과 최적화

반응형

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