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
복사

