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 |