OPC DB server Project First Commit
This commit is contained in:
137
.Notebook/BRIN 설명.md
Normal file
137
.Notebook/BRIN 설명.md
Normal file
@@ -0,0 +1,137 @@
|
||||
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 인덱스 = 연속적 시간 컬럼에 최적화된 작은 범위 인덱스
|
||||
|
||||
조합 = 대용량 시계열 데이터 + 낮은 디스크 사용 + 빠른 범위 쿼리
|
||||
Reference in New Issue
Block a user