TimescaleDB
TimescaleDB — расширение Postgres для time-series данных: автоматическое партиционирование по времени (hypertables), continuous aggregates, retention/compression политики. ide99 рендерит UI поверх TimescaleDB-команд.
Когда полезно
Если данные имеют ось времени и накапливаются:
- IoT-метрики
- Логи событий
- Биржевые данные
- Мониторинг
TimescaleDB даёт две основные вещи:
- Hypertable — автопартиционирование по времени без ручной настройки
- Continuous aggregates — материализованные view, которые автообновляются по мере поступления новых данных
Активация
CREATE EXTENSION timescaledb;
На Postgres ≥ 17 версия TimescaleDB должна быть совместимой. Проверьте на docs.timescale.com.
В ide99 в Schema Browser у time-series-кандидатов появляется панель Timescale.
Создание hypertable
- Создайте обычную таблицу:
CREATE TABLE metrics (
ts TIMESTAMPTZ NOT NULL,
device_id TEXT NOT NULL,
temperature DOUBLE PRECISION,
humidity DOUBLE PRECISION
);
- Правый клик на
metrics → Convert to hypertable.
- Форма:
- Time column — какая колонка время (ide99 предложит TIMESTAMPTZ-кандидата)
- Chunk interval — за какой период один чанк (default
1 day, для редкой записи — 1 week)
- Space partitioning (опционально) — дополнительное партиционирование по
device_id или подобному
- ide99 покажет:
SELECT create_hypertable('metrics', 'ts', chunk_time_interval => INTERVAL '1 day');
После — таблица в Schema Browser получит иконку «hypertable», в дереве будут видны чанки.
Continuous aggregates
«Я хочу час за часом видеть среднюю температуру по устройству — но не пересчитывать с нуля каждый раз».
Решение — continuous aggregate:
- Правый клик на hypertable → New continuous aggregate.
- Форма:
- Name — имя view (
metrics_hourly)
- Time bucket —
1 hour, 1 day, custom interval
- Aggregation — выбрать колонки и функции (avg, sum, min, max, count, percentile_disc(0.95))
- Group by — дополнительные ключи (device_id, region)
- ide99 соберёт SQL:
CREATE MATERIALIZED VIEW metrics_hourly
WITH (timescaledb.continuous) AS
SELECT
time_bucket('1 hour', ts) AS bucket,
device_id,
avg(temperature) AS avg_temp,
percentile_disc(0.95) WITHIN GROUP (ORDER BY temperature) AS p95_temp
FROM metrics
GROUP BY bucket, device_id;
- Затем настроите refresh policy:
SELECT add_continuous_aggregate_policy(
'metrics_hourly',
start_offset => INTERVAL '1 month',
end_offset => INTERVAL '1 hour',
schedule_interval => INTERVAL '15 minutes'
);
ide99 покажет визард: какой период обновлять, как часто.
После создания — обращайтесь к metrics_hourly как к обычной view, но получите быстрый ответ.
Compression
Старые чанки можно сжимать на диске (5–20× меньше места, но медленнее на запрос).
Правый клик на hypertable → Compression policy:
- Compress after: данные старше N дней/недель сжать
- Segment by: по каким колонкам группировать данные внутри чанка для лучшего сжатия (обычно —
device_id)
- Order by: внутри сегмента отсортировать (обычно —
ts DESC)
ide99 сгенерирует:
ALTER TABLE metrics SET (
timescaledb.compress,
timescaledb.compress_segmentby = 'device_id',
timescaledb.compress_orderby = 'ts DESC'
);
SELECT add_compression_policy('metrics', INTERVAL '7 days');
Retention
«Хочу хранить только последние 90 дней».
Правый клик → Retention policy:
- Drop after: удалять чанки старше N интервалов
- Schedule: как часто запускать политику
ide99 сгенерирует:
SELECT add_retention_policy('metrics', INTERVAL '90 days');
После этого старые чанки будут удаляться автоматически.
Просмотр чанков
В дереве у hypertable вы увидите все чанки:
metrics (hypertable, 91 chunks, compression: 23 compressed)
├─ _hyper_1_1_chunk (2026-01-01 — 02, 4.2 MB)
├─ _hyper_1_2_chunk (2026-01-02 — 03, 4.5 MB)
└─ ...
Иконка показывает: ✓ compressed, ↻ active, ✕ to be dropped (matches retention policy).
Что дальше