Visibility Map

[PostgreSQL 9.6] Visibility Map 내의 FROZEN 비트를 이용한 Vacuum 성능 향상에 대한 고찰

이전 포스팅: [PostgreSQL] 아무도 자세히 알려주지 않았던 Autovacuum의 위험성

1. Vacuum 성능 향상을 위해 9.6에 추가된 기능


이 포스팅은 이전 포스팅과 연결된 내용이므로, 이전 포스팅을 읽고 오시는 것이 좋습니다. 이번 시간에는 9.6의 향상된 Vacuum 성능에 대해서 설명합니다. 9.6은 Visibility Map 내의 Frozen Bit를 이용해서 Vacuum 대상 페이지를 선별하는 알고리즘을 적용했습니다. 즉, 해당 페이지가 ‘frozen 상태’라면 베큠 대상에서 제외한다는 것입니다. 아이디어는 간단하지만 그 효과는 매우 뛰어납니다. (그림-1~그림-3 참조)

(more…)

[PostgreSQL] Visibility Map을 이용한 Index Only Scan 동작 방식 분석

OLTP 시스템 튜닝에 있어서 가장 중요하고도 어려운 숙제는 싱글 블록 IO (인덱스를 이용한 테이블 액세스시 발생하는 디스크 Random IO)를 얼마만큼 최소화 할 수 있는지 입니다.

일반적인 디스크 환경에서 싱글 블록 IO의 성능은 대략 초당 100블록 정도입니다. 따라서, 만일 1,000건의 레코드에 대한 테이블 액세스 시에 모두 디스크 IO가 발생한다면 해당 쿼리의 성능은 10초 정도가 소요됩니다. 이는 온라인 시스템에 있어서는 참을 수 없을 만큼 답답한 속도입니다.

따라서, 이런 문제를 해결하기 위한 다양한 방법이 존재합니다. KEEP 버퍼를 이용해서 테이블, 인덱스 블록들을 메모리에 상주시킴으로써 디스크 IO를 최대한 제거하거나, 인덱스 클러스터링 팩터를 향상시키기 위해 테이블을 인덱스 칼럼 순으로 재 생성하거나, IOT, 클러스터 인덱스 등의 시도 또한 싱글 블록 IO를 효과적으로 처리하기 위한 튜닝 방법의 일환이라고 할 수 있습니다.

그리고 쿼리의 조건절 및 SELECT 절에 사용되는 칼럼의 수가 상대적으로 적다면, 해당 칼럼들을 이용한 결합 인덱스로 생성함으로써 테이블 액세스를 제거하는 방법 또한 존재합니다. 이러한 용도의 인덱스를 Covered Index(또는 Covering Index)라고 하며 해당 인덱스를 이용한 액세스 방법을 Index Only Scan이라고 합니다.

(more…)