DB/PostgreSQL

PostgreSQL에서 BloomFilter 사용하기

검정비니 2025. 4. 22. 21:59
728x90
반응형

 

1. PostgreSQL에서 Bloom Filter란?

PostgreSQL에서 제공하는 bloom 확장(extension)은 여러 컬럼을 조합한 검색에서 효율적인 검색을 돕기 위해 블룸 필터 방식을 이용하는 비트맵 기반의 확률적 인덱스이다.

기본적으로 Index Access Method를 통해 bloom filter를 인덱스로서 add-on하는 것이다.

  • 장점: 여러 컬럼을 조합한 쿼리에 대해 공간을 절약하면서 빠른 검색 속도를 지원한다.
  • 단점: False Positive(거짓 긍정, 존재하지 않는 데이터가 있다고 판단하는 오류)가 발생할 수 있다.

일반적으로 정확한 결과를 얻으려면 블룸필터 인덱스를 통해 후보를 좁힌 후, 최종적으로 일반적인 방법으로 필터링을 수행한다.

 

2. Bloom Extension 설치하기

기본 설치에는 포함되지 않으므로, 사용하려면 별도의 설치가 필요하다.

CREATE EXTENSION bloom;

 

 

3. Bloom Filter 인덱스 생성법

기본 문법은 다음과 같다:

CREATE INDEX bloom_idx ON table_name USING bloom (column1, column2, ...);

 

예시:

-- 테이블 예시
CREATE TABLE user_log (
  user_id integer,
  event_date date,
  event_type text,
  attributes hstore
);

-- 여러 컬럼을 블룸필터로 인덱스 생성
CREATE INDEX user_log_bloom_idx ON user_log USING bloom(user_id, event_date, event_type);

 

 

4. hstore 타입과 함께 Bloom Filter 활용하기

hstore 전체가 아니라 특정 key의 값을 이용한 컬럼을 만들고 이를 블룸 필터로 인덱스화 하는 방식으로 활용할 수 있다.

예제

(1) 특정 키 값을 별도의 컬럼으로 저장

ALTER TABLE user_log ADD COLUMN attr_country TEXT;
UPDATE user_log SET attr_country = attributes -> 'country';

(2) 별도로 추출한 컬럼을 블룸필터 인덱스에 추가

CREATE INDEX user_log_bloom_idx2 ON user_log USING bloom(user_id, event_date, attr_country);

이렇게 하면 hstore의 특정 key에 대해서도 빠른 검색을 지원할 수 있다.

 

5. Bloom Filter 인덱스 활용 예제

인덱스를 활용한 쿼리 예시:

SELECT * FROM user_log
WHERE user_id = 123 AND attr_country = 'KR';
  • Bloom 필터 인덱스를 통해 후보군을 빠르게 좁히고, 그 후 추가 조건으로 정확히 필터링됨

 

6. 주의사항

  • Bloom Filter는 False Positive가 존재하기 때문에, 최종 결과를 얻으려면 일반적인 방식으로 추가 필터링이 반드시 필요함
  • 특히 많은 데이터에서 적절한 컬럼을 잘 선택하면 매우 효과적이지만, 정확한 단일 컬럼 검색에는 B-tree, 또는 hstore의 키-값 조회엔 GIN 인덱스가 일반적으로 더 적합함

 

결론 정리

설치방법 CREATE EXTENSION bloom;
인덱스 생성 USING bloom (col1, col2, ...)
hstore 활용법 hstore의 특정 키를 별도 컬럼으로 분리 후 사용
특징 여러 컬럼 복합 조회에 유리하지만 False Positive 발생 가능

 

반응형