Skip to main content
[ PIER ]

TimescaleDB

PostgreSQL 的时序扩展 —— 用 PostgreSQL 的成本得到时序数据库的性能。

Database #sql#relational#time-series#timescale#postgresql

TimescaleDB 是一个 PostgreSQL 扩展,将 Postgres 变成高性能时序数据库。相同的 SQL、相同的驱动、相同的运维工具 —— 但内置 hypertable、列式压缩、持续聚合和数据保留策略。

使用 Pier 部署

  1. 1 打开 Pier 控制台,点击 Add service。
  2. 2 从模板列表中选择 TimescaleDB。
  3. 3 选择版本、设置服务名称,Pier 会自动配置容器、存储和端口。
  4. 4 如需 HTTPS,请绑定域名。Traefik 会自动签发 Let's Encrypt 证书。

什么是 TimescaleDB?

TimescaleDB 是一个 PostgreSQL 扩展 —— 不是独立的数据库。你把它安装到普通的 Postgres 实例中,执行 CREATE EXTENSION timescaledb,然后用一个函数调用就能 把现有表转成 hypertable。

底层上,hypertable 对应用来说就是一张普通表,但它会按时间静默地分区成”分块 (chunk)” —— 通常一天或一周一个分块。新写入流向最新分块;旧分块可以被 自动压缩、重排或删除。

结果:你保留了 PostgreSQL 的事务语义、Join、外键、索引、JSONB、全文搜索、 地理空间(PostGIS)以及整个驱动、ORM 和工具生态 —— 同时获得可与专用列式 数据库媲美的时序性能。

Pier 如何部署它

Pier 使用 Docker Hub 上 timescale/timescaledb 官方镜像。默认版本是 latest-pg17(PostgreSQL 17 + 最新 TimescaleDB),版本选择器中也提供 latest-pg18。数据卷挂载到 /var/lib/postgresql/data —— 该镜像的标准 PGDATA 位置。

创建服务时,Pier 会生成强密码、配置持久卷、在 Pier 内部网络上暴露 5432 端口,并可通过 Traefik 选择性发布。备份、时间点恢复、密码轮换和 连接字符串生成的工作方式与普通 PostgreSQL 模板相同 —— TimescaleDB 与 Postgres 协议兼容,因此运维工具完全相同。

何时不要使用 TimescaleDB

如果工作负载是纯 OLTP 且没有时序成分,普通 PostgreSQL 更简单更轻。如果需要 在超宽列式数据上进行 PB 级分析且不需要 Join 或可变性,ClickHouse 可能更合适。 如果只需要为小型集群进行短期指标抓取,原生 Prometheus 通常就够了。

其他场景 —— 应用指标、物联网、事件、日志、金融数据、实时面板 —— TimescaleDB 正好命中”无聊的 SQL 也能扩展”的甜点区。

核心功能

Hypertables(超表)

按时间自动分区的表。像写普通表一样插入数据;查询计划器透明地跨分块路由。在 5 美元 VPS 上即可达到每秒数十万行的毫秒级写入。

持续聚合(Continuous Aggregates)

基于时间桶的物化视图,增量刷新。无需重新计算即可在数年原始数据上获得亚秒级查询。

列式压缩

时序数据通常压缩 90–98%,无需重写查询。压缩后的分块仍可查询和更新。

数据保留策略

按时间自动删除旧分块。无 DELETE 膨胀、无需手动调优 vacuum、无需 cron 任务。

100% PostgreSQL

psql、pg_dump、pgBouncer、Prisma、SQLAlchemy、GORM、Hasura、PostGIS —— 任何与 PostgreSQL 兼容的工具都能直接使用。Join、外键、事务、ACID 全部保留。

内置作业调度器

用于压缩、保留、刷新和自定义函数的后台作业 —— 无需外部调度器或 cron 容器。

应用场景

应用指标与 APM

用单一的 Postgres 兼容存储替代 Prometheus + remote-write 栈。Grafana 原生支持 TimescaleDB 数据源。

物联网与传感器数据

每秒从设备摄取数十万个数据点。最近一小时查询毫秒级延迟,最近 10 年从压缩分块中查询。

金融 tick 数据

通过持续聚合生成 OHLC K 线,亚秒级回测,tick 级审计追踪,且不放弃 SQL Join。

实时分析面板

直接基于实时事件数据驱动 Power BI / Metabase / Grafana 面板。无 ETL、无 Lambda 架构、无独立 OLAP 存储。

日志与事件

结合 JSONB 列和时序语义的结构化日志存储。对于中小日志量,可替代 ELK/Loki。

代码示例

创建 hypertable sql
CREATE TABLE metrics (
  time   TIMESTAMPTZ NOT NULL,
  device TEXT NOT NULL,
  value  DOUBLE PRECISION
);
SELECT create_hypertable('metrics', 'time');

CREATE INDEX ON metrics (device, time DESC);
持续聚合(5 分钟汇总) sql
CREATE MATERIALIZED VIEW metrics_5m
WITH (timescaledb.continuous) AS
SELECT time_bucket('5 minutes', time) AS bucket,
       device,
       avg(value)   AS avg,
       max(value)   AS max,
       min(value)   AS min,
       count(*)     AS n
FROM metrics
GROUP BY bucket, device;

SELECT add_continuous_aggregate_policy('metrics_5m',
  start_offset      => INTERVAL '7 days',
  end_offset        => INTERVAL '5 minutes',
  schedule_interval => INTERVAL '5 minutes');
压缩与保留 sql
ALTER TABLE metrics SET (
  timescaledb.compress,
  timescaledb.compress_segmentby = 'device'
);
SELECT add_compression_policy('metrics', INTERVAL '7 days');
SELECT add_retention_policy('metrics', INTERVAL '1 year');
查询时间范围 sql
SELECT time_bucket('1 hour', time) AS hour,
       device,
       avg(value)
FROM metrics
WHERE time > now() - INTERVAL '24 hours'
GROUP BY hour, device
ORDER BY hour;

对比

vs PostgreSQL TimescaleDB 本身就是带时序扩展的 PostgreSQL。当工作负载既包含时序数据又包含事务数据时使用 —— 一个数据库搞定,保留 Postgres 的开发体验。
vs InfluxDB Influx 使用自有查询语言(Flux/InfluxQL),没有 Join、外键或 SQL 生态。TimescaleDB 保留 SQL、Join、事务和你现有的 ORM。
vs ClickHouse ClickHouse 在超高基数的 OLAP 吞吐上占优;TimescaleDB 在行级一致性、Join、可变性和 Postgres 生态契合度上更强。
vs Prometheus Prometheus 是抓取式监控系统,不是长期存储。可以用 TimescaleDB 作为持久后端(remote_write),保留 Prometheus 用于短期抓取。

常见问题

TimescaleDB 是免费的吗?
是。社区版(Timescale License + 核心 Apache 2.0)随官方 Docker 镜像发布,包含 hypertable、压缩、持续聚合、保留和重排策略。Pier 部署的就是社区镜像 —— 无许可证密钥、无遥测。
与原生 PostgreSQL + TIMESTAMPTZ 列有何不同?
原生 Postgres 在小规模下可用,但很快会退化 —— 单个巨型表、保留靠昂贵的 DELETE、无列式压缩、分析查询慢。TimescaleDB 增加了自动分块、查询计划器感知、90%+ 压缩、持续聚合和自动保留 —— 对应用完全透明。
我现有的 ORM(Prisma、SQLAlchemy、GORM、ActiveRecord)能用吗?
能。协议、系统目录、DDL 都是纯 PostgreSQL。ORM 看到的就是普通表;hypertable 内部对应用透明。迁移通过 pg_dump/pg_restore 完成。
最大数据量是多少?
生产部署单节点常态运行超过 100 TB、数万亿行。时序数据通常获得 10–20 倍压缩,1 TB 原始数据在磁盘上约占 50–100 GB。
如何从 InfluxDB 或原生 PostgreSQL 迁移?
从 Postgres —— 对现有表执行 SELECT create_hypertable(),现有数据成为单个分块。从 Influx —— 使用 outflux 工具或编写小型 CSV 导入;tag 成为索引列,field 成为 double precision 列。
启用压缩的 hypertable 上能用持续聚合吗?
能。从 TimescaleDB 2.x 起,持续聚合可透明地在压缩分块上运行 —— 无需在性能和压缩之间二选一。
Pier 部署的是哪个版本?
默认是 latest-pg17(PostgreSQL 17 + 最新 TimescaleDB),可选 latest-pg18。两者都是 Docker Hub 上 timescale/timescaledb 的官方社区镜像。

相关服务

在你的 VPS 上部署

TimescaleDB 是一个 PostgreSQL 扩展,将 Postgres 变成高性能时序数据库。相同的 SQL、相同的驱动、相同的运维工具 —— 但内置 hypertable、列式压缩、持续聚合和数据保留策略。

部署此服务 →