Search

TimescaleDB + PostgreSQL

TimescaleDB 핵심 개념 3가지

 Hypertable

일반 테이블을 시계열 데이터용으로 변환한 것
-- 1단계: 일반 테이블 생성 CREATE TABLE metrics ( time TIMESTAMPTZ NOT NULL, service_name TEXT, latency DOUBLE PRECISION ); -- 2단계: Hypertable로 변환 (마법!) SELECT create_hypertable('metrics', 'time');
SQL
복사
중요한 이유 :
자동으로 시간 기준 데이터 분할 (Chunk)
오래된 데이터 빠른 삭제 가능
쿼리 성능 대폭 향상
예시 : 1년치 데이터를 월별로 자동 분할 저장

 Continuous Aggregates(실시간 통계)

미리 계산된 통계 뷰(SRE 서비스에 필수)
-- 1분마다 평균 지연시간 자동 계산 CREATE MATERIALIZED VIEW metrics_1min WITH (timescaledb.continuous) AS SELECT time_bucket('1 minute', time) AS bucket, service_name, AVG(latency) AS avg_latency, MAX(latency) AS max_latency, COUNT(*) AS request_count FROM metrics GROUP BY bucket, service_name;
SQL
복사
장점 :
실시간으로 계속 업데이트
대시보드 쿼리 속도 100배 빠름
예시: "최근 1시간 평균 지연시간" 조회가 0.01초 만에 완료

 Data Retention(자동 삭제 정책)

오래된 데이터 자동 삭제
-- 30일 이상 된 데이터 자동 삭제 SELECT add_retention_policy('metrics', INTERVAL '30 days');
SQL
복사
예시: 2024년 1월 데이터가 30일 지나면 자동으로 사라짐

PostgreSQL 기본 문법

데이터 타입

-- 자주 쓰는 타입들 TIMESTAMPTZ -- 시간 (타임존 포함) → '2025-10-31 15:30:00+09' TEXT -- 문자열 → 'api-server' INTEGER -- 정수 → 500 DOUBLE PRECISION -- 실수 → 123.45 BOOLEAN -- 참/거짓 → true, false
SQL
복사

테이블 생성 (CREATE TABLE)

-- SRE 서비스용 메트릭 테이블 CREATE TABLE metrics ( time TIMESTAMPTZ NOT NULL, -- 시간 (필수) service_name TEXT NOT NULL, -- 서비스명(필수) endpoint TEXT, -- API 엔드포인트 latency DOUBLE PRECISION, -- 지연시간 (ms) status_code INTEGER, -- HTTP 상태코드 error_message TEXT -- 에러 메시지 );
SQL
복사
NOT NULL: 필수 값 (비어있으면 안됨)
DOUBLE PRECISION: 소수점 있는 숫자

데이터 삽입 (INSERT)

-- 한 줄 삽입 INSERT INTO metrics (time, service_name, latency, status_code) VALUES (NOW(), 'api-server', 45.2, 200); -- 여러 줄 삽입 INSERT INTO metrics (time, service_name, latency, status_code) VALUES (NOW(), 'api-server', 45.2, 200), (NOW(), 'auth-server', 120.5, 200), (NOW(), 'api-server', 89.3, 500);
SQL
복사

집계 함수 (통계 계산)

-- 평균 지연시간 SELECT AVG(latency) FROM metrics; -- 서비스별 통계 SELECT service_name, AVG(latency) AS avg_latency, -- 평균 MAX(latency) AS max_latency, -- 최대값 MIN(latency) AS min_latency, -- 최소값 COUNT(*) AS total_requests -- 개수 FROM metrics GROUP BY service_name; -- 서비스별로 그룹화 ``` 결과 예시: ``` service_name | avg_latency | max_latency | total_requests --------------+-------------+-------------+--------------- api-server | 67.5 | 230.1 | 1523 auth-server | 45.2 | 150.3 | 892
SQL
복사

시간대별 집계 (TimescaleDB 특화)

-- 1분 단위로 평균 계산 SELECT time_bucket('1 minute', time) AS minute, AVG(latency) AS avg_latency FROM metrics WHERE time > NOW() - INTERVAL '1 hour' GROUP BY minute ORDER BY minute DESC; ``` 결과 예시: ``` minute | avg_latency ---------------------+------------ 2025-10-31 15:30:00 | 78.3 2025-10-31 15:29:00 | 65.2 2025-10-31 15:28:00 | 92.1
SQL
복사

데이터 수정/삭제

-- 수정 (UPDATE) UPDATE metrics SET status_code = 500 WHERE latency > 1000; -- 삭제 (DELETE) DELETE FROM metrics WHERE time < NOW() - INTERVAL '30 days';
SQL
복사