OPC DB server Project First Commit

This commit is contained in:
2026-02-09 02:55:47 +00:00
commit 3181052619
53 changed files with 5719 additions and 0 deletions

137
.Notebook/BRIN 설명.md Normal file
View 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 인덱스 = 연속적 시간 컬럼에 최적화된 작은 범위 인덱스
조합 = 대용량 시계열 데이터 + 낮은 디스크 사용 + 빠른 범위 쿼리