TimescaleDB
PostgreSQL 的时序扩展 —— 用 PostgreSQL 的成本得到时序数据库的性能。
TimescaleDB 是一个 PostgreSQL 扩展,将 Postgres 变成高性能时序数据库。相同的 SQL、相同的驱动、相同的运维工具 —— 但内置 hypertable、列式压缩、持续聚合和数据保留策略。
使用 Pier 部署
- 1 打开 Pier 控制台,点击 Add service。
- 2 从模板列表中选择 TimescaleDB。
- 3 选择版本、设置服务名称,Pier 会自动配置容器、存储和端口。
- 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。
代码示例
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); 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'); 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'); 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 是免费的吗?
与原生 PostgreSQL + TIMESTAMPTZ 列有何不同?
我现有的 ORM(Prisma、SQLAlchemy、GORM、ActiveRecord)能用吗?
最大数据量是多少?
如何从 InfluxDB 或原生 PostgreSQL 迁移?
启用压缩的 hypertable 上能用持续聚合吗?
Pier 部署的是哪个版本?
相关服务
在你的 VPS 上部署
TimescaleDB 是一个 PostgreSQL 扩展,将 Postgres 变成高性能时序数据库。相同的 SQL、相同的驱动、相同的运维工具 —— 但内置 hypertable、列式压缩、持续聚合和数据保留策略。
部署此服务 →