时序数据库DolphinDB与InfluxDB对比测试报告2

本页是一份对 DolphinDB 与 InfluxDB 的复测对比报告,覆盖导入/导出、磁盘占用、查询性能与功能差异,并给出总体结论与要点概览。

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

What this page covers

技能认证特训营第二期报名提示

页面顶部包含活动报名提示与限时报名链接。

时序数据库DolphinDB与InfluxDB对比测试报告2(作者与日期)

该部分给出文章标题、作者署名与发布日期信息。

测试背景与主要结论概览

该部分说明复测动机、测试覆盖范围与总体结论,并列出导入/导出/磁盘/功能/查询性能要点。

系统概述:DolphinDB 与 InfluxDB

该部分分别介绍 DolphinDB 与 InfluxDB 的实现语言、引擎/查询语言、特性与典型应用场景。

测试环境(单机模式与软硬件配置)

该部分说明因 InfluxDB 集群版本闭源而采用单机模式,并给出硬件、操作系统、两款软件版本与关键配置。

数据集:4.2GB 物联网设备传感器与 270GB NYSE 股票报价

该部分描述两类数据集的规模、来源、表结构展示、以及在 DolphinDB 与 InfluxDB 中的分区/保留策略。

数据导入导出测试:导入方法与结果

该部分给出 DolphinDB 导入脚本与导入耗时/速率,并说明 InfluxDB CSV 导入需转换为 Line Protocol、导入命令、重复点覆盖问题及解决方式与导入耗时/速率。

数据导入导出测试:导出方法与结果

该部分描述 DolphinDB 导出方式与耗时,以及 InfluxDB 导出时内存溢出与按时间分段导出的替代方案与总耗时。

磁盘空间占用对比(压缩后)

该部分展示导入后两款数据库的磁盘占用对比,并给出小/大数据集压缩率与占用差异的文字结论。

数据库查询性能测试:方法、类别与结果讨论

该部分说明查询类别、测试方法(包含清缓存与 I/O)、展示小数据集与大数据集查询结果图,并列出 InfluxDB 的功能/正确性限制与示例代码。

其他方面的比较(语言、导入、连接、分组、函数、事务一致性)

该部分归纳除基准性能外的差异点,集中在语言范式、导入、连接、分组、函数与事务一致性等方面的主张。

附录(数据预览与脚本/配置链接)

该部分提供数据预览、Line Protocol 文件、转换脚本,以及安装配置与测试脚本链接清单。

Facts index

Entity Attribute Value Confidence
文章发布日期date2021-05-20high
作者署名nameJunxihigh
本次对比测试总体结论overall_result在本次所有测试项目中,DolphinDB 表现更出色medium
导入性能对比(小数据集)DolphinDB_vs_InfluxDB_speedup小数据集情况下 DolphinDB 导入性能是 InfluxDB 的 75 倍medium
导入性能对比(大数据集)DolphinDB_vs_InfluxDB_speedup大数据集情况下 DolphinDB 导入性能大约是 InfluxDB 的 100 倍medium
InfluxDB CSV 导入支持native_csv_import_supportInfluxDB 原生不支持 CSV 导入,需要手动转换为 Line Protocol 格式high
导出性能对比DolphinDB_vs_InfluxDB_speedupDolphinDB 导出性能约为 InfluxDB 的 11 倍medium
InfluxDB 大批量导出 CSVstability_issueInfluxDB 在导出大批量数据为 CSV 格式时容易产生内存溢出问题high
磁盘空间占用对比relative_disk_usageDolphinDB 占用的空间总是小于等于 InfluxDB 占用的空间medium
InfluxDB 查询功能限制missing_features不支持对比查询、不支持表连接、不支持对除 time 以外的 tag/field 排序;函数参数只能是某一个 field 而不能是 field 表达式high
查询性能对比(样例数量分布)speedup_distribution2 个测试样例超过 InfluxDB 1000 多倍;6 个样例超过 50 多倍;2 个样例为 10 多倍;其余样例也全部优于 InfluxDBmedium
DolphinDBimplementation_languageC++high
DolphinDBtype分析型的高性能分布式时序数据库high
DolphinDBengine高吞吐低延迟的列式内存引擎medium
DolphinDBsupports集成编程语言与高容量高速度的流数据分析系统,可在数据库中进行复杂编程和运算以减少数据迁移时间medium
DolphinDBdistributed_compute_methods通过内存引擎、数据本地化、细粒度数据分区和并行计算实现高速分布式计算medium
DolphinDBcompute_frameworks内置流水线、Map Reduce 和迭代计算等多种计算框架medium
DolphinDBstorage_management使用内嵌的分布式文件系统自动管理分区数据及其副本,提供负载均衡和容错能力medium
DolphinDBquery_and_language支持类标准 SQL 语法;提供类似 Python 的脚本语言;提供其它常用编程语言的 APIhigh
DolphinDBperforms_well_in金融领域历史数据分析建模与实时流数据处理;物联网海量传感器数据处理与实时分析medium
InfluxDBpositioning最为流行的高性能开源时间序列数据库low
InfluxDBimplementation_languageGohigh
InfluxDBstorage_engine定制的存储引擎 TSM Tree,针对时间序列数据优化,优先考虑插入和查询性能high
InfluxDBquery_languageInfluxQL(类 SQL)high
InfluxDBinterfaces_and_functions提供开箱即用的时间序列数学与统计函数;对外提供基于 HTTP 的接口支持插入与查询high
InfluxDBdata_retention允许定义数据保存策略(Retention Policies)以删除或降采样超过指定时间的数据high
InfluxDBused_in存储系统监控数据、IoT 行业实时数据等场景medium
测试模式选择deployment_mode由于 InfluxDB 集群版本闭源,测试中 DolphinDB 与 InfluxDB 均使用单机模式high
测试主机modelDELL OptiPlex 7060high
测试主机 CPUcpuIntel Core i7-8700(6 核 12 线程 3.20 GHz)high
测试主机 内存memory32 GB(8GB × 4, 2666 MHz)high
测试主机 硬盘disk2T HDD(222 MB/s 读取;210 MB/s 写入)high
测试主机 操作系统osUbuntu 16.04 LTShigh
测试使用的 DolphinDB 版本versionLinux v0.89 (2019.01.31)high
DolphinDB 测试配置max_memory最大内存设置为 28GBhigh
测试使用的 InfluxDB 版本version1.7.5high
InfluxDB 测试配置优化wal_fsync_delaywal-fsync-delay 调节为 100ms(适合机械硬盘)high
InfluxDB 测试配置优化cache_max_memory_sizecache-max-memory-size 设置为 28GBhigh
InfluxDB 测试配置优化series_id_set_cache_sizeseries-id-set-cache-size 设置为 400high
测试数据集规模sizes小数据量级 4.2GB;大数据量级 270GBhigh
小数据集(设备传感器记录)format_and_rowsCSV 格式,3 千万条(30,000,000)high
小数据集(设备传感器记录)devices_and_time_range3000 个设备;时间范围 2016-11-15 到 2016-11-19;10000 个时间间隔上的传感器信息high
小数据集表组成tablesdevice_info 表与 readings 表high
小数据集 DolphinDB 分区方案partitioningtime 作为第一维度按天分为 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 个区;每分区原始数据约 100MBhigh
InfluxDB 存储结构(描述)shard_group_and_shard使用 Shard Group 存储不同时间段(不重合);一个 Shard Group 包含大量 Shard,Shard 才是真正存储数据和提供读写服务的结构high
InfluxDB 分区方式(描述)hash_partitioning采用 Hash 分区:根据 hash(Series) 将同一 Shard Group 的数据映射到不同 Shardhigh
InfluxDB 小数据集保留策略设置retention_policy_sqlcreate retention policy one_day on test duration inf replication 1 shard duration 1d defaulthigh
大数据集(NYSE Level 1 报价)time_range_and_scopeNYSE 2007.08.01 - 2007.08.31 一个月的 Level 1 报价数据;包含 8000 多支股票high
大数据集规模(行数)rows65 亿(65,6169,3704)条报价记录medium
大数据集规模(文件与体积)files_and_size23 个 CSV(每个交易日一个文件);该月 23 个交易日;未压缩 CSV 共计 270GBhigh
大数据集 DolphinDB 分区方案partitioning按 date(日期)、symbol(股票代码)分区;每天再按 symbol 分为 100 个分区;每分区约 120MBhigh
大数据集 InfluxDB 分区/策略strategy使用与小数据集相同的策略high
DolphinDB 导入方式(示例脚本)import_scripttimer { for (fp in fps) { loadTextEx(db, `taq, `date`symbol, fp, ,schema) print now() + ": 已导入 " + fp } }high
DolphinDB 导入小数据集耗时与速率import_time_and_rate4.2GB 设备传感器数据(3 千万条)导入用时 20 秒;平均速率 150 万条/秒high
DolphinDB 导入大数据集耗时import_time270GB 股票交易数据(65 亿条;TAQ20070801-TAQ20070831 共 23 个文件)导入用时 38 分钟high
InfluxDB CSV 导入能力(再次说明)csv_import_limitationInfluxDB 本身不支持直接导入 CSV,只能通过 HTTP API 或 influx -import 导入high
InfluxDB 导入前数据转换line_protocol_example示例 Line Protocol:readings,device_id=...,battery_status=... ... rssi=-42 1479211200high
InfluxDB -import 文件头(示例)import_file_header包含 DDL/DML/CONTEXT-DATABASE/CONTEXT-RETENTION-POLICY 等头部声明(示例给出)high
InfluxDB 导入命令import_commandinflux -import -path=/data/devices/readings.txt -precision=s -database=testhigh
InfluxDB 导入小数据集耗时与速率(转换后)import_time_and_rate4.2GB(3 千万条)导入用时 25 分钟 10 秒;平均速率 2 万条/秒high
InfluxDB 重复点处理行为duplicate_point_overwrite多次插入时间相同且 tag 相同的记录时,即使 value 不同,后插入记录会覆盖先前记录,最终只保留最后一条high
InfluxDB duplicate points 官方 FAQ 的解决思路workarounds两种方法:新增一个 tag 区分相同时间的数据;或强行微调时间戳使其不同high
新增 tag 区分重复点的适用性constraint只适用于数据完全按时间顺序插入;否则难以判断是否已存在记录,会覆盖先前数据;效率低且操作繁琐high
本次测试对 InfluxDB 重复点的处理方式chosen_workaround转换为 Line Protocol 时在秒级时间戳基础上随机加毫秒值,生成毫秒精度伪时间戳以防冲突high
InfluxDB 导入大数据集耗时与速率(转换后)import_time_and_rate270GB(65 亿条)导入用时 65 小时;平均速率 2.7 万条/秒high
导入速率随时间变化观察rate_stabilityInfluxDB 导入速率随时间推移不断下降;DolphinDB 保持稳定low
InfluxDB 导入流程复杂性process_complexity需要编写代码将 CSV 转换为 Line Protocol,复杂繁琐,会产生中间文件占用大量空间medium
DolphinDB 导出方式与耗时export_command_and_timesaveText((select * from readings), '/data/devices/readings_dump.csv');用时 28 秒high
InfluxDB 一次性导出 CSV 的内存问题out_of_memory导出内存占用会超过 30GB,触发 fatal error: runtime: out of memoryhigh
InfluxDB 分时间段导出 CSV 的方法(示例)workaround_script使用 for 循环按天分段执行 influx -database 'test' -format csv -execute ... 导出到 export_i.csvhigh
InfluxDB 分段导出总耗时export_time总耗时 5 min 31 shigh
InfluxDB CSV 导出体验usability_issuesCSV 导出操作复杂、易内存溢出;导出 CSV 首行无字段名称medium
小数据集压缩存储占用(文字结论)compression_ratio_range两者均压缩存储,压缩率大致同一数量级,约 20% - 30%medium
大数据集磁盘占用对比(文字结论)relative_disk_usage大数据集中 InfluxDB 压缩效果不好,占用空间为 DolphinDB 的两倍medium
查询测试类别query_categories点查询、范围查询、精度查询、聚合查询、对比查询、抽样查询、关联查询、经典查询(共八类)high
查询测试方法(公平性处理)cache_clearing每次启动程序测试前执行 sync; echo 1,2,3 | tee /proc/sys/vm/drop_caches 清除页面缓存、目录项缓存和硬盘缓存;时间包含磁盘 I/Ohigh
查询性能总体结论(小数据集)performance_comparisonDolphinDB 查询性能远超 InfluxDBlow
InfluxDB 查询能力no_pivot_and_join不支持对比查询和表连接,无法完成许多常规 SQL 数据库支持的查询high
InfluxDB ORDER BY 限制order_by_fields不支持对除 time 以外的 tag/field 进行排序(不能 select * from taq order by <some-field>)high
InfluxDB 函数参数限制function_argument_expression函数参数只能是某一个 field,不能是 field 表达式(如 field1 + field2);需用子查询先计算表达式并在子/父查询重复指定时间范围high
大数据集查询性能结论speedup_range某些查询性能差别不大,但某些查询 DolphinDB 比 InfluxDB 快将近 100 到 200 倍low
InfluxDB 查询结果异常(第2个查询)incorrect_empty_resultwhere 条件选择多个非连续时间分区时返回结果为空,而不是各时间分区结果总和(示例代码给出)high
InfluxDB 不支持第8个查询(大数据集)unsupported_queryInfluxDB 抛出异常:mixing multiple selector functions with tags or fields is not supported(不能在 select 中同时使用 max 和 min),而 DolphinDB 可执行high
InfluxDB group by time 的返回行为returns_all_time_buckets对时间 group by 后返回包含所有时间段,即使无有效数据也返回;DolphinDB 只返回包含有效数据的时间段medium
DolphinDB 语言与范式优势(对比描述)language_capabilitiesDolphinDB 内置完整脚本语言,支持 SQL 且支持命令式、向量化、函数化、元编程、RPC 等多种范式;InfluxDB 通过 InfluxQL 操作数据库medium
InfluxDB 批量导入支持(CSV)official_support对 CSV 等批量导入无很好官方支持;需第三方工具或自实现读取并规整为指定输入格式,再通过 API 批量导入;单次只能导入 5000 行medium
DolphinDB CSV 导入函数functions提供 ploadText、loadText、loadTextEx,可在脚本中直接导入 CSV 文件high
InfluxDB 表连接join_supportInfluxDB 不支持表连接,部分常规查询无法完成high
DolphinDB 表连接与优化join_features支持常用表连接,并对 asof join 和 window join 等非同时连接做了性能优化medium
InfluxDB 时间分组粒度上限max_group_by_time_unit对时间序列分组(group by)的最大分组是 week(星期)medium
DolphinDB 时间分组能力max_group_by_time_unit支持对所有内置时间类型进行分组,最大单位为 month(月)medium
DolphinDB 内置函数数量built_in_functions_count600 多个内置函数medium
DolphinDB 函数性能优化范围(描述)optimization_scope大部分聚合函数以及领先/滞后/累计窗口/滑动窗口等时序函数做了性能优化low
DolphinDB 集群版本事务与一致性(主张)transactions_and_consistency集群版本支持事务;在一个分区的多个副本写入时保证强一致性medium
技能认证特训营第二期限时报名registration_linkhttps://www.qingsuyun.com/h5/e/217471/5/high
小数据集数据来源(Timescale 示例数据集文档)source_urlhttps://docs.timescale.com/v1.1/tutorials/other-sample-datasetshigh
小数据集下载地址download_urlhttps://timescaledata.blob.core.windows.net/datasets/devices_big.tar.gzhigh
大数据集数据来源(NYSE 历史数据页面)source_urlhttps://www.nyse.com/market-data/historicalhigh
InfluxDB duplicate points FAQreference_urlhttps://docs.influxdata.com/influxdb/v1.7/troubleshooting/frequently-asked-questions/#how-does-influxdb-handle-duplicate-pointshigh
InfluxDB ORDER BY tag values issuereference_urlhttps://github.com/influxdata/influxdb/issues/3954high
附录链接:readings(前20行预览)github_urlhttps://github.com/dolphindb/Tutorials_CN/blob/master/benchmark/DolphinDB%20vs%20InfluxDB/readings.csvhigh
附录链接:readings(Line Protocol)github_urlhttps://github.com/dolphindb/Tutorials_CN/blob/master/benchmark/DolphinDB%20vs%20InfluxDB/readings.lineprotocol.txthigh
附录链接:readings 转 Line Protocol 脚本github_urlhttps://github.com/dolphindb/Tutorials_CN/blob/master/benchmark/DolphinDB%20vs%20InfluxDB/convert_small.coffeehigh
附录链接:TAQ(预览/样例)github_urlhttps://github.com/dolphindb/Tutorials_CN/blob/master/benchmark/DolphinDB%20vs%20InfluxDB/TAQ.csvhigh
附录链接:TAQ(Line Protocol)github_urlhttps://github.com/dolphindb/Tutorials_CN/blob/master/benchmark/DolphinDB%20vs%20InfluxDB/TAQ.lineprotocol.txthigh
附录链接:TAQ 转 Line Protocol 脚本github_urlhttps://github.com/dolphindb/Tutorials_CN/blob/master/benchmark/DolphinDB%20vs%20InfluxDB/convert_big.coffeehigh
附录链接:DolphinDB 安装/配置/启动脚本github_urlhttps://github.com/dolphindb/Tutorials_CN/blob/master/benchmark/DolphinDB%20vs%20InfluxDB/test_dolphindb.shhigh
附录链接:DolphinDB 配置文件github_urlhttps://github.com/dolphindb/Tutorials_CN/blob/master/benchmark/DolphinDB%20vs%20InfluxDB/dolphindb.cfghigh
附录链接:DolphinDB 小数据集测试脚本github_urlhttps://github.com/dolphindb/Tutorials_CN/blob/master/benchmark/DolphinDB%20vs%20InfluxDB/test_dolphindb_small.txthigh
附录链接:DolphinDB 大数据集测试脚本github_urlhttps://github.com/dolphindb/Tutorials_CN/blob/master/benchmark/DolphinDB%20vs%20InfluxDB/test_dolphindb_big.txthigh
附录链接:InfluxDB 安装/配置脚本github_urlhttps://github.com/dolphindb/Tutorials_CN/blob/master/benchmark/DolphinDB%20vs%20InfluxDB/test_influxdb.shhigh
附录链接:InfluxDB 修改配置文件github_urlhttps://github.com/dolphindb/Tutorials_CN/blob/master/benchmark/DolphinDB%20vs%20InfluxDB/influxdb.confhigh
附录链接:InfluxDB 小数据集测试脚本github_urlhttps://github.com/dolphindb/Tutorials_CN/blob/master/benchmark/DolphinDB%20vs%20InfluxDB/test_influxdb_small.sqlhigh
附录链接:InfluxDB 大数据集测试脚本github_urlhttps://github.com/dolphindb/Tutorials_CN/blob/master/benchmark/DolphinDB%20vs%20InfluxDB/test_influxdb_big.sqlhigh