콘텐츠로 이동

TimescaleDB 하이퍼테이블 (Hypertables)

개요

시계열 데이터는 "계속 쌓이고", "시간 범위로 뒤진다"는 특성이 있어요. 그런데 데이터가 커질수록 시간 범위 질의가 느려지는 게 문제죠. TimescaleDB는 이 문제를 하이퍼테이블(Hypertable) 로 푸는 데, 하이퍼테이블은 시간을 기준으로 데이터를 투명하게 여러 개의 청크(chunk) 로 나눠 저장하는 테이블이에요. 핵심은 사용자 입장에선 그냥 PostgreSQL 테이블처럼 보이고 쓴다는 거예요. CREATE·ALTER·SELECT 같은 SQL이 그대로 동작하고, 하이퍼테이블에 가하는 명령은 그 아래 모든 청크에 자동으로 전파돼요.

핵심 개념

하이퍼테이블이란

하이퍼테이블은 여러 개의 상호 연결된 "청크" 테이블로 이루어진 테이블이에요. 각 청크는 특정 시간 범위의 데이터를 담아요(예: 하루, 일주일). 시간 범위 질의를 하면 필요한 청크만 골라 읽으므로, 전체를 훑을 필요가 없어져 속도를 얻어요. 사용자가 보기엔 하나의 테이블이지만, 내부는 시간 단위로 쪼개져 있는 구조예요.

공식 문서는 하이퍼테이블이 표준 PostgreSQL 테이블처럼 예측 가능하고 관리하기 쉽게 설계됐다고 강조해요. 기본 파티셔닝 컬럼은 첫 번째 timestamp 타입 컬럼(timestamptz 권장)이 돼요.

하이퍼테이블 만들기

하이퍼테이블을 만드는 과정은 두 단계로 나뉘어요. 우선 표준 테이블을 만들고, 그 테이블을 하이퍼테이블로 변환하거나, 최신 버전에선 CREATE TABLE ... WITH로 바로 만들 수 있어요.

-- 기존 테이블을 하이퍼테이블로 변환
CREATE TABLE conditions (
    time        TIMESTAMPTZ NOT NULL,
    location    TEXT        NOT NULL,
    temperature DOUBLE PRECISION
);
SELECT create_hypertable('conditions', 'time');

create_hypertable은 시간 컬럼을 파티셔닝 기준으로 지정해요. 기존 데이터를 하이퍼테이블로 옮겨야 하면 migrate_data 인자를 true로 주는데, 테이블이 크면 상당히 오래 잠길 수 있으니 주의해요.

청크 크기와 시간 간격 설정

청크가 담는 시간 범위는 chunk interval(청크 시간 간격) 로 정해요. 생성 시 chunk_time_interval로 지정하고, 이후에는 set_chunk_time_interval()로 바꿀 수 있어요. 적절한 청크 크기를 고르는 기준은 "가장 최근 청크(그리고 인덱스)가 메모리에 들어가는" 정도예요. 청크마다 인덱스가 따로 있으니, 너무 크면 메모리·성능에 부담이 되고 너무 작으면 청크 수가 과도해져요.

보조 차원(공간 파티셔닝)

add_dimension()으로 시간 외의 보조 차원(예: location)을 추가할 수 있어요. 특정 조건으로 자주 필터링하는 컬럼을 추가 파티셔닝 차원으로 두면 쿼리가 더 좁혀질 수 있어요. 다만 과하게 나누면 관리가 복잡해지니 신중히 써요.

청크 관리 함수

하이퍼테이블에선 청크 단위의 관리 함수가 제공돼요. show_chunks()로 어떤 청크가 있는지, drop_chunks()로 특정 시간 범위의 옛 청크를 한 번에 지워요. 시계열 데이터 수명 관리를 이 함수로 간단히 처리할 수 있죠. 크기는 hypertable_size(), hypertable_detailed_size()로 확인해요.

실제 적용 (데이터스케쳐스)

Events의 시계열 데이터(트래픽·이벤트)를 하이퍼테이블에 적재하는 쪽을 시나리오로 두고 있어요. 이벤트가 계속 쌓이므로, 시간 파티셔닝을 해두면 "지난 24시간 동안의 지표" 같은 시간 범위 질의가 전체를 훑지 않고 필요한 청크만 읽어요.

이때 청크 크기를 운영 지표로 보는 게 중요해요. 청크가 지나치게 커지면 성능이 떨어질 수 있으니, 시간 간격을 트래픽 규모에 맞춰 조정하고, 오래된 데이터는 drop_chunks() 같은 수명 정책으로 정리해요. 하이퍼테이블로 쌓은 시간 데이터를 미리 집계해 두는 방법은 연속 집계에서 이어져요. 전체 데이터 구조는 TimescaleDB에서 봐요.

더 알아보기