1️⃣ BRIN 인덱스란?

Block Range INdex 의 약자

대용량 테이블에서 연속적인 값(순차적/시간적)에 최적화

일반 B-Tree 인덱스보다 작고 빠르게 생성 가능

하지만 랜덤값 검색에는 적합하지 않음

💡 요약:

특징	설명
장점	작은 크기, 빠른 생성, 디스크 절약
단점	랜덤/불규칙 값 검색 느림
사용 예	날짜, 시퀀스, ID 등 순차적 값 컬럼
2️⃣ BRIN 인덱스 생성 기본 문법
CREATE INDEX index_name
ON table_name USING brin (column_name);


예제:

CREATE INDEX brin_test_table_age
ON test_table USING brin (age);


test_table의 age 컬럼에 BRIN 인덱스 생성

대량 데이터에서 범위 검색할 때 효율적

3️⃣ BRIN 인덱스 옵션
CREATE INDEX brin_test_table_age
ON test_table USING brin (age)
WITH (pages_per_range = 32);


pages_per_range → 한 인덱스 범위에 몇 페이지를 묶을지 설정 (기본값 128)

범위를 작게 하면 검색 정확도 ↑, 인덱스 크기 ↑

범위를 크게 하면 인덱스 작고 빠름, 정확도 ↓

4️⃣ 사용 예제
범위 검색
-- age가 30 이상 40 이하인 데이터 검색
SELECT * FROM test_table
WHERE age BETWEEN 30 AND 40;


BRIN 인덱스를 생성하면 범위 검색이 빨라짐

작은 테이블에서는 체감 안 될 수 있음 → 수십만~수백만 행 이상에서 효과적

복합 컬럼 BRIN 인덱스
CREATE INDEX brin_test_table_name_age
ON test_table USING brin (name, age);


여러 컬럼 순서대로 범위 기반 검색 가능

💡 Tip

BRIN 인덱스는 연속적인 값에서 진가

순차적 시퀀스, 타임스탬프 컬럼에 주로 사용

랜덤/고르게 분포된 값 → B-Tree 인덱스가 더 적합
===========================================================================

1️⃣ TimescaleDB란?

PostgreSQL 기반 시계열(Time-Series) 데이터베이스 확장

하이퍼테이블(Hypertable) 구조로 자동 파티셔닝

시계열 데이터 삽입, 조회, 집계 최적화

2️⃣ BRIN + TimescaleDB의 조합

TimescaleDB는 내부적으로 하이퍼테이블 파티셔닝

시계열 데이터는 시간 컬럼 기준으로 연속적이기 때문에

BRIN 인덱스와 궁합이 매우 좋음

💡 특징:

특징	설명
인덱스 크기	BRIN → 매우 작음
삽입 속도	TimescaleDB → 초당 수십만~수백만 레코드 처리 가능
조회 효율	시간 범위 쿼리 → BRIN + 하이퍼테이블 최적화
3️⃣ 기본 사용법
1) TimescaleDB 설치 후 extension 활성화
-- PostgreSQL에서
CREATE EXTENSION IF NOT EXISTS timescaledb;

2) 테이블을 하이퍼테이블로 변환
CREATE TABLE sensor_data (
    time        TIMESTAMPTZ       NOT NULL,
    device_id   INT               NOT NULL,
    temperature DOUBLE PRECISION  NOT NULL
);

-- 하이퍼테이블로 변환 (시간 컬럼: time)
SELECT create_hypertable('sensor_data', 'time');

3) BRIN 인덱스 생성
-- 시간 기준 BRIN 인덱스
CREATE INDEX brin_sensor_time
ON sensor_data USING brin (time);

-- 필요시 device_id 추가 가능
CREATE INDEX brin_sensor_device_time
ON sensor_data USING brin (device_id, time);


시간 컬럼 순차적 → BRIN 범위 검색에 최적화

작은 인덱스로 수십억 행도 검색 가능

4️⃣ 범위 조회 예제
-- 특정 시간 범위 데이터 조회
SELECT *
FROM sensor_data
WHERE time BETWEEN '2026-02-01 00:00:00' AND '2026-02-02 00:00:00';


BRIN 인덱스 덕분에 빠른 범위 스캔 가능

🔹 정리

TimescaleDB = 시계열 최적화 + 자동 파티셔닝

BRIN 인덱스 = 연속적 시간 컬럼에 최적화된 작은 범위 인덱스

조합 = 대용량 시계열 데이터 + 낮은 디스크 사용 + 빠른 범위 쿼리