5. SQL 최적화 기본 원리

 

. CBO(Cost Based Opimizer)

– 테이블 및 인덱스 등의 통계 정보를 활용하여 SQL문을 실행하는데 소요될 처리시간 및 CPU, I/O 자원량 등을 계산하여 가장 효율적ㅇ일 것으로 예상되는 실행계획을 선택하는 옵티마이저

. 실행계획을 통해 알수 있는 정보

– 액세스 기법

– 질의 처리 예상 비용(Cost)

– 조인 순서

11

 

. 실행순서

1. NESTED LOOPS

2. HASH JOIN

3. TABLE ACCESS (FULL) TAB1

4. TABLE ACCESS (FULL) TAB2

5. TABLE ACCESS (BY ROWID) TAB3

6. INDEX (UNIQUE SCAN) PK_TAB3

– 3 -> 4 -> 2 -> 6 -> 5 -> 1

 

. 실행계획 설명

– 실행계획은 SQL 처리를 위한 실행 절차와 방법을 표현한 것이다.

– 조인 방법, 조인 순서, 액세스 기법 등이 표현된다.

– CBO의 실행계획에는 단계별 예상 비용 및 건수 등이 표시된다.

 

. SQL 처리 흐름도(Access Flow Diagram) 

– 인덱스 스캔, 테이블 전체 스캔 등과 같은 액세스 기법이 표현된다.

– SQL의 내부적인 처리 절차를 시각적으로 표현해준다.

zz

 

. 옵티마이저와 실행계획

– 규칙기반 옵티마이저에서 제일 높은 우선순위는 행에 대한 고유 주소를 사용하는 방법이다.

– SQL 처리 흐름도는 인덱스 스캔 및 전체 테이블 스캔 등의 액세스 기법을 표현할 수 있따.

 

. Index

– 조회, 삽입, 삭제, 갱신 연산의 속도를 향상시킨다.

– 대량의 데이터를 삽입할 때는 모든 인덱스를 생성하고 데이터를 입력 하는 것이 좋다.

– 널 값들이 나타날 수 없다.

– 규칙기반 옵티마이저는 적절한 인덱스가 존재하면 항상 인덱스를 사용하려고 한다.

– 인덱스 범위 스캔은 결과가 없으면 한 건도 반환하지 않을 수 있다.

– Insert, Update, Delete 등의 DML 처리 성능을 저하시킬 수도 있다.

– B-트리 인덱스는 일치 및 범위 검색에 적절한 구조하다.

 

. B-TREE 인덱스

–  브랜치 블록과 리프 블록으로 구성되며, 브랜치 블록은 분기를 목적으로 하고 리프블록은 인덱스를 구성하는 컬럼의 값으로 정렬된다. 일반적으로 OLTP 시스템 환경에서 가장 많이 사용된다.

. CLUSTERED 인덱스

– 인덱스의 리프 페이지가 곧 데이터 페이지이며, 리프 페이지의 모든 데이터는 인덱스 키 컬럼 순으로 물리적으로 정렬되어 저장된다.

. BITMAP 인덱스

– 시스템에서 사용될 질의를 시스템 구현 시에 모두 알 수 없는 경우인 DW 및 AD-HOC 질의 환경을 위해서 설계되었으며, 하나의 인덱스 키 엔트리가 많은 행에 대한 포인터를 저장하고 있는 구조이다.

 

. Nested Loop Join

– 조인 컬럼에 적당한 인덱스가 있어서 Natural join이 효율적 일때 유용하다.

– Driving Table의 조인 데이터 양이 큰 영향을 주는 조인 방식이다.

– 유니크 인덱스를 활용하여 수행시간이 적게 걸리는 소량 테이블을 온라인 조회하는 경우 유용하다.

 

. SMJ(Sort Merge Join)

– 조인 칼럼에 적당한 인덱스가 없어서 NL조인(Nested Loops)가 비효율적일 때 사용할 수 있다.

– Driving Table의 개념이 중요하지 않은 조인 방식이다.

– 조인 조건의 인덱스의 유무에 영향 받지 않는다.

 

. Join 기법

– NL Join은 선택도가 낮은(결과 행의 수가 적은) 테이블이 선행 테이블로 선택되는 것이 일반적으로 유리하다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다