PostgreSQL, B-Tree 대신 해시 인덱스로 성능 개선!

by DD
4개월 전
조회수 42

체크 제약 조건(Check Constraints)을 활용하여 쿼리 성능을 향상시키고, constraint_exclusion 설정을 통해 불필요한 테이블 스캔을 방지한다.

함수 기반 인덱스(Function Based Index)를 사용하여 날짜 데이터를 인덱싱하고, B-Tree 인덱스 대비 저장 공간 절약(Storage Space Savings) 및 쿼리 속도 향상을 달성한다.

가상 생성 열(Virtual Generated Columns)을 활용하여 함수 기반 인덱스의 단점을 보완하고, 유지보수성(Maintainability)을 높인다.

해시 인덱스(Hash Index)를 사용하여 대용량 URL의 중복을 효율적으로 방지하고, B-Tree 인덱스 대비 저장 공간(Storage)을 5배 이상 절감한다.

체크 제약 조건(Check Constraints)과 constraint_exclusion

본문에서는 체크 제약 조건(Check Constraints)을 활용하여 쿼리 성능을 최적화하는 방법을 제시한다. 특히, `plan` 열에 'free'와 'pro' 값만 허용하는 제약 조건을 설정한 후, 존재하지 않는 값으로 쿼리 시 constraint_exclusion 설정을 통해 전체 테이블 스캔을 방지한다. 보고 환경(Reporting Environment)에서 사용자의 실수로 인한 성능 저하를 막는 데 효과적이다.

함수 기반 인덱스(Function Based Index)의 활용

기존의 B-Tree 인덱스 대신 함수 기반 인덱스(Function Based Index)를 사용하여 날짜 데이터를 인덱싱함으로써 저장 공간을 절약하고 쿼리 성능을 향상시킨다. 날짜(Date)만 인덱싱하여 전체 `timestamp`를 인덱싱하는 것보다 인덱스 크기를 줄이고, 쿼리 속도를 높이는 효과를 얻는다. 하지만, 쿼리 표현식이 변경되면 인덱스를 활용할 수 없는 단점(Discipline Problem)이 존재한다.

가상 생성 열(Virtual Generated Columns)을 통한 문제 해결

함수 기반 인덱스의 단점을 보완하기 위해 가상 생성 열(Virtual Generated Columns)을 활용한다. 가상 생성 열은 쿼리에서 사용되는 표현식과 동일한 표현식을 사용하여 인덱스를 사용할 수 있도록 보장한다. 이를 통해, 유지보수성(Maintainability)을 높이고, 쿼리 성능을 유지하면서 개발 생산성(Development Productivity)을 향상시킨다.

해시 인덱스(Hash Index)를 활용한 중복 방지

대용량 URL의 중복을 방지하기 위해 해시 인덱스(Hash Index)를 활용하는 방법을 제시한다. 해시 인덱스는 B-Tree 인덱스보다 저장 공간을 적게 차지하며, 특히 대용량 문자열에 대한 중복 검사 시 효율적이다. 배제 제약 조건(Exclusion Constraint)을 사용하여 해시 인덱스를 통해 유일성을 보장하며, B-Tree 인덱스 대비 저장 공간(Storage)을 5배 이상 절감한다.

해시 인덱스(Hash Index)의 한계와 대안

해시 인덱스를 사용한 유일성 제약은 몇 가지 한계가 있다. 외래 키(Foreign Key)로 참조할 수 없으며, `ON CONFLICT` 절 사용에 제약이 있다. 이러한 한계를 극복하기 위해 `MERGE` 구문을 사용하여 데이터를 동기화하는 방법을 제시한다. 데이터 정합성(Data Consistency)을 유지하면서 해시 인덱스의 장점을 활용할 수 있다.

Unconventional PostgreSQL Optimizations