分类:16.对比 | 篇章:02 vs TimescaleDB
免费详情
TimescaleDB 是基于 PostgreSQL 的时序扩展,TDengine 是从底层重新设计的时序数据库。本文对比两者的架构、性能、特性、生态。
速查对比
| 基础 | 独立引擎 | PostgreSQL 扩展 |
| 协议 | TAOS / WS / REST | PostgreSQL Wire |
| 数据模型 | STable + SubTable | Hypertable + Chunks |
| 查询语言 | SQL | PostgreSQL SQL |
| 副本 | 内置 RAFT | PG 流复制/集群 |
| 横向扩展 | 原生 | Distributed Hypertable(部分) |
| 压缩 | 列存高压缩 | 行存 + 列段压缩 |
| 关联查询 | JOIN 时序优化 | PG JOIN 强 |
| 生态 | 自有生态 | PG 完整生态 |
详细对比
1. 架构差异
TDengine:
┌─────────────────────────┐
│ 独立时序数据库引擎 │
│ ───────────────── │
│ MNode + VNode + QNode │
│ TSDB 存储引擎 │
│ 多协议接入 │
└─────────────────────────┘
– 从零设计为时序
– 列存 + Tag 索引
– 内置分布式
TimescaleDB:
┌─────────────────────────┐
│ PostgreSQL 扩展 │
│ ───────────────── │
│ Hypertable (分块) │
│ PG 索引 + 列段压缩 │
│ PG 全功能 │
└─────────────────────────┘
– 基于 PG(多模型)
– 时序+关系混合
– 通过 PG 集群方案扩展
2. 数据模型
— TDengine
CREATE STABLE meters (
ts TIMESTAMP, current FLOAT
) TAGS (
location NCHAR(20)
);
— 写入自动创建子表
INSERT INTO d_001 USING meters TAGS ('Beijing') VALUES (NOW, 25.3);
— TimescaleDB
CREATE TABLE meters (
ts TIMESTAMPTZ NOT NULL,
device_id TEXT NOT NULL,
location TEXT,
current FLOAT
);
SELECT create_hypertable('meters', 'ts');
CREATE INDEX ON meters (device_id, ts DESC);
INSERT INTO meters VALUES (NOW(), 'd_001', 'Beijing', 25.3);
对比:
TDengine:
– 一设备一子表(隐式分片)
– Tag 索引天然按设备聚合
– 适合大量设备
TimescaleDB:
– 一个表 + Chunks
– 普通索引(B-Tree)
– 适合关系+时序混合
TDengine 优势:
– 千万级设备性能不衰减
– Tag 索引高效
– 列存压缩极致
TimescaleDB 优势:
– JOIN 丰富表数据
– 灵活 schema
– PG 类型系统强大
3. 查询性能
— 查询 1: 单设备最新(两者都快)
— TDengine
SELECT * FROM meters
WHERE device_id = 'd_001'
ORDER BY ts DESC LIMIT 1;
— TimescaleDB
SELECT * FROM meters
WHERE device_id = 'd_001'
ORDER BY ts DESC LIMIT 1;
— 查询 2: 大范围聚合
— TDengine(用 TSMA 数十毫秒)
SELECT _wstart, AVG(current)
FROM meters
WHERE ts > NOW – 30d
INTERVAL(1d);
— TimescaleDB(Continuous Aggregate)
CREATE MATERIALIZED VIEW meters_daily
WITH (timescaledb.continuous) AS
SELECT time_bucket('1 day', ts) AS day, AVG(current)
FROM meters
GROUP BY day;
SELECT * FROM meters_daily
WHERE day > NOW() – INTERVAL '30 days';
— 查询 3: 大量设备分组
— TDengine(PARTITION BY 高效)
SELECT device_id, AVG(current)
FROM meters
WHERE ts > NOW – 1h
PARTITION BY device_id;
— TimescaleDB
SELECT device_id, AVG(current)
FROM meters
WHERE ts > NOW() – INTERVAL '1 hour'
GROUP BY device_id;
性能参考:
10 亿行 30 天聚合:
TDengine(带 TSMA):~500ms
TimescaleDB(带 CAGG):~1s
10 万设备分组:
TDengine:~200ms
TimescaleDB:~500ms
小范围明细:双方相近
4. 写入性能
单节点写入吞吐(参考):
TDengine:
– STMT2: ~10M points/sec
– InfluxDB Line: ~3M points/sec
TimescaleDB:
– COPY: ~2M rows/sec
– INSERT: ~500K rows/sec
TDengine 优势:
– 多种高效写入接口
– 列存压缩高
– 分布式天然支持
TimescaleDB 优势:
– PG 兼容(用 PG 写工具)
– 事务保证
5. 高可用与扩展
TDengine(开源):
✓ 内置 RAFT REPLICA 3
✓ 自动故障转移
✓ 一键扩容(CREATE DNODE)
✓ 100+ 节点验证
TimescaleDB(开源):
✓ PG 流复制(主从)
✓ Patroni 等 HA 工具
✓ Distributed Hypertable(已弃用部分场景)
TimescaleDB Cloud:
✓ 全托管
✓ 高可用
✓ 自动备份
对比:
– 开源版扩展性:TDengine 占优
– PG 工具链:TimescaleDB 完整
6. 关系/JOIN 能力
— TimescaleDB:PG 原生 JOIN 强大
SELECT
m.ts, m.current,
d.model, d.installer
FROM meters m
JOIN device_info d ON m.device_id = d.id
WHERE m.ts > NOW() – INTERVAL '1 day';
— 还可 LATERAL、WINDOW FUNCTION、CTE 等
— TDengine:JOIN 支持但场景化
— 强于时序场景(按 ts 对齐)
SELECT m1.ts, m1.current, m2.voltage
FROM meters m1
JOIN voltage_table m2 ON m1.ts = m2.ts
WHERE m1.device_id = 'd_001';
对比:
关系型 JOIN:
– TimescaleDB 完整 PG 能力
– TDengine 简化但够用
时序 JOIN:
– TDengine 优化好(按 ts 对齐)
– TimescaleDB 通用 JOIN
7. 生态对比
TDengine:
✓ taosAdapter 多协议网关
✓ Grafana 官方插件
✓ Telegraf / collectd / Prometheus / StatsD
✓ Java/Python/Go/Rust/C/C#/Node 客户端
✓ Flink/Spark/Kafka Connect
✓ 工业协议(OPC UA, Modbus 等)
✓ 自有 Explorer Web UI
TimescaleDB:
✓ 整个 PostgreSQL 生态
✓ pgAdmin/DBeaver/任意 PG 工具
✓ Grafana PG 数据源
✓ 所有 PG 驱动/ORM
✓ Hasura/PostgREST 等
✓ PG 扩展(PostGIS 等)
结论:
– PG 生态广度:TimescaleDB 完胜
– 时序专用工具:TDengine 完整
8. 选型建议
选 TDengine 的场景:
✓ 海量时序数据(百万+设备)
✓ 高吞吐写入需求
✓ 高压缩比要求
✓ 开源版需要分布式 HA
✓ 工业 OT 场景
✓ 主要是时序查询
选 TimescaleDB 的场景:
✓ 已有 PostgreSQL 体系
✓ 时序+关系数据混合
✓ 复杂 JOIN/事务
✓ PG 扩展依赖(PostGIS 等)
✓ 数据量中等
✓ 团队 PG 经验丰富
两者皆可:
– 中小规模时序
– DevOps 监控
– 用 SQL 的项目
代码示例
同样需求两种实现
— 需求:分析每月每个城市最大温度
— TDengine
SELECT
_wstart AS month,
city,
MAX(temperature) AS max_temp
FROM sensors
WHERE ts > NOW – 1y
PARTITION BY city
INTERVAL(1n);
— TimescaleDB
SELECT
time_bucket('1 month', ts) AS month,
city,
MAX(temperature) AS max_temp
FROM sensors
WHERE ts > NOW() – INTERVAL '1 year'
GROUP BY month, city
ORDER BY month;
TimescaleDB 迁移到 TDengine
# 思路:用 SQL 导出 + 转换 + 导入
# 1. 从 TimescaleDB 读
import psycopg2
pg = psycopg2.connect("…")
cur = pg.cursor()
cur.execute("SELECT * FROM meters WHERE ts > '2020-01-01'")
# 2. 转换写入 TDengine
import taosws
td = taosws.connect("…")
batch = []
for row in cur:
ts, device, location, current = row
batch.append((ts, device, location, current))
if len(batch) >= 10000:
write_to_td(batch)
batch = []
# 或用 taosX 配置 PostgreSQL Source
性能考量
写入对比
| 单条 INSERT | 弱(不推荐) | 中 |
| 批量 INSERT | 强 | 强 |
| 高吞吐 (1M+/s) | 强 | 中 |
存储对比
| 原始 100 GB | ~10 GB | ~30 GB |
| 含索引 | ~12 GB | ~50 GB |
FAQ
Q1: SQL 兼容性?
- TDengine:自有 SQL(接近标准)
- TimescaleDB:完整 PG SQL
- 迁移需调整少量函数
Q2: 事务支持?
- TDengine:单写入操作原子,无传统事务
- TimescaleDB:完整 ACID
Q3: PG 扩展(PostGIS)可用吗?
- TimescaleDB:是
- TDengine:内置 GEOMETRY 类型部分能力
Q4: 物化视图怎么对比?
- TDengine:流计算(实时增量)
- TimescaleDB:Continuous Aggregate(增量刷新)
Q5: 商业支持?
- TDengine:北京涛思
- Timescale:美国 Timescale Inc.
参考
系统构架篇
- 01-《TDengine 整体架构全景》
- 02-《集群拓扑深度解析》
- 03-《MNode 内部机制深度解析》
- 04-《RPC 通信层深度解析》
- 05-《VNode 生命周期》
- 06-《RAFT 共识协议》
- 07-《端到端的消息流》
数据模型
- 01-《数据库创建与参数详解》
- 02-《超级表/子表/普通表》
- 03-《支持数据类型深度解析》
- 04-《TDengine Tag 设计哲学与 Schema 变更机制》
- 05-《TDengine 虚拟表实现原理》
存储引擎
- 01-《TDengine 存储引擎概览》
- 02-《TDengine MemTable 深度解析》
- 03-《TDengine WAL 预写日志机制》
- 04-《TDengine 数据文件格式》
- 05-《TDengine Commit 与 Flush 机制 》
- 06-《TDengine Compaction 合并策略 》
- 07-《TDengine 数据保留与 TTL》
- 08-《TDengine 压缩编码机制》
- 09-《TDengine Cache 与 Last 查询加速》
- 10-《TDengine 逻辑计划生成》
查询引擎
- 01-《TDengine 查询引擎概览》
- 02-《TDengine SQL 解析与词法分析》
- 03-《TDengine 语义分析与 AST 重写》
- 04-《TDengine 逻辑计划生成》
- 05-《TDengine 物理计划生成》
- 06-《TDengine 扫描算子》
- 07-《TDengine 聚合算子》
- 08-《TDengine 连接算子》
- 09-《TDengine 排序、填充与投影》
- 10-《TDengine 分布式查询执行》
- 11-《TDengine EXPLAIN 与查询优化》
数据写入
- 01-《TDengine SQL INSERT》
- 02-《TDengine 无模式写入》
- 03-《TDengine STMT 写入》
- 04-《TDengine 写入内部流程》
- 05-《TDengine 数据更新删除》
数据订阅
- 01-《TDengine 数据订阅》
- 02-《TDengine 订阅 vs Kafka》
- 03-《TDengine TMQ 消费流程》
- 04-《TDengine 内部机制》
- 05-《TDengine TMQ 最佳实践》
预聚合
- 01-《TDengine RSMA》
- 02-《TDengine TSMA — 时间维度的物化聚合视图》
- 03-《TDengine SMA 内部实现》
索引
- 01-《TDengine Tag 索引》
- 02-《TDengine SMA 索引》
SQL 语句
- 01-《TDengine DDL》
- 02-《TDengine DML SELECT》
- 03-《TDengine DML 函数完整参考》
- 04-《TDengine JOIN 完整语法》
- 05-《TDengine 窗口完整语法》
- 06-《TDengine 操作符与表达式》
- 07-《TDengine 系统表》
- 08-《TDengine SQL 与标准 SQL 差异》
客户端与连接器
- 01-《TDengine 的连接方式》
- 02-《TDengine C/C++ 连接器》
- 03-《TDengine java 连接器》
- 04-《TDengine Python 连接器》
- 05-《TDengine Go 与 Rust 连接器》
- 06-《TDengine Node.js 与 C# 连接器》
运维
- 01-《TDengine 部署指南》
- 02-《TDengine 配置详解》
- 03-《TDengine 监控系统》
- 04-《TDengine 备份与恢复》
- 05-《TDengine 版本升级》
- 06-《TDengine 加密使用指南》
安全
- 01-《TDengine 认证与权限》
- 02-《TDengine 认证与权限》
- 03-《TDengine 审计日志》
生态
- 01-《TDengine taosAdapter》
- 02-《TDengine taosX 与 Explorer》
- 03-《TDengine Grafana 集成》
- 04-《TDengine 第三方工具》
应用案例
- 01-《TDengine IoT 设备监控》
- 02-《TDengine 工业大数据与智能制造》
- 03-《TDengine 车联网与新能源汽车》
- 04-《TDengine 能源与电力监控》
- 05-《TDengine IT 运维与可观测性》
产品对比
- 01-《TDengine vs InfluxDB》
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。





