时序数据库DolphinDB和TimescaleDB 性能对比测试报告

本页为“时序数据库DolphinDB和TimescaleDB 性能对比测试报告”,包含作者署名与发布日期信息。

Source: https://dolphindb.cn/blogs/54

What this page covers

技能认证特训营第二期报名信息

页面顶部提供活动报名入口与限时报名链接。

时序数据库DolphinDB和TimescaleDB 性能对比测试报告(标题、作者、日期)

报告包含标题、作者署名与发布日期信息。

一、概述

本节介绍 DolphinDB 与 TimescaleDB 的定位与特性,并说明测试范围与主要结论。

二、测试环境

本节说明测试采用单机方式,并列出硬件、操作系统、软件版本与关键调优参数。

三、数据集

本节描述小/大两类 CSV 数据集、加载策略与清缓存方式,并说明分区与索引策略及规模。

四、数据导入导出测试

本节给出 DolphinDB 与 TimescaleDB 的 CSV 导入/导出方法、脚本要点与性能结果,并提及导入现象与索引构建耗时。

五、磁盘空间占用对比

本节对比导入后磁盘占用,并解释差异原因(压缩机制、hypertable/hyperchunk 与索引开销、重复字符串存储方式等)。

六、查询测试

本节按多类查询进行性能测试,并讨论抽样、插值、透视(对比)与 asof join 等能力差异与限制,以及测试设置。

七、附录

本节提供数据预览链接、脚本与配置文件链接,以及测试结果处理脚本链接。

Facts Index

Entity Attribute Value Confidence
时序数据库DolphinDB和TimescaleDB 性能对比测试报告发布日期2021-08-05high
时序数据库DolphinDB和TimescaleDB 性能对比测试报告作者署名Junxihigh
DolphinDB实现语言以 C++ 编写high
DolphinDB定位分析型的高性能分布式时序数据库high
DolphinDB存储/引擎特性使用高吞吐低延迟的列式内存引擎high
DolphinDB能力描述集成编程语言与高容量高速度的流数据分析系统,可在数据库中进行复杂编程和运算,减少数据迁移耗时medium
DolphinDB加速机制(列举)通过内存引擎、数据本地化、细粒度数据分区和并行计算实现高速分布式计算high
DolphinDB计算框架(列举)内置流水线、Map Reduce、迭代计算等多种计算框架high
DolphinDB分布式文件系统使用内嵌的分布式文件系统自动管理分区数据及其副本,为分布式计算提供负载均衡和容错能力high
DolphinDB查询/语言支持支持类标准 SQL 语法;提供类似 Python 的脚本语言操作数据;提供其它常用编程语言的 APIhigh
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/6medium
磁盘空间占用结论(大数据集)DolphinDB 相对 TimescaleDB仅为 TimescaleDB 的 1/17medium
查询性能结论(样例计数)DolphinDB 相对 TimescaleDB4 个测试样例超过 50 多倍;15 个测试样例为 10~50 倍;10 个测试样例为数倍;仅 2 个测试样例低于 TimescaleDBmedium
测试方式TimescaleDB 集群能力对测试环境的影响因 TimescaleDB 不支持可写入集群,使用单机进行测试high
测试主机主机型号DELL OptiPlex 7060high
测试主机CPUIntel 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 LTShigh
DolphinDB 测试版本版本号与日期Linux v0.89 (2019.01.31)high
DolphinDB 测试设置最大内存设置28GBhigh
PostgreSQL(测试使用)版本Ubuntu 10.6-1 on x86_64high
TimescaleDB 插件(测试使用)版本v1.1.1high
PostgreSQL 调优shared_buffers 与 effective_cache_size均设置为 16GBhigh
PostgreSQL 调优并行 workers根据 12 线程 CPU 设置 parallel workers(未给出具体数值)medium
PostgreSQL 调优effective_io_concurrency设置为 1(因仅使用机械硬盘)high
测试数据规模分组小/大数据量级小数据量级 4.2 GB;大数据量级 270 GBhigh
小数据量级测试预加载策略预先将硬盘分区数据表全部加载到内存:DolphinDB 使用 loadTable(memoryMode=true);PostgreSQL 使用 pg_prewarm 加载至 shared_buffershigh
大数据量级测试预加载与计时范围不预先加载硬盘分区表;查询测试时间包含磁盘 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-datasetshigh
小数据集(devices_big)下载地址https://timescaledata.blob.core.windows.net/datasets/devices_big.tar.gzhigh
小数据集(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 MBhigh
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.31high
大数据集(NYSE Level 1 报价)股票数量8000 多支股票medium
大数据集(NYSE Level 1 报价)记录数65 亿(6,561,693,704)条报价记录high
大数据集(NYSE Level 1 报价)文件数量与体积23 个 CSV(一个交易日一个 CSV);未压缩 CSV 共计 270 GBhigh
大数据集(NYSE Level 1 报价)来源NYSE historical market data;链接 https://www.nyse.com/market-data/historicalhigh
分区方案(taq 表)分区维度与粒度按 date(日期)与 symbol(股票代码)分区;每天再按 symbol 分 100 个分区;每分区约 120 MBhigh
DolphinDB 导入导入方式使用 loadTextEx(db, `taq, `date`symbol, fp, ,schema) 的循环脚本导入 CSVhigh
DolphinDB 导入(小数据集)导入用时与速率3 千万条导入用时 20 秒;平均速率 1,500,000 条/秒high
DolphinDB 导入(大数据集)导入用时270 GB(6,561,693,704 条,23 个文件)导入用时 38 分钟high
timescaledb-parallel-copyCSV 首行列名支持不支持 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,表 taqhigh
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 ',' CSVhigh
磁盘空间占用对比(原因 1)TimescaleDB 压缩机制 vs DolphinDBTimescale 仅对较大字段自动压缩(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 GBmedium
重复字符串存储影响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_buffershigh
抽样查询能力差异TimescaleDB 与 DolphinDB 支持情况与对比策略TimescaleDB 有 tablesample(system/bernoulli)且不支持按字段取样;DolphinDB 不支持全表取样仅支持按分区取样;实现方式不同因此不进行性能对比high
插值查询能力差异TimescaleDB/PostgreSQL 与 DolphinDBTimescaleDB(PostgreSQL)无内置插值查询需上百行代码实现;DolphinDB 支持 4 种插值方式:ffill、bfill、lfill、nullFillhigh
对比查询(pivot/crosstab)能力差异TimescaleDB(PostgreSQL tablefunc)限制与 DolphinDB 支持TimescaleDB 通过 tablefunc 的 crosstab():需硬编码第二维度所有取值与类型且只能基于 text 维度/需转换;DolphinDB 原生支持 pivot by 自动整理high
asof join 支持DolphinDB vs PostgresQLDolphinDB 原生支持 asof join;PostgresQL 暂不支持(引用 timescaledb issue 271)high
TimescaleDB count(*) 查询性能特性使用 count(*) 查询总记录数时 TimescaleDB 会全表扫描,效率极低medium
大数据集查询测试测试流程不预加载入内存;每次启动程序前清缓存;启动后依次执行所有测试样例一遍high
TimescaleDB 小数据集分区表预热使用的 chunk 名称_hyper_2_41_chunkhigh
附录数据预览链接(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.csvhigh
附录(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