본문 바로가기

PostgreSQL

액세스 방식

Seq Scan 방식

Seq Scan은 테이블을 Full Scan 하면서 레코드를 읽는 방식이다.

인덱스가 존재하지 않거나, 인덱스가 존재하더라도 읽어야 할 범위가 넓은 경우에 선택한다.

 

Index Scan 방식

Index Scan은 인덱스 Leaf 블록에 저장된 키를 이용해서 테이블 레코드를 액세스하는 방식이다.

인덱스 키 순서대로 출력된다.

레코드 정렬 상태에 따라서 테이블 블록 액세스 횟수가 크게 차이 난다.

 

Bitmap Index Scan 방식

테이블 랜덤 액세스 횟수를 줄이기 위해 고안된 방식이다.

Index Scan 방식과 Bitmap Index Scan 방식을 결정하는 기준은 인덱스 칼럼의 Correlation 값이다.

Correlation이란 인덱스 칼럼에 대한 테이블 레코드의 정렬 상태이다. (클러스터링 팩터)

, Correlation이 좋으면 Index Scan 방식을, 나쁘면 Bitmap Index Scan 방식을 사용한다.

Bitmap Index Scan 방식은 액세스할 블록들을 블록 번호 순으로 정렬한 후에 액세스한다.

이로 인해, 테이블 랜덤 액세스 횟수가 크게 줄어든다. (블록당 1)

테이블 블록 번호 순으로 액세스하므로, 인덱스 키 순서대로 출력되지 않는다.

 

CLUSTER 명령어를 이용한 테이블 재구성

특정 인덱스 칼럼 기준으로 테이블을 재 정렬해서 다시 생성하고 싶다면 CLUSTER 명령어를 사용하면 된다.

다만, 이때도 Vacuum FULL과 동일하게 SELECT와도 락이 호환되지 않는다는 점을 유의해야 한다.

 

Lossy 모드

Bitmap Index Scan 방식은 비트맵을 이용해서 처리된다.

이때, 비트맵 정보는 Backend 프로세스 메모리 내에 저장된다.

만일 메모리 공간이 부족하면 exact 모드에서 lossy 모드로 전환한다.

lossy 모드는 exact 모드에 비해서 느리다.

exact 모드는 비트맵 내의 1개의 비트가 1개의 레코드를 가리킨다.

lossy 모드는 비트맵 내의 1개의 비트가 1개의 블록을 가리킨다.

 

Index Only Scan 방식

Covering Index를 이용하는 것을 Index Only Scan 방식이라고 한다.

Covering Index SELECT 칼럼 및 WHERE 조건을 모두 포함하는 인덱스를 의미한다.

Covering Index의 장점은 테이블 랜덤 액세스를 제거할 수 있다는 것이다.

, Vacuum을 수행해야만 Index Only Scan 방식으로 동작한다.

 

액세스 방식을 제어하는 방법

SET 절을 이용해서 액세스 방식을 제어할 수 있다

'PostgreSQL' 카테고리의 다른 글

Query Rewrite (쿼리 변환)  (0) 2021.04.23
JOIN  (0) 2021.04.23
Explain  (0) 2021.04.23
COST 계산에 이용되는 파라미터 / 통계 정보  (0) 2021.04.23
HOT (Heap Only Tuple)  (0) 2021.04.23