옵티마이저와 테이블 스캔
옵티마이저
- 사용자가 질의한 SQL문에 대해 최적의 실행 방법을 결정하는 역할을 수행
- 다양한 실행 방법들 중에서 최적의 실행 방법을 결정하는 것이 옵티마이저의 역할임.
- 관계형 DB는 옵티마이저가 셜정한 실행 방법대로 실행 엔진이 데이터를 처리하여 결과 데이터를 사용자에게 전달하는 역할을 할 뿐이다.
- 최적의 실행방법( 어던 방법으로 처리하는 것이 최소 일량으로 동일한 일을 처리할 수 있는지 )
규칙기반 옵티마이저
- 규칙(우선 순위)을 가지고 실행계획을 생성한다.
규칙기반 옵티마이저의 규칙(15가지 순서)
순위 |
엑세스 기법 |
규칙 설명 |
1 |
Single row by rowid |
Rowid를 통해서 테이블에서 하나의 행을 액세스 하는 방식, Rowid는 행이 포함된 데이터 파일, 블록 등의 정보를 가지고 있기 때문에 다른 정보를 참조하지 않고도 바로 원하는 행을 액세스 할 수 있다. 하나의 행을 액세스 하는 가장 빠른 방법 |
2 |
Single row by cluster join |
|
3 |
Single row by hash cluster key with unique or primary key |
|
4 |
Single row by unique or primary key |
유일 인덱스를 통해서 하나의 행을 액세스 하는 방식 인덱스를 먼저 액세스하고 인덱스에 존재하는 Rowid를 추출하여 테이블의 행을 액세스 한다. |
5 |
Cluster join |
|
6 |
Hash cluster key |
|
7 |
Indexed cluster key |
|
8 |
Composite index |
복합 인덱스에 동등조건으로 검색하는 경우. 인덱스 구성 칼럼의 개수가 더 많고 해당 인덱스의 모든 구성 칼럼에 대해 "="로 값이 주어질수록 우선 순위가 더 높다. |
9 |
Single column index |
단일 칼럼 인덱스에 "=" 조건으로 검색하는 경우 |
10 |
Bounded range search on indexed columns |
인덱스가 생성되어 있는 칼럼에 양쪽 범위를 한정하는 형태로 검색하는 방식 |
11 |
Unbonded range search on indexed column |
인덱스가 생성되어 있는 칼럼에 한쪽 범위만 한정하는 형태로 검색하는 방식 |
12 |
Sort merge join |
|
13 |
Max or Min of indexed column |
|
14 |
Order by on indexed column |
|
15 |
Full table scan |
전체 테이블을 액세스하면서 조건절에 주어진 조건을 만족하는 행만을 결과로 추출한다. |
Add.
- 규칙기반 옵티마이저는 인덱스를 이용한 액세스 방식이 전체 테이블 액세르 방식보다 우선순위가 높다.
비용기반 옵티마이저
- 규칙기반 옵티마이저의 단점을 보완하기위해 출현.
- SQL문을 처리하는데 필요한 비용이 가장 적은 실행계획을 선택하는 방식.
- 비용을 예측하기 위해서 규칙기반 옵티마이저가 사용하지 않는 테이블, 인덱스, 칼럼 등의 다양한 객체 통계정보와 시스템 통계정보 등을 이용한다.
비용기반 옵티마이저의 구성 요소 및 단계별 특징
구성 요소 |
설명 |
대안 계획 생성기 |
- 동일한 결과를 생성하는 다양한 대안 계획을 생성하는 모듈 - 대안 계획은 연산의 적용 순서 변경, 연산 방법 변경, 조인 순서 변경 등을 거쳐서 생성된다. - 동일한 결과를 생성하는 가능한 모든 대안 계획을 생성해야 보다 나은 최적화를 할 수 있다. 그러나 대안 계획의 생성이 너무 많아지면 최적화를 수행하는 시간이 그만큼 오래 걸릴 수 있다. - 대부분의 사용옵티마이저들은 대안 계획의 수를 제약하는 방법을 사용한다. |
비용 예측기 |
- 대안 계획 생성기에 의해서 생성된 대안 계획의 비용을 예측하는 모듈 - 대안 계획의 정확한 비용을 예측하기 위해서 연산의 중간 집합의 크기 및 결과 집합의 크기, 분포도 등의 예측이 정확해야 한다. |
Add.
- 규칙기반 옵티마이저는 항상 인덱스를 사용할 수 있다면 전체 테이블 스캔보다는 인덱스를 사용하는 실행 계획을 생성한다.
- 비용기반 옵티마이저는 인덱스를 사용하는 비용이 전체 테이블 스캔 비용보다 크다고 판단되면 전체 테이블 스캔을 수행하는 방법으로 실행계획을 생성할 수도 있다.
실행 계획
- SQL에서 요구한 사항을 처리하기 위한 절차와 방법을 의미.
- 실행 계획을 생성한다는 것은 SQL을 어떤 순서로 어떻게 실행할 지를 결정하는 작업이다.
- 생성된 실행계획을 보는 방법은 DB 벤더마다 서로 다르다.
인덱스 특징과 종류
- 원하는 데이터를 쉽게 찾을 수 있도록 돕는 책의 찾아보기와 유사한 개념
- 테이블을 기반으로 선택적으로 생성할 수 있는 구조.
- 테이블에 인덱스를 생성하지 않아도 되고 여러 개를 생성해도 됨
- 인덱스의 목적은 검색 성능의 최적화(검색 조건을 만족하는 데이터를 인덱스를 통해 효과적으로 찾을 수 있도록 돕는다.)
- But Insert, Delete, Update 등과 같은 DML 작업은 테이블과 인덱스를 함께 변경해야 하기 때문에 오히려 느려질 수 있다는 단점이 존재한다.
* 트리 기반 인덱스
- DBMS에서 가장 일반적인 인덱스는 B-트리 인덱스이다.
B-트리 인덱스
Leaf Block 추가 설명 |
인덱스를 구성하는 칼럼의 데이터와 해당 데이터를 가지고 있는 행의 위치가 가리키는 레코드 식별자로 구성되어 있다. |
인덱스 데이터는 인덱스를 구성하는 칼럼의 값으로 정렬된다. |
인덱스 데이터의 값이 동일하면 레코드 식별자의 순서로 저장된다. |
양방향 링크를 가지고 있다. |
인덱스에서 원하는 값을 찾는 과정 |
1. 브렌치 블록의 가장 왼쪽 값이 찾고자 하는 값보다 작거나 같으면 왼쪽으로 포인터 이동 |
2. 찾고자 하는 값이 브렌치 블록의 값 사이에 존재하면 가운데 포인터로 이동 |
3. 오른쪽에 있는 값보다 크면 오른쪽 포인터로 이동 |
* 클러스터형 인덱스(SQL server)
- 인덱스의 Leaf Page가 곧 Data Page이다. Then. 테이블 탐색에 필요한 레코드 식별자가 Page에 없다.
- Leaf Page의 모든 Row는 인덱스 키 칼럼 순으로 물리적으로 정렬되어 저장된다.
- Table Row는 물리적으로 한 가지 순서로만 정렬될 수 있다. Then. 클러스터형 인덱스는 테이블당 한 개만 생성할 수 있다.
전체 테이블 스캔과 인덱스 스캔
* 전체 테이블 스캔
- 테이블에 존재하는 모든 데이터를 읽어 가면서 조건에 맞으면 결과로서 추출하고 조건에 맞지 않으면 버리는 방식으로 검색.
- 테이블의 고수위 마크(테이블에 데이터가 쓰여졌던 Block 상의 최상위 위치) 아래의 모든 Block을 reading.
옵티마이저가 연산으로서 전체 테이블 스캔 방식을 선택하는 이유
- SQL문에 조건이 존재하지 않는 경우
- SQL문의 주어진 조건에 사용 가능하나 인덱스가 존재하지 않는 경우
- 옵티마이저의 취사 선택
- 그 밖의 경우
* 인덱스 스캔
- 인덱스를 구성하는 칼럼의 값을 기반으로 데이터를 추출하는 액세스 기법
- Leaf of Index Scan은 인덱스를 구성하는 칼럼의 값을 기반으로 데이터를 추출하는 액세스 기법.
- 검색을 위해 인덱스의 리프 블록을 읽으면 인덱스 구성 칼럼의 값과 테이블의 레코드 식별자를 알 수 있다.
인덱스 스캔의 종류
스캔 종류 |
설명 |
인덱스 유일 스캔 |
- 유일 인덱스를 사용하여 단 하나의 데이터를 추출하는 방식 - 유일 인덱스 구성 칼럼에 모두 "="로 값이 주어지면 결과는 최대 1건 - 구성 칼럼에 대해 모두 "="로 값이 주어진 경우에만 가능한 스캔 방식 |
인덱스 범위 스캔 |
- 인덱스를 이용하여 한 건 이상의 데이터를 추출하는 방식 - 유일 인덱스의 구성 칼럼 모두에 대해 "="로 값이 주어지지 않은 경우와 비유일 인덱스를 이용하는 모든 액세스 방식은 인덱스 범위 스캔 방식으로 데이터를 액세스 하는 것 |
인덱스 역순 스캔 |
- 인덱스의 리프 블록의 양방향 링크를 이용하여 내림 차순으로 데이터를 읽는 방식 - 최대값을 쉽게 찾을 수 있다. |
Arrangement.
인덱스 스캔 방식
- 사용 가능한 적절한 인덱스가 존재할 때만 이용할 수 있는 스캔 방식.
- 인덱스에 존재하는 레코드 식별자를 이용해서 검색하는 데이터의 정확한 위치를 알고서 데이터를 읽는다.
- 한번 I/O 요청에 한 블록씩 데이터를 읽는다.
- 대용량 데이터 중에서 극히 일부의 데이터를 찾을 때 이용한다.
전체 테이블 스캔방식
- 인덱스의 존재 유무와 상관없이 항상 이용 가능한 스캔 방식.
- 데이터를 읽을 때 한번의 I/O요청으로 여러 블록을 한꺼번에 읽는다.
- 테이블의 대부분의 데이터를 찾을때 이용한다.
'IT > SQLD(SQL개발자)' 카테고리의 다른 글
[SQLD] 조인 종류와 수행 원리 (0) | 2019.07.05 |
---|---|
[SQLD] 서브쿼리와 그룹함수(Group Function) (0) | 2019.07.03 |
[SQLD] 집합연산자와 계층형 질의 (0) | 2019.07.02 |
[SQLD] SQL 기본 및 활용(SQL 기본) 정리 및 표준조인(Standard Join) (0) | 2019.07.01 |
[SQLD] ORDER BY 와 JOIN (0) | 2019.06.30 |