
1. 시계열은 어떤 개념이며, TimeScaleDB 는 또 무엇인가?
시계열 데이터란 일정한 시간의 흐름대로 순차적으로 기록되는 데이터를 의미한다. 일정한 간격( 정하기 나름)으로 측정하거나, 발생되는 데이터를 시간 정보와 함께 저장하는 것. 이것을 시계열 데이터라고 할 수 있다.
TimescaleDB는 시계열 데이터를 효율적으로 저장하고 조회할 수 있도록 설계된 오픈소스 데이터베이스이다. PostgreSQL을 기반으로 동작하며, 기존 SQL 문법을 그대로 사용할 수 있다는 점이 큰 장점이다.
TimescaleDB는 대용량의 시간 기반 데이터(센서 데이터, 서버 모니터링 데이터 등)를 빠르고 안정적으로 관리할 수 있도록 최적화되어 있다. 일반 테이블 대신 Hypertable이라는 구조를 사용하여 시간 축에 따라 데이터를 자동으로 분할 저장한다. 덕분에 데이터가 아무리 많아져도 조회 성능이 급격히 떨어지지 않는다.
또, 복잡한 설치나 학습 없이 기존 PostgreSQL 사용 경험만으로 쉽게 시작할 수 있으며 시간 순서대로 쌓이는 데이터는 마치 매일매일 한 장씩 추가되는 일기장과 같다고 볼 수 있다. TimescaleDB는 이 일기장을 빠르게 찾고 정리할 수 있도록 도와주는 데이터베이스이다.
2. TimescaleDB 설치하기
TimescaleDB는 PostgreSQL을 확장하는 형태로 설치하여 사용할 수 있다. 따라서 PostgreSQL이 설치되어 있어야 하며, 설치된 버전에 맞는 TimescaleDB 패키지를 추가하면 된다.
Ubuntu 환경에서 TimescaleDB를 설치하는 기본 과정은 다음과 같다.
2-1. 준비 ( 설치가 되어있다는 전제 하에 버전 확인 )
psql --version

2-2. TimescaleDB 공식 저장소를 추가
- GPG 키 등록
sudo apt install timescaledb-postgresql-16

- 저장소 리스트에 추가
echo "deb https://packagecloud.io/timescale/timescaledb/ubuntu/ jammy main" | sudo tee /etc/apt/sources.list.d/timescaledb.list
2-3. 패키지목록 업데이트 후 TimescaleDB 패키지 설치
-패키지 목록 업데이트
sudo apt update

-TimescaleDB 패키지 설치
TimescaleDB는 PostgreSQL 메이저 버전 단위로 패키지를 만들기 때문에 소수점 앞자리(16)까지만 맞추면 된다.
sudo apt install timescaledb-2-postgresql-16

2-4. DB 재시작 및 TimescaleDB 확장 활성화 해주기
- 재시작
sudo service postgresql restart
-postgresql 접속
sudo -u postgres psql
접속하면 터미널의 명령 프롬프트가 postgres-# 으로 바뀐다.

- TimescaleDB 활성화 하기
CREATE EXTENSION IF NOT EXISTS timescaledb;

>> TimescaleDB를 미리 preload(shared_preload_libraries)에 등록해야 한다는 에러가 나왔다. 이건 TimescaleDB가 PostgreSQL 서버가 시작될 때 미리 메모리에 올라가야 하는 구조이기 때문이다.
→ 해결 방법은 PostgreSQL 설정 파일(postgresql.conf)을 수정해주고, 서버를 재시작 하면 된다.
2-5. 설정파일 수정 후 재시작, 재 적용하기
- postgresql 에 접속된 프롬프트에서 exit 를 입력하여 DB 접속을 해제하고 설정파일을 vi 편집기로 열어준다.
sudo vi /etc/postgresql/16/main/postgresql.conf

주석을 해제하고 shared_preload_libraries = 'timescaledb' (작은 따옴표) 로 입력하고 저장하고 나와야 한다.

- postgresql 을 재 시작후, 다시 적용해준다. 명령어 순서는 아래와 같다.
sudo service postgresql restart #재시작
sudo -u postgres psql #postgresql 접속
CREATE EXTENSION IF NOT EXISTS timescaledb; #적용

위와 같이 CREATE_EXTENSION 이 반환되면 정상적으로 TimescaleDB 가 적용된 것이다.
3. Hypertable 만들기
시간 축에 따라 데이터를 자동으로 분할 저장한다는 Hypertable을 만들고, 데이터를 저장해보자.
먼저 시계열 데이터를 저장할 기본 테이블을 만든다. 이때 주의할 점은 반드시 시간 컬럼(timestamp 타입)이 하나 있어야 한다.
시간 컬럼을 포함하여 테이블을 만드는 것은 일반적인 PostgreSQL 테이블 생성 과정과 다르지 않다.
CREATE TABLE sensor_data (
time TIMESTAMPTZ NOT NULL,
sensor_id INT,
temperature DOUBLE PRECISION
);
sql 문 이므로 postgresql 에 접속하고 실행해야 한다.
TimescaleDB의 핵심 기능은 테이블을 Hypertable로 변환하는 데 있다. Hypertable은 내부적으로 데이터를 시간 축에 따라 자동으로 분할 관리하기 때문에, 데이터가 많아져도 조회 성능이 급격히 떨어지지 않는다.
변환 방법은 변환할 테이블 이름과 시계열 기준이 되는 칼럼을 이용하여 입력해주면 된다. 아래와 같이 간단하다.
SELECT create_hypertable('sensor_data', 'time');

별다른 에러 없이 기본 테이블을 만들고, Hypertable 변환에 성공하였다.
4. 연습용 더미 데이터 삽입하기
-20개 정도의 더미 데이터를 삽입한다.
INSERT INTO sensor_data (time, sensor_id, temperature)
VALUES
(NOW() - INTERVAL '1 minute', 1, 22.5),
(NOW() - INTERVAL '2 minutes', 1, 22.7),
(NOW() - INTERVAL '3 minutes', 1, 22.8),
(NOW() - INTERVAL '4 minutes', 1, 23.0),
(NOW() - INTERVAL '5 minutes', 1, 22.9),
(NOW() - INTERVAL '6 minutes', 1, 22.6),
(NOW() - INTERVAL '7 minutes', 1, 22.4),
(NOW() - INTERVAL '8 minutes', 1, 22.5),
(NOW() - INTERVAL '9 minutes', 1, 22.3),
(NOW() - INTERVAL '10 minutes', 1, 22.6),
(NOW() - INTERVAL '20 minutes', 1, 23.1),
(NOW() - INTERVAL '25 minutes', 1, 22.9),
(NOW() - INTERVAL '30 minutes', 1, 23.0),
(NOW() - INTERVAL '35 minutes', 1, 23.2),
(NOW() - INTERVAL '40 minutes', 1, 23.3),
(NOW() - INTERVAL '45 minutes', 1, 23.1),
(NOW() - INTERVAL '50 minutes', 1, 22.8),
(NOW() - INTERVAL '55 minutes', 1, 22.7),
(NOW() - INTERVAL '60 minutes', 1, 22.9),
(NOW() - INTERVAL '65 minutes', 1, 23.0);

5. 시간대별 집계 해보기
TimescaleDB에서는 time_bucket 함수를 사용해 특정 시간 간격으로 데이터를 그룹핑할 수 있다. 예를 들어,
- 5분 단위로 평균 온도
- 1시간 단위로 최대 온도
이런 식으로 집계할 수 있다.
기존 PostgreSQL의 GROUP BY만으로는 복잡했던 시간대별 집계를, TimescaleDB는 time_bucket 하나로 아주 쉽게 처리할 수 있다.
5-1. 10분 단위로 입력한 데이터인 'temperature' 의 평균 구하기
SELECT
time_bucket('10 minutes', time) AS bucket,
AVG(temperature) AS avg_temperature
FROM sensor_data
GROUP BY bucket
ORDER BY bucket DESC;
- '10 minutes': 10분 단위로 묶는다.
- AVG(temperature): 묶인 그룹 안에서 평균 온도를 계산한다.
- GROUP BY bucket: 각 시간대별로 결과를 묶는다.
- ORDER BY bucket DESC: 가장 최근 시간대부터 내림차순 정렬한다.

5-2. TimescaleDB 를 사용하지 않았다면 작성해야 하는 쿼리문
SELECT
date_trunc('hour', time) + INTERVAL '10 minutes' * FLOOR(EXTRACT(minute FROM time) / 10) AS bucket,
AVG(temperature) AS avg_temperature
FROM sensor_data
GROUP BY bucket
ORDER BY bucket DESC;
>>일반 SQL에서는 시간을 10분 단위로 "수동으로 잘라서" 그룹핑을 해야 한다. 즉 TimescaleDB가 없으면 date_trunc + extract + interval 계산을 조합해서 처리해야 한다.
6. 마무리
TimescaleDB는 시계열 데이터를 관리하기 위해 만들어진 PostgreSQL 확장 모듈이다. 기존 SQL 문법을 그대로 사용할 수 있으면서, 시간 기반 데이터에 최적화된 기능을 제공한다.
오늘 실습에서는 TimescaleDB를 설치하고, Hypertable을 생성한 뒤, 연습 데이터를 삽입하고, time_bucket 함수를 사용해 시간대별 평균 온도를 집계해보았다. 일반 SQL만으로 시간대별 집계를 하려면 복잡한 시간 계산이 필요하지만,TimescaleDB time_bucket 하나로 간결하게 해결할 수 있었다. 덕분에 쿼리 작성이 단순해지고, 가독성도 좋아졌다.
특히, 데이터가 많아질수록 Hypertable 구조의 강점이 두드러질 것 같다. 시간 축을 기준으로 데이터를 자동으로 분할 관리하기 때문에, 수백만 건 이상의 시계열 데이터가 쌓여도 성능 저하 없이 안정적으로 조회할 수 있을 것이란 생각이 들었다.
오늘 실습을 통해 TimescaleDB의 기본 구조와 동작 원리를 직접 경험해볼 수 있었고, 시계열 데이터를 다루는 환경에서는 왜 이런 전문 도구가 필요한지 체감할 수 있었다.
'DB 공부 > DB 기술 및 개념' 카테고리의 다른 글
| [DB] PostgreSQL 은 왜 프로세스가 이렇게 많을까? (0) | 2025.10.01 |
|---|