Декларативное партиционирование в PostgreSQL требует, чтобы кто-то заранее создавал секции под будущие даты — вручную или крон-скриптом, иначе вставка в несуществующий диапазон просто упадёт с ошибкой. TimescaleDB — это расширение поверх PostgreSQL, которое берёт ровно эту рутину на себя: таблица превращается в hypertable, а партиции («чанки») создаются автоматически по мере поступления данных.

CREATE TABLE metrics (
    time        TIMESTAMPTZ NOT NULL,
    host        TEXT NOT NULL,
    cpu_percent DOUBLE PRECISION
);

SELECT create_hypertable('metrics', 'time');

Снаружи metrics выглядит как обычная таблица — тот же INSERT, тот же SELECT — но физически строки лежат по чанкам фиксированного временного интервала (по умолчанию 7 дней, меняется через chunk_time_interval в create_hypertable или глобально через timescaledb.default_chunk_time_interval). Новый чанк создаётся сам, как только приходит строка с временем за пределами существующих — никакого аналога CREATE TABLE ... PARTITION OF под будущий месяц заранее.

Второй инструмент, которого в ванильном PostgreSQL просто нет — continuous aggregate: материализованное представление, которое TimescaleDB дообновляет сам по расписанию, а не ждёт ручного REFRESH MATERIALIZED VIEW:

CREATE MATERIALIZED VIEW metrics_hourly
WITH (timescaledb.continuous) AS
SELECT time_bucket('1 hour', time) AS hour,
       host,
       avg(cpu_percent) AS avg_cpu
FROM metrics
GROUP BY hour, host;

SELECT add_continuous_aggregate_policy('metrics_hourly',
    start_offset => INTERVAL '3 hours',
    end_offset   => INTERVAL '1 hour',
    schedule_interval => INTERVAL '1 hour');

Политика обновляет только свежий хвост (start_offset/end_offset задают окно), а не весь агрегат целиком — на таблице с историей в сотни миллионов строк это разница между секундной фоновой задачей и многочасовым пересчётом.

Если нужно просто не потерять возможность быстро дропнуть старые месяцы — хватает обычного PARTITION BY RANGE и DETACH/DROP руками, без лишней зависимости в кластере. TimescaleDB имеет смысл тащить, когда к автоматическому чанкованию добавляется реальная потребность в continuous aggregate — дашборд, которому нужны почасовые средние по миллиардам точек без пересчёта на каждый запрос.

#postgresql #sysadmin #database