TimescaleDB란 ?
TimeScaleDB는 PostgreSQL 확장으로 개발된 오픈 소스 시계열 데이터베이스
- 시계열데이터 저장 및 쿼리 성능 최적화하면서도 PostgreSQL의 강력한 기능 유지
핵심 기능 : 하이퍼테이블
하이퍼테이블은 사용자에게 하나의 테이블처럼 보이지만, 내부적으로 여러 개의 작은 청크로 분할되어있다.
(한마디로 논리적 테이블)
- 쪼개는 최적화 작업이 백그라운드에서 실행
이 청크들은 시간 간격, 다른 차원 (id, 위치 등)으로 분할될 수 있다.
장점
- Chunk pruning
WHERE ts BETWEEN ... 같은 시간 필터만 있어도, 해당 범위를 벗어난 chunk는 통째로 스킵 → I/O 크게 절감. - 병렬 처리 쉬움
서로 다른 chunk를 여러 워커가 병렬 스캔 가능(특히 집계/리포트). - 인덱스/압축/보존을 chunk 단위로
오래된 chunk만 압축/삭제(retention) 하고, 최근 chunk는 쓰기 최적화 상태 유지
하이퍼테이블 생성 및 chunk interval 설정 예시
1. 기존 테이블 -> 하이퍼테이블
SELECT create_hypertable(
'bgp_updates',
'time', // 시간축 컬럼 지정, TIMESTAMP 타입 필수
chunk_time_interval => INTERVAL '1 day', // chunk interval
if_not_exists => TRUE);
2. 기존테이블 -> 하이퍼테이블 : by_range (postgre 14~)
SELECT create_hypertable('bgp_updates', by_range('time', INTERVAL '1 day') );
//이 경우 if not exitst는 별도 설정
3. 이미 존재하는 테이블의 chunk interval 수정
SELECT set_chunk_time_interval('bgp_updates', INTERVAL '24 hours');
공간축 파티셔닝
데이터가 특정 시간 구간 내에 너무 많아 단일 chunk가 커지는 경우
추가로 다른 컬럼을 기준으로 나눈다. 이때 사용하는 컬럼을 파티셔닝 컬럼 이라고 한다.
(예시 : BGP Updates 데이터에서의 컬렉터 번호, IoT 센서 데이터의 디바이스id)
간단하게 만약 컬렉터 번호에 대한 8-way 파티션을 주면, 시간 구간 x 8 개의 청크가 생성된다.
적용예시
SELECT create_hypertable(
'bgp_updates',
'ts',
partitioning_column => 'collector',
number_partitions => 8, -- RRC00~RRC07
chunk_time_interval => interval '12 hours'
);
장점
- 쓰기 분산: 동시에 많은 데이터가 들어올 때, 여러 chunk에 나눠 기록되므로 INSERT 경합 줄어듦.
- 병렬 읽기: 한 시간 구간 안에서도 여러 worker가 chunk별로 나눠 읽을 수 있음.
- Chunk 크기 관리: 특정 컬럼 값이 너무 많아 chunk가 몇십 GB까지 커지는 걸 방지.
'Database' 카테고리의 다른 글
[MySQL] 클러스터링 인덱스 (2) | 2025.01.23 |
---|---|
[MySQL] B-Tree 인덱스 - 2 (0) | 2025.01.16 |
[MySQL] B-Tree 인덱스-1 (1) | 2025.01.14 |
[MySQL] 인덱스 (2) | 2025.01.14 |
[MySQL] 인덱스와 잠금, MySQL의 격리 수준 (0) | 2025.01.10 |