在上一篇文章《写入性能:TDengine 最高达到 InfluxDB 的 10.3 倍,TimeScaleDB 的 6.74 倍》中,我们基于 TSBS 时序数据库(Time Series Database)性能基准测试报告对三大数据库写入性能进行了相关解读,较为直观地展现出了 TDengine 的众多写入优势。本篇文章将以查询性能作为主题,给正在为数据分析痛点而头疼的朋友们带来一些帮助。
在查询性能评估部分,我们使用场景一(只包含 4 天数据)和场景二作为基准数据集,关于基础数据集的具体特点,请点击进入《TSBS 是什么?为什么 TDengine 会选择它作为性能对比测试平台?》一文中查看。在查询性能评估之前,为确保两大数据库充分发挥查询性能,对于 TimescaleDB,我们采用了《TimescaleDB vs. InfluxDB》(见下方链接)中的推荐配置,设置为 8 个 Chunk;对于 InfluxDB,我们开启 InfluxDB 的 TSI (time series index)。在整个查询对比中,TDengine 数据库的虚拟节点数量(vnodes)保持为默认的 6 个,其他的数据库参数配置为默认值。
TimescaleDB vs. InfluxDB: Purpose Built Differently for Time-Series Data:
4,000 devices × 10 metrics 查询性能对比:最高达到 InfluxDB 的 34.2 倍
由于部分类型(分类标准参见上方《TimescaleDB vs. InfluxDB》 一文)单次查询响应时间非常短,为了更加准确地测量每个查询场景下较为稳定的响应时间,我们将单个查询运行次数提升到 5000 次,然后使用 TSBS 自动统计并输出结果,最后结果是 5000 次查询的算数平均值,使用并发客户端 Workers 数量为 8。下表是场景二 (4000设备)的查询性能对比结果。
下面我们对每个查询结果做一定的分析说明:
由于 Simple Rollups 的整体查询响应时间非常短,因此制约查询响应时间的主体因素并不是查询所涉及的数据规模,即这一类型查询的瓶颈并非数据规模。但从结果上看,TDengine 仍然在所有类型的查询响应时间上优于 InfluxDB 和 TimescaleDB,具体的数值对比请参见上表。
在 Aggregates 类型的查询中,TDengine 的查询性能相比于 TimescaleDB 和 InfluxDB 优势更为明显,其在 cpu-max-all-8 中的查询性能是 InfluxDB 的 7 倍,是 TimescaleDB 的 6 倍。
从上表可见,在 Double-rollups 类型查询中, TDengine 展现出了巨大的性能优势。以查询响应时间来度量,其在 double-groupby-5 和 double-groupby-all 的查询性能均是 TimescaleDB 的 24 倍;在 double-groupby-5 查询上是 InfluxDB 的 26 倍,double-groupby-all 上是其 34 倍。
如上面两图所示,threshold 类型的查询中,high-cpu-1 中 TDengine 的查询响应时间均显著低于 TimescaleDB 和 InfluxDB。在 high-cpu-all 的查询中,TDengine 的性能是 InfluxDB 的 15 倍,是 TimescaleDB 的 1.23 倍。
对于 Complex-queries 类型的查询,TDengine 两个查询均大幅领先 TimescaleDB 和 InfluxDB——在 lastpoint 查询中,其性能是 TimescaleDB 的 5 倍, InfluxDB 的 21 倍;在 groupby-orderby-limit 场景中其查询性能是TimescaleDB的 8 倍,是 InfluxDB 的 15 倍。在时间窗口聚合的查询过程中,TimescaleDB 针对规模较大的数据集查询性能不佳(double rollups 类型查询),对于 groupby-orderby-limit 的查询,其性能上表现同样不是太好。
资源开销对比:整体 CPU 计算时间消耗是 InfluxDB 的 1/10
由于部分查询持续时间特别短,因此并不能凭借以上信息完整地看到查询过程中服务器的 IO/CPU/网络情况。为此,我们以场景二的数据为模拟数据,以 Double rollups 类别中的 double-groupby-5 查询为例,执行 1000 次查询,记录整个过程中三个软件系统在查询执行的整个过程中服务器 CPU、内存、网络的开销并进行对比。
服务器 CPU 开销
从上图可以看到,三个系统在整个查询过程中 CPU 的使用均较为平稳。TDengine 在查询过程中整体 CPU 占用约 80%, 在三个系统中使用的 CPU 资源最高;TimescaleDB 在查询过程中瞬时 CPU 占用次之,约 38%;InfluxDB 的 CPU 占用的最小,约 27 %(但是有较多的瞬时冲高)。从整体 CPU 开销上来看,虽然 InfluxDB 瞬时 CPU 开销最低,但是其完成查询持续时间也最长,所以整体 CPU 资源消耗最多。由于 TDengine 完成全部查询的时间仅为 TimescaleDB 或 InfluxDB 的 1/20,因此虽然其 CPU 稳定值是 TimescaleDB 与 InfluxDB 的 2 倍多,但整体的 CPU 计算时间消耗却只有其 1/10 。
服务器内存状况
如上图所示,在整个查询过程中,TDengine 内存维持了一个相对平稳的状态。TimescaleDB 在整个查询过程中内存呈现增加的状态,查询完成后即恢复到初始状态,InfluxDB 内存占用呈现相对稳定的状态。
服务器网络带宽
上图展示了查询过程中服务器端上行和下行的网络带宽情况,负载状况基本上和 CPU 状况相似。TDengine 网络带宽开销最高,因为在最短的时间内就完成了全部查询,需要将查询结果返回给客户端。InfluxDB 网络带宽开销最低,TimescaleDB 介于两者之间。
100 devices × 10 metrics 查询性能对比:最高达到 TimescaleDB 的 28.6 倍
对于场景一(100 devices x 10 metrics)来说,TSBS 的 15 个查询对比结果如下:
如上表所示,在更小规模的数据集(100 设备)上的查询对比可以看到,整体来说 TDengine 同样展现出极好的性能,在全部查询语句中均优于 TimescaleDB 和 InfluxDB,部分查询性能超过 TimescaleDB 28 倍,超过 InfluxDB 37 倍。
写在最后
基于上文可以做出总结,整体来讲,在场景一(只包含 4 天的数据)与场景二的 15 个不同类型的查询中,TDengine 的查询平均响应时间全面优于 InfluxDB 和 TimescaleDB,在复杂查询上优势更为明显,同时具有最小的计算资源开销。相对于 InfluxDB,场景一中 TDengine 查询性能是其 1.9 ~ 37 倍,场景二中 TDengine 查询性能是其 1.8 ~ 34.2 倍;相对于 TimeScaleDB,场景一中TDengine 查询性能是其 1.1 ~ 28.6 倍,场景二中 TDengine 查询性能是其 1.2 ~ 24.6 倍。
事实上,TDengine 高效的查询性能此前在很多企业客户的实践中就已经展示出来了,以广东省环境科学研究院生态环境数据治理服务项目为例,对于 76 亿行的超级表,TDengine 运行分组 TOP 查询仅用了 0.2 秒;基于 TDengine 返回 2,968 行,仅用了 0.06 秒;返回 5,280 行数据,仅用了 0.1 秒。如果你也面临着数据处理难题或想要进行数据架构升级,欢迎添加小T vx:tdengine1,加入 TDengine 用户交流群,和更多志同道合的开发者一起攻克难关。