. CBO(Cost Based Opimizer)
– 테이블 및 인덱스 등의 통계 정보를 활용하여 SQL문을 실행하는데 소요될 처리시간 및 CPU, I/O 자원량 등을 계산하여 가장 효율적ㅇ일 것으로 예상되는 실행계획을 선택하는 옵티마이저
. 실행계획을 통해 알수 있는 정보
– 액세스 기법
– 질의 처리 예상 비용(Cost)
– 조인 순서
. 실행순서
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의 내부적인 처리 절차를 시각적으로 표현해준다.
. 옵티마이저와 실행계획
– 규칙기반 옵티마이저에서 제일 높은 우선순위는 행에 대한 고유 주소를 사용하는 방법이다.
– 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은 선택도가 낮은(결과 행의 수가 적은) 테이블이 선행 테이블로 선택되는 것이 일반적으로 유리하다.