时序数据库DolphinDB和TimescaleDB 性能对比测试报告
本页为“时序数据库DolphinDB和TimescaleDB 性能对比测试报告”,包含作者署名与发布日期信息。
Source: https://dolphindb.cn/blogs/54
What this page covers
- 报告基本信息(标题、作者、日期)。
- DolphinDB 与 TimescaleDB 的定位、特性与测试范围/结论概述。
- 测试环境与关键配置参数。
- 数据集、加载策略、清缓存方法、分区与索引策略。
- CSV 导入导出方法与性能结果。
- 磁盘空间占用对比及原因解释。
- 查询测试类别、性能对比与能力差异/限制。
技能认证特训营第二期报名信息
页面顶部提供活动报名入口与限时报名链接。
- 提供“技能认证特训营第二期”的报名链接。
时序数据库DolphinDB和TimescaleDB 性能对比测试报告(标题、作者、日期)
报告包含标题、作者署名与发布日期信息。
- 发布日期为 2021-08-05。
- 作者署名为 Junxi。
一、概述
本节介绍 DolphinDB 与 TimescaleDB 的定位与特性,并说明测试范围与主要结论。
- DolphinDB 以 C++ 编写。
- DolphinDB 定位为分析型的高性能分布式时序数据库。
- TimescaleDB 在 PostgreSQL 基础上开发,本质是 PostgreSQL 的插件。
- 测试范围包括 CSV 导入导出、磁盘空间占用、查询性能对比。
- 综合结论:在所有测试中 DolphinDB 表现更出色。
二、测试环境
本节说明测试采用单机方式,并列出硬件、操作系统、软件版本与关键调优参数。
- 因 TimescaleDB 不支持可写入集群,测试使用单机。
- 测试主机型号为 DELL OptiPlex 7060。
- 操作系统为 Ubuntu 16.04 LTS。
- DolphinDB 测试版本为 Linux v0.89 (2019.01.31)。
- PostgreSQL shared_buffers 与 effective_cache_size 均设置为 16GB。
三、数据集
本节描述小/大两类 CSV 数据集、加载策略与清缓存方式,并说明分区与索引策略及规模。
- 测试数据规模分组:小数据量级 4.2 GB;大数据量级 270 GB。
- 小数据量级测试预先将硬盘分区表全部加载到内存。
- 大数据量级测试不预加载,查询时间包含磁盘 I/O 时间。
- 小数据集(devices_big)为 4.2 GB CSV,约 3 千万条记录。
- 大数据集为 NYSE Level 1 报价数据(未压缩 CSV 共计 270 GB)。
四、数据导入导出测试
本节给出 DolphinDB 与 TimescaleDB 的 CSV 导入/导出方法、脚本要点与性能结果,并提及导入现象与索引构建耗时。
- DolphinDB 使用 loadTextEx(db, `taq, `date`symbol, fp, ,schema) 的循环脚本导入 CSV。
- DolphinDB 小数据集导入:3 千万条用时 20 秒,平均 1,500,000 条/秒。
- DolphinDB 大数据集导入:270 GB(6,561,693,704 条,23 个文件)用时 38 分钟。
- TimescaleDB 使用 timescaledb-parallel-copy 进行导入(示例参数含 workers 12、batch-size 200000)。
- TimescaleDB 小数据集导入:3 千万条用时 5 分钟 45 秒,平均 87,000 条/秒。
- TimescaleDB 大数据集仅导入 5 个文件(70 GB,16.7 亿条)用时 24 小时,并估计全量约 92 小时。
- 导入过程观察:TimescaleDB 速率随时间下降,DolphinDB 保持稳定。
- TimescaleDB 小数据集导入后仍需约 2 分钟建立索引。
五、磁盘空间占用对比
本节对比导入后磁盘占用,并解释差异原因(压缩机制、hypertable/hyperchunk 与索引开销、重复字符串存储方式等)。
- 磁盘空间占用结论(小数据集):DolphinDB 仅为 TimescaleDB 的 1/6。
- 磁盘空间占用结论(大数据集):DolphinDB 仅为 TimescaleDB 的 1/17。
- Timescale 仅对较大字段自动压缩(TOAST),对数据表无自动压缩。
- DolphinDB 默认采用 LZ4 压缩。
- TimescaleDB 可用 create_hypertable 将表转为 hypertable,底层使用 hyperchunk 存储。
六、查询测试
本节按多类查询进行性能测试,并讨论抽样、插值、透视(对比)与 asof join 等能力差异与限制,以及测试设置。
- 查询测试分为八类:点、范围、精度、聚合、对比、抽样、关联、经典查询。
- 查询性能结论:多数样例 DolphinDB 更快,仅少数样例低于 TimescaleDB。
- 抽样能力差异导致不进行性能对比(实现方式不同)。
- TimescaleDB(PostgreSQL)无内置插值查询;DolphinDB 支持 ffill、bfill、lfill、nullFill。
- 对比查询差异:TimescaleDB 依赖 crosstab(),DolphinDB 原生支持 pivot by 自动整理。
- asof join:DolphinDB 原生支持;PostgresQL 暂不支持(引用 timescaledb issue 271)。
七、附录
本节提供数据预览链接、脚本与配置文件链接,以及测试结果处理脚本链接。
- 提供 CSV 数据预览链接集合(device_info、readings、TAQ)。
- 提供 DolphinDB 侧脚本与配置链接集合。
- 提供 TimescaleDB/PostgreSQL 侧脚本、配置与辅助文件链接集合。
- 提供测试结果处理脚本 REPL.coffee 的链接。
Facts Index
| Entity | Attribute | Value | Confidence |
|---|---|---|---|
| 时序数据库DolphinDB和TimescaleDB 性能对比测试报告 | 发布日期 | 2021-08-05 | high |
| 时序数据库DolphinDB和TimescaleDB 性能对比测试报告 | 作者署名 | Junxi | high |
| DolphinDB | 实现语言 | 以 C++ 编写 | high |
| DolphinDB | 定位 | 分析型的高性能分布式时序数据库 | high |
| DolphinDB | 存储/引擎特性 | 使用高吞吐低延迟的列式内存引擎 | high |
| DolphinDB | 能力描述 | 集成编程语言与高容量高速度的流数据分析系统,可在数据库中进行复杂编程和运算,减少数据迁移耗时 | medium |
| DolphinDB | 加速机制(列举) | 通过内存引擎、数据本地化、细粒度数据分区和并行计算实现高速分布式计算 | high |
| DolphinDB | 计算框架(列举) | 内置流水线、Map Reduce、迭代计算等多种计算框架 | high |
| DolphinDB | 分布式文件系统 | 使用内嵌的分布式文件系统自动管理分区数据及其副本,为分布式计算提供负载均衡和容错能力 | high |
| DolphinDB | 查询/语言支持 | 支持类标准 SQL 语法;提供类似 Python 的脚本语言操作数据;提供其它常用编程语言的 API | high |
| DolphinDB | 适用场景(列举) | 金融领域历史数据分析建模与实时流数据处理;物联网海量传感器数据处理与实时分析 | high |
| TimescaleDB | 开源与 SQL 支持定位 | “目前市面上唯一的开源且完全支持 SQL 的时序数据库” | low |
| TimescaleDB | 架构形态 | 在 PostgreSQL 基础上开发,本质是 PostgreSQL 的插件 | high |
| TimescaleDB | 生态与优化点(列举) | 完全支持 SQL 且拥有 PostgreSQL 生态;针对时间序列快速插入与复杂查询优化;支持自动分片;支持时间空间维度自动分区;支持多个 SERVER、多个 CHUNK 的并行查询;内部写优化(批量提交、内存索引、事务支持、数据倒灌) | medium |
| TimescaleDB | 水平扩展(写入集群)支持 | 仍不支持水平扩展(集群),不能动态增加新数据结点写入数据;仅支持通过 PostgreSQL streaming replication 的只读集群 | high |
| 本报告测试范围 | 对比内容 | 在时间序列数据集上对比 CSV 导入导出、磁盘空间占用、查询性能三方面 | high |
| 综合结论 | 总体表现 | 在所有测试中 DolphinDB 表现更出色 | medium |
| 导入性能结论(小数据集) | DolphinDB 相对 TimescaleDB | 导入性能为 TimescaleDB 的 10 多倍 | medium |
| 导入性能结论(大数据集) | DolphinDB 相对 TimescaleDB | 导入性能为 TimescaleDB 的 100 多倍;TimescaleDB 导入速率随时间下降而 DolphinDB 保持稳定(观察) | medium |
| 导出性能结论 | DolphinDB 相对 TimescaleDB | 约 3 倍 | medium |
| 磁盘空间占用结论(小数据集) | DolphinDB 相对 TimescaleDB | 仅为 TimescaleDB 的 1/6 | medium |
| 磁盘空间占用结论(大数据集) | DolphinDB 相对 TimescaleDB | 仅为 TimescaleDB 的 1/17 | medium |
| 查询性能结论(样例计数) | DolphinDB 相对 TimescaleDB | 4 个测试样例超过 50 多倍;15 个测试样例为 10~50 倍;10 个测试样例为数倍;仅 2 个测试样例低于 TimescaleDB | medium |
| 测试方式 | TimescaleDB 集群能力对测试环境的影响 | 因 TimescaleDB 不支持可写入集群,使用单机进行测试 | high |
| 测试主机 | 主机型号 | DELL OptiPlex 7060 | high |
| 测试主机 | CPU | Intel Core i7-8700(6 核 12 线程 3.20 GHz) | high |
| 测试主机 | 内存 | 32 GB(8GB × 4, 2666 MHz) | high |
| 测试主机 | 硬盘 | 2T HDD(222 MB/s 读取;210 MB/s 写入) | high |
| 测试主机 | 操作系统 | Ubuntu 16.04 LTS | high |
| DolphinDB 测试版本 | 版本号与日期 | Linux v0.89 (2019.01.31) | high |
| DolphinDB 测试设置 | 最大内存设置 | 28GB | high |
| PostgreSQL(测试使用) | 版本 | Ubuntu 10.6-1 on x86_64 | high |
| TimescaleDB 插件(测试使用) | 版本 | v1.1.1 | high |
| PostgreSQL 调优 | shared_buffers 与 effective_cache_size | 均设置为 16GB | high |
| PostgreSQL 调优 | 并行 workers | 根据 12 线程 CPU 设置 parallel workers(未给出具体数值) | medium |
| PostgreSQL 调优 | effective_io_concurrency | 设置为 1(因仅使用机械硬盘) | high |
| 测试数据规模分组 | 小/大数据量级 | 小数据量级 4.2 GB;大数据量级 270 GB | high |
| 小数据量级测试 | 预加载策略 | 预先将硬盘分区数据表全部加载到内存:DolphinDB 使用 loadTable(memoryMode=true);PostgreSQL 使用 pg_prewarm 加载至 shared_buffers | high |
| 大数据量级测试 | 预加载与计时范围 | 不预先加载硬盘分区表;查询测试时间包含磁盘 I/O 时间 | high |
| 大数据量级测试 | 清缓存方法 | 每次启动程序测试前执行 sync; echo 1,2,3 | tee /proc/sys/vm/drop_caches 清除页面缓存、目录项缓存和硬盘缓存 | high |
| 小数据集(devices_big) | 数据格式与规模 | 4.2 GB CSV;3 千万条 | high |
| 小数据集(devices_big) | 来源 | TimescaleDB 官方样例数据集;链接 https://docs.timescale.com/v1.1/tutorials/other-sample-datasets | high |
| 小数据集(devices_big) | 下载地址 | https://timescaledata.blob.core.windows.net/datasets/devices_big.tar.gz | high |
| 小数据集(devices_big) | 数据内容概述 | 包含 3000 个设备在 10000 个时间间隔(2016.11.15 - 2016.11.19)上的传感器时间、设备ID、电池、内存、CPU 等统计信息 | high |
| device_id 字段存储类型选择 | TimescaleDB 与 DolphinDB 的类型对比影响 | device_id 有 3000 个不同值且在 readings 记录中反复出现;text 类型占用空间大且查询效率较低;TimescaleDB 难以对该字段使用 enum;DolphinDB 的 Symbol 类型用于解决空间与效率问题 | medium |
| bssid/ssid 字段类型选择 | enum 适用性 | bssid 和 ssid 字段重复值多但因数据不确定性不适合使用 enum 类型 | medium |
| DolphinDB(小数据集分区) | 分区维度与边界 | time 为第一维度按天分 4 个区,边界为 [2016.11.15 00:00:00, 2016.11.16 00:00:00, 2016.11.17 00:00:00, 2016.11.18 00:00:00, 2016.11.19 00:00:00];device_id 为第二维度每天分 10 个区;每分区原始数据约 100 MB | high |
| TimescaleDB(小数据集分区尝试) | device_id 作为第二维度的影响 | 尝试将 device_id 作为第二维度分区,但测试中 90% 查询样例性能不如仅按时间分区;因此选择仅按时间维度按天分为 4 个区 | medium |
| TimescaleDB(小数据集索引) | 索引语句 | create index on readings (device_id, time desc); create index on readings (ssid, time desc); | high |
| 大数据集(NYSE Level 1 报价) | 时间范围 | 2007.08.01 - 2007.08.31 | high |
| 大数据集(NYSE Level 1 报价) | 股票数量 | 8000 多支股票 | medium |
| 大数据集(NYSE Level 1 报价) | 记录数 | 65 亿(6,561,693,704)条报价记录 | high |
| 大数据集(NYSE Level 1 报价) | 文件数量与体积 | 23 个 CSV(一个交易日一个 CSV);未压缩 CSV 共计 270 GB | high |
| 大数据集(NYSE Level 1 报价) | 来源 | NYSE historical market data;链接 https://www.nyse.com/market-data/historical | high |
| 分区方案(taq 表) | 分区维度与粒度 | 按 date(日期)与 symbol(股票代码)分区;每天再按 symbol 分 100 个分区;每分区约 120 MB | high |
| DolphinDB 导入 | 导入方式 | 使用 loadTextEx(db, `taq, `date`symbol, fp, ,schema) 的循环脚本导入 CSV | high |
| DolphinDB 导入(小数据集) | 导入用时与速率 | 3 千万条导入用时 20 秒;平均速率 1,500,000 条/秒 | high |
| DolphinDB 导入(大数据集) | 导入用时 | 270 GB(6,561,693,704 条,23 个文件)导入用时 38 分钟 | high |
| timescaledb-parallel-copy | CSV 首行列名支持 | 不支持 CSV 首行为列名称;导入时先用 tail -n +2 跳过首行再写入标准输入 | high |
| TimescaleDB 导入 | 导入脚本参数(摘要) | 使用 timescaledb-parallel-copy,workers 12,reporting-period 1s,copy-options CSV,batch-size 200000,连接 host=localhost user=postgres password=postgres dbname=test sslmode=disable,表 taq | high |
| TimescaleDB 导入(小数据集) | 导入用时与速率 | 3 千万条导入用时 5 分钟 45 秒;平均速率 87,000 条/秒 | high |
| TimescaleDB 导入(大数据集部分) | 导入范围与用时/速率 | 仅导入 5 个文件(总 70 GB,16.7 亿条)用时 24 小时;导入速率 19,400 条/秒;预计全部 270 GB 需 92 小时 | high |
| 导入过程现象 | 速率变化 | TimescaleDB 导入速率随导入时间增加不断下降,而 DolphinDB 保持稳定 | medium |
| TimescaleDB(小数据集导入后) | 索引构建额外耗时 | 仍需约 2 分钟建立索引 | medium |
| DolphinDB 导出 | 导出方式 | saveText((select * from readings), '/data/devices/readings_dump.csv') | high |
| TimescaleDB 导出 | 导出方式 | psql \COPY (SELECT * FROM readings) TO /data/devices/devices_dump.csv DELIMITER ',' CSV | high |
| 磁盘空间占用对比(原因 1) | TimescaleDB 压缩机制 vs DolphinDB | Timescale 仅对较大字段自动压缩(TOAST),对数据表无自动压缩;DolphinDB 默认采用 LZ4 压缩 | medium |
| TimescaleDB hypertable | 创建 hypertable 的示例语句与概念 | 使用 SELECT create_hypertable('readings', 'time', chunk_time_interval => interval '1 day') 将原始表转为 hypertable;底层使用 hyperchunk 存储 | high |
| TimescaleDB(hyperchunk 索引开销分析) | 索引空间 | 时序字段索引共计 0.8 GB;device_id 与 ssid 两字段索引共计 2.3 GB | medium |
| 重复字符串存储影响 | bssid/ssid 与 Symbol 类型对比 | TimescaleDB 中 bssid、ssid 由于不适合 enum 只能以重复字符串存储;DolphinDB 的 Symbol 类型可动态适配以解决存储空间问题 | medium |
| 查询测试 | 查询类别(8 类) | 点查询、范围查询、精度查询、聚合查询、对比查询、抽样查询、关联查询、经典查询 | high |
| 小数据集查询测试 | 预加载方法 | DolphinDB 用 loadTable(memoryMode=true);TimescaleDB 用 select pg_prewarm('_hyper_2_41_chunk') 加载至 shared_buffers | high |
| 抽样查询能力差异 | TimescaleDB 与 DolphinDB 支持情况与对比策略 | TimescaleDB 有 tablesample(system/bernoulli)且不支持按字段取样;DolphinDB 不支持全表取样仅支持按分区取样;实现方式不同因此不进行性能对比 | high |
| 插值查询能力差异 | TimescaleDB/PostgreSQL 与 DolphinDB | TimescaleDB(PostgreSQL)无内置插值查询需上百行代码实现;DolphinDB 支持 4 种插值方式:ffill、bfill、lfill、nullFill | high |
| 对比查询(pivot/crosstab)能力差异 | TimescaleDB(PostgreSQL tablefunc)限制与 DolphinDB 支持 | TimescaleDB 通过 tablefunc 的 crosstab():需硬编码第二维度所有取值与类型且只能基于 text 维度/需转换;DolphinDB 原生支持 pivot by 自动整理 | high |
| asof join 支持 | DolphinDB vs PostgresQL | DolphinDB 原生支持 asof join;PostgresQL 暂不支持(引用 timescaledb issue 271) | high |
| TimescaleDB count(*) 查询 | 性能特性 | 使用 count(*) 查询总记录数时 TimescaleDB 会全表扫描,效率极低 | medium |
| 大数据集查询测试 | 测试流程 | 不预加载入内存;每次启动程序前清缓存;启动后依次执行所有测试样例一遍 | high |
| TimescaleDB 小数据集分区表预热 | 使用的 chunk 名称 | _hyper_2_41_chunk | high |
| 附录数据预览链接(CSV) | 链接集合 | device_info: https://github.com/dolphindb/Tutorials_CN/blob/master/benchmark/DolphinDB%20vs%20TimescaleDB/devices.csv ; readings: https://github.com/dolphindb/Tutorials_CN/blob/master/benchmark/DolphinDB%20vs%20TimescaleDB/readings.csv ; TAQ: https://github.com/dolphindb/Tutorials_CN/blob/master/benchmark/DolphinDB%20vs%20TimescaleDB/TAQ.csv | high |
| 附录(DolphinDB)脚本与配置链接 | 链接集合 | test_dolphindb.sh, dolphindb.cfg, test_dolphindb_small.txt, test_dolphindb_big.txt(均位于 github.com/dolphindb/Tutorials_CN/.../benchmark/DolphinDB%20vs%20TimescaleDB/) | high |
| 附录(TimescaleDB / PostgreSQL)脚本与配置链接 | 链接集合 | test_timescaledb.sh, test_timescaledb_small.sql, test_timescaledb_big.sql, postgresql_test.conf, postgresql.conf, pg_hba.conf, symbols.txt, make_symbol_enum.sql, make_symbol_enum.coffee, make_symbol_enum.coffee(均位于 github.com/dolphindb/Tutorials_CN/.../benchmark/DolphinDB%20vs%20TimescaleDB/) | high |
| 附录(测试结果处理脚本) | 链接 | REPL.coffee(github.com/dolphindb/Tutorials_CN/.../benchmark/DolphinDB%20vs%20TimescaleDB/REPL.coffee) | high |
| 技能认证特训营第二期 | 报名链接 | https://www.qingsuyun.com/h5/e/217471/5/ | high |