데이터베이스/데이터베이스 공부

[데이터베이스] 전체 테이블 스캔과 인덱스 스캔

아밍나 2022. 9. 1. 23:22
728x90

1) 전체 테이블 스캔

테이블의 모든 데이터를 읽어가면서 조건에 맞으면 결과로 추출하고 조건에 맞지 않으면 버리는 방식으로 검색

Oracle의 경우 검색 조건에 맞는 데이터를 찾기 위해 테이블의 고수위 마크(HWM) 아래의 모든 블록을 읽는다.

더보기
고수위 마크(HWM, High Water Mark)
: 테이블에 데이터가 쓰여졌던 블록 상의 최상위 위치

고수위 마크까지의 블록 내 모든 데이터를 읽어야 하기 때문에 시간이 결과를 찾을 때까지 오래 걸릴 수 있다.

- 전체 테이블 스캔 방식 선택하는 경우

1. SQL문에 조건이 존재하지 않는 경우

조건이 존재하지 않는다. = 모든 데이터가 답이 된다.

따라서 테이블의 모든 블록을 읽으면서 무조건 결과로서 반환하면 된다.

2. SQL문의 주어진 조건에 사용가능한 인덱스가 존재하지 않는 경우
3. 옵티마이저의 취사 선택

- 조건을 만족하는 데이터가 많은 경우,

옵티마이저가 테이블의 대부분의 블록을 액세스 해야 한다고 판단하면

인덱스가 존재해도 전체 테이블 스캔 방식으로 읽을 수 있다.

4. 그밖의 경우

- 병렬처리 방식으로 처리하는 경우

- 전체 테이블 스캔 방식의 힌트를 사용한 경우


2) 인덱스 스캔

인덱스를 구성하는 칼럼의 값을 기반으로 데이터를 추출하는 액세스 기법

- 인덱스 리프 블록은 인덱스를 구성하는 칼럼레코드 식별자로 구성.

→ 검색을 위해 인덱스의 리프 블록을 읽으면 인덱스 구성 칼럼의 값과 테이블의 레코드 식별자를 알 수 있다.

 

- 인덱스에 존재하지 않는 칼럼의 값이 필요한 경우에는 레코드 식별자를 이용하여 테이블을 액세스 해야 한다.

→ 그러나 SQL 문에서 필요로 하는 모든 칼럼이 인덱스 구성 칼럼에 포함된 경우 테이블에 대한 액세스는 발생하지 않는다.

 

- 인덱스는 인덱스를 구성하는 칼럼의 순서로 정렬되어 있다.

→ 구성 칼럼이 A+B라면,

 

먼저 칼럼 A로 정렬

↓ 

칼럼 A의 값이 동일할 경우,

칼럼 B로 정렬

↓ 

칼럼 B까지 모두 동일할 경우,

레코드 식별자로 정렬

 

인덱스가 구성 칼럼으로 정렬되어 있기 떄문에 인덱스를 경유하여 데이터를 읽으면 그 결과 또한 정렬되어 반환된다.

→ 인덱스의 순서와 동일한 정렬 순서를 사용자가 원하는 경우에는 정렬 작업을 하지 않을 수 있다.

- 인덱스 스캔 방식

① 인덱스 유일 스캔(Index Unique Scan)

유일 인덱스(Unique Index)를 사용하여 단 하나의 데이터를 추출.

→ 중복을 허락하지 않는 인덱스

→ 유일 인덱스 구성 칼럼에 대해 모두 '='로 값이 주어진 경우에만 가능한 인덱스 스캔 방식

 

② 인덱스 범위 스캔(Index Range Scan)

인덱스를 이용하여 한 건 이상의 데이터를 추출하는 방식.

→ 유일 인덱스의 구성 칼럼 모두에 대해 '='로 값이 주어지지 않은 경우와 비유일 인덱스를 이용하는 모든 액세스 방식

 

③ 인덱스 역순 범위 스캔(Index Range Scan Descending)

인덱스의 리프 블록의 양방향 링크를 이용하여 내림차순으로 데이터를 읽는 방식.

→ 최대값을 쉽게 찾을 수 있으며 인덱스 범위 스캔의 일종이다.

 

이외에도 인덱스 전체 스캔(Index Full Scan), 인덱스 고속 전체 스캔(Fast Full Index Scan), 인덱스 스킵 스캔(Index Skip Scan) 등이 존재한다.


3) 전체 테이블 스캔 VS 인덱스 스캔

전체 테이블 스캔 인덱스 스캔
인덱스의 존재 유무와 상관 없이 항상 이용 가능 사용 가능한 인덱스가 존재할 때만 이용 가능
레코드 식별자를 이용해서 검색하는 데이터의 정확한 위치를 알고 데이터를 읽음.
→ 불필요하게 다른 블록을 더 읽을 필요가 없음.
한 번의 I/O 요청으로 여러 블록을 한꺼번에 읽음. 한 번의 I/O 요청에 한 블록씩 데이터를 읽음.
테이블의 대부분의 데이터를 찾을 때 대용량 데이터 중 극히 일부의 데이터를 찾을 때

 

728x90
반응형