Files
dbserver/.Notebook/BRIN 설명.md

137 lines
3.6 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 인덱스 = 연속적 시간 컬럼에 최적화된 작은 범위 인덱스
조합 = 대용량 시계열 데이터 + 낮은 디스크 사용 + 빠른 범위 쿼리