在上一篇文章《写入性能:TDengine最高达到InfluxDB的10。3倍,TimeScaleDB的6。74倍》中,我们基于TSBS时序数据库(TimeSeriesDatabase)性能基准测试报告对三大数据库写入性能进行了相关解读,较为直观地展现出了TDengine的众多写入优势。本篇文章将以查询性能作为主题,给正在为数据分析痛点而头疼的朋友们带来一些帮助。 在查询性能评估部分,我们使用场景一(只包含4天数据)和场景二作为基准数据集,关于基础数据集的具体特点,请点击进入《TSBS是什么?为什么时序数据库TDengine会选择它作为性能对比测试平台?》一文中查看。在查询性能评估之前,为确保两大数据库充分发挥查询性能,对于TimescaleDB,我们采用了《TimescaleDBvs。InfluxDB》(见下方链接)中的推荐配置,设置为8个Chunk;对于InfluxDB,我们开启InfluxDB的TSI(timeseriesindex)。在整个查询对比中,TDengine数据库的虚拟节点数量(vnodes)保持为默认的6个,其他的数据库参数配置为默认值。 TimescaleDBvs。InfluxDB:PurposeBuiltDifferentlyforTimeSeriesData: https:www。timescale。comblogtimescaledbvsinfluxdbfortimeseriesdatatimescaleinfluxsqlnosql364892998774,000devices10metrics查询性能对比:最高达到InfluxDB的34。2倍 由于部分类型(分类标准参见上方《TimescaleDBvs。InfluxDB》一文)单次查询响应时间非常短,为了更加准确地测量每个查询场景下较为稳定的响应时间,我们将单个查询运行次数提升到5000次,然后使用TSBS自动统计并输出结果,最后结果是5000次查询的算数平均值,使用并发客户端Workers数量为8。下表是场景二(4000设备)的查询性能对比结果。 4,000devices10metrics(场景二)查询性能对比表(单位:ms) 下面我们对每个查询结果做一定的分析说明: 4000devices10metricsSimpleRollups查询响应时间(数值越小越好) 由于SimpleRollups的整体查询响应时间非常短,因此制约查询响应时间的主体因素并不是查询所涉及的数据规模,即这一类型查询的瓶颈并非数据规模。但从结果上看,TDengine仍然在所有类型的查询响应时间上优于InfluxDB和TimescaleDB,具体的数值对比请参见上表。 4000devices10metricsAggregates查询响应时间(数值越小越好) 在Aggregates类型的查询中,TDengine的查询性能相比于TimescaleDB和InfluxDB优势更为明显,其在cpumaxall8中的查询性能是InfluxDB的7倍,是TimescaleDB的6倍。 4000devices10metricsDoublerollups查询响应时间(数值越小越好) 从上表可见,在Doublerollups类型查询中,TDengine展现出了巨大的性能优势。以查询响应时间来度量,其在doublegroupby5和doublegroupbyall的查询性能均是TimescaleDB的24倍;在doublegroupby5查询上是InfluxDB的26倍,doublegroupbyall上是其34倍。 4000devices10metricsThresholds查询highcpu1响应时间(数值越小越好) 4000devices10metricsThresholds查询highcpuall响应时间(数值越小越好) 如上面两图所示,threshold类型的查询中,highcpu1中TDengine的查询响应时间均显著低于TimescaleDB和InfluxDB。在highcpuall的查询中,TDengine的性能是InfluxDB的15倍,是TimescaleDB的1。23倍。 4000devices10metricsComplexqueries查询响应时间(数值越小越好) 对于Complexqueries类型的查询,TDengine两个查询均大幅领先TimescaleDB和InfluxDB在lastpoint查询中,其性能是TimescaleDB的5倍,InfluxDB的21倍;在groupbyorderbylimit场景中其查询性能是TimescaleDB的8倍,是InfluxDB的15倍。在时间窗口聚合的查询过程中,TimescaleDB针对规模较大的数据集查询性能不佳(doublerollups类型查询),对于groupbyorderbylimit的查询,其性能上表现同样不是太好。资源开销对比:整体CPU计算时间消耗是InfluxDB的110 由于部分查询持续时间特别短,因此并不能凭借以上信息完整地看到查询过程中服务器的IOCPU网络情况。为此,我们以场景二的数据为模拟数据,以Doublerollups类别中的doublegroupby5查询为例,执行1000次查询,记录整个过程中三个软件系统在查询执行的整个过程中服务器CPU、内存、网络的开销并进行对比。服务器CPU开销 查询过程中服务器CPU开销 从上图可以看到,三个系统在整个查询过程中CPU的使用均较为平稳。TDengine在查询过程中整体CPU占用约80,在三个系统中使用的CPU资源最高;TimescaleDB在查询过程中瞬时CPU占用次之,约38;InfluxDB的CPU占用的最小,约27(但是有较多的瞬时冲高)。从整体CPU开销上来看,虽然InfluxDB瞬时CPU开销最低,但是其完成查询持续时间也最长,所以整体CPU资源消耗最多。由于TDengine完成全部查询的时间仅为TimescaleDB或InfluxDB的120,因此虽然其CPU稳定值是TimescaleDB与InfluxDB的2倍多,但整体的CPU计算时间消耗却只有其110。服务器内存状况 查询过程中服务器内存情况 如上图所示,在整个查询过程中,TDengine内存维持了一个相对平稳的状态。TimescaleDB在整个查询过程中内存呈现增加的状态,查询完成后即恢复到初始状态,InfluxDB内存占用呈现相对稳定的状态。服务器网络带宽 查询过程中网络占用情况 上图展示了查询过程中服务器端上行和下行的网络带宽情况,负载状况基本上和CPU状况相似。TDengine网络带宽开销最高,因为在最短的时间内就完成了全部查询,需要将查询结果返回给客户端。InfluxDB网络带宽开销最低,TimescaleDB介于两者之间。100devices10metrics查询性能对比:最高达到TimescaleDB的28。6倍 对于场景一(100devicesx10metrics)来说,TSBS的15个查询对比结果如下: InfluxDB与Timescale相对于TDengine的查询响应时间比率(单位:ms) 如上表所示,在更小规模的数据集(100设备)上的查询对比可以看到,整体来说TDengine同样展现出极好的性能,在全部查询语句中均优于TimescaleDB和InfluxDB,部分查询性能超过TimescaleDB28倍,超过InfluxDB37倍。写在最后 基于上文可以做出总结,整体来讲,在场景一(只包含4天的数据)与场景二的15个不同类型的查询中,TDengine的查询平均响应时间全面优于InfluxDB和TimescaleDB,在复杂查询上优势更为明显,同时具有最小的计算资源开销。相对于InfluxDB,场景一中TDengine查询性能是其1。937倍,场景二中TDengine查询性能是其1。834。2倍;相对于TimeScaleDB,场景一中TDengine查询性能是其1。128。6倍,场景二中TDengine查询性能是其1。224。6倍。 事实上,TDengine高效的查询性能此前在很多企业客户的实践中就已经展示出来了,以广东省环境科学研究院生态环境数据治理服务项目为例,对于76亿行的超级表,TDengine运行分组TOP查询仅用了0。2秒;基于TDengine返回2,968行,仅用了0。06秒;返回5,280行数据,仅用了0。1秒。