当前位置: 首页 > news >正文

性能超越 Clickhouse | 物联网场景中的毫秒级查询案例

1 物联网应用场景简介

物联网(Internet of Things,简称 IoT)是指通过各种信息传感、通信和 IT 技术来实时连接、采集、监管海量的传感设备,从而实现对现实世界的精确感知和快速响应,继而实现自动化、智能化管理。在查询 IoT 设备状态的场景下,吞吐量和时延是两个重要的性能指标。

在工业物联网中,常见有以下几种设备时序数据的查询需求:

  • 案例1:查询某个设备最近的记录
  • 案例2:查询某个租户所有设备的最近一条记录
  • 案例3:查询某个设备最近5分钟的统计信息
  • 案例4:查询某个设备最近一天的秒级数据

本教程通过一个工业物联网的案例,来演示 DolphinDB 的序列查询性能,并对比测试了 DolphinDB TSDB 引擎、OLAP 引擎,以及 ClickHouse MergeTree 引擎在上述查询案例上的时延指标。总体来说,DolphinDB TSDB 引擎的性能(时延)对比 DolphinDB OLAP 引擎和 ClickHouse MergeTree 引擎有显著优势。

2 案例数据准备

2.1 数据集说明

本教程参考了某工业物联网 SaaS 平台服务商的数据集,模拟并使用一份高度仿真的数据。该SaaS服务商的主要业务是监控各个地区的噪声情况。表结构如下:

序号字段名称字段类型注释
1tenantIdINT租户ID
2deviceIdINT设备ID
3soundPressureLevelDOUBLE声音分贝
4soundPowerLevelDOUBLE声音功率值
5tsTIMESTAMP数据采集时间戳
6dateDATE日期

一行数据包含租户 ID、设备 ID、声压、噪声功率、采集时间戳和日期共计 6 列数据。每行记录占用 36 字节。该案例数据包含100 个租户,每个租户管理 100 个噪声监控设备,记录了从 2022-01-01 至 2022-01-12,12亿的噪声数据,共计 40G。

2.2 库表设计及数据模拟

使用 DolphinDB TSDB 引擎,创建一个名为 NoiseDB 的数据库,存储噪声数据。TSDB 引擎是 DolphinDB 自 2.00 版本起,专门为物联网场景设计研发的数据存储引擎,具备优秀的写入和序列查询性能。

在噪声监控的 SaaS 服务中,较为频繁的查询场景是以租户为维度,查询某一天某个设备的状态信息。因此设计 noise 表按日期、租户 ID 进行分区,可以有效利用分区剪枝。同时使用区分度较高的设备 ID 和数据采集时间戳作为排序键(查询索引),使查询时能够快速定位对应设备的数据,提升查询性能。具体实现脚本如下。

db1 = database(,VALUE,1000..2000) 
db2  = database(, VALUE, 2022.01.01..2022.12.30) // TSDB for iot 
dbNoise = database("dfs://NoiseDB",COMPO,[db1,db2], engine="TSDB") create table "dfs://NoiseDB"."noise"(tenantId INT,deviceId INT,soundPressureLevel INT,soundPowerLevel DOUBLE,ts TIMESTAMP,date DATE
)
partitioned by tenantId, date
sortColumns=[`deviceId,`ts]

库表创建完成后,模拟 2022-01-01 至 2022-01-12 的数据,具体代码详见附录 DolphinDB 脚本。

可以通过 SQL 查询验证下数据集大小:

select count(*) from  loadTable(database("dfs://NoiseDB"),"noise") where date between 2022.01.01:2022.01.102> 1260010000

导入完成后,每个分区下生成3个level 0 file,未满足自动合并条件(大于等于10个 levelFile),需要进行手动合并。

chunkIds = exec chunkId from getChunksMeta() where type=1
for (x in chunkIds) {triggerTSDBCompaction(x)
}

完成后将案例数据导出数据至 csv 文件,以便后续导入 OLAP 引擎、ClickHouse。在 ClickHouse 中使用OPTIMIZE TABLE noise 合并下 mergeTree。具体过程参照附录 ClickHouse 脚本。

3 SQL 查询

在 DolphinDB 中,可以使用 SQL 快速实现4个设备状态查询需求,并且代码十分简洁。

  • 案例1:查询某个设备最近的100条记录:
noise = loadTable(database("dfs://NoiseDB"),"noise")
select * from noise 
where date=2022.01.01 and tenantId=1055 and deviceId=10067
order by ts desc
limit 100# timer(10) select ...
Time elapsed: 24.33 ms

脚本的 where 条件语句中指定了分区列 date 和 tenantId 进行过滤,便于 DolphinDB 系统通过分区剪枝快读定位到对应的分区。同时指定了数据库的 sort key (deviceId) 作为过滤字段,利用 TSDB 的索引机制,可以快速定位到数据块,并按时间顺序取回最新的100条记录。平均一次查询耗时 2ms,未命中缓存的首次查询耗时 14ms

  • 案例2:查询某个租户所有设备最新状态
noise = loadTable(database("dfs://NoiseDB"),"noise")
select * from noise 
where date=2022.01.01 and tenantId=1055
context by deviceId
csort ts desc
limit 1# timer(10) select ...
Time elapsed: 246.619 ms

该脚本在 where 条件语句中同样指定了分区列以快速定位到对应的数据分区。通过 context by 子句来根据设备 ID 将数据进行分组,每组数据通过 csort 子句按时间倒序排列(考虑到物联网存在消息乱序的情况,必须使用csort将数据按采集时间排序)。使用 limit 1 获取每个窗口内的最新的一条记录,从而获取该租户当日所有设备的最新状态。平均一次查询耗时 25ms,首次查询耗时 121ms

  • 案例3:查询某个设备5分钟内的噪声统计值
noise = loadTable(database("dfs://NoiseDB"),"noise")
selectmin(ts) as startTs,max(ts) as endTs,max(soundPressureLevel),avg(soundPressureLevel),max(soundPowerLevel) ,avg(soundPowerLevel) 
from noise
where date=2022.01.01 and tenantId=1055 and deviceId=10067 and ts between 2022.01.01T00:50:15.518:2022.01.01T00:55:15.518
group by tenantId, deviceId# timer(10) select ...
Time elapsed: 22.168 ms

该脚本首先根据 where 指定的过滤条件定位并扫描数据块,取出对应时间段的数据,并按 tenantId, deviceId 进行聚合计算,以获取声音分贝、功率的统计值。平均一次查询耗时 2ms,首次查询耗时 13ms

  • 案例4:查询某个设备最近一天的明细数据
noise = loadTable(database("dfs://NoiseDB"),"noise")
select *
from noise
where date=2022.01.01 and tenantId=1055 and deviceId=10067
order by ts# timer(10) select ...
Time elapsed: 23.261 ms

该脚本首先根据 where 指定的过滤条件定位并扫描数据块,取出对应时间段的明细数据,并按采集时间排序。平均一次查询耗时 2ms,首次查询耗时 16ms

:首次查询指未命中数据库缓存及操作系统缓存的查询。

4 对比测试

进一步测试 DolphinDB TSDB 引擎与 OLAP 引擎,以及 ClickHouse MergeTree 引擎在上述数据集的时序查询性能。测试过程中尽可能地保持环境变量相同,以保证科学有效。具体测试脚本详见附录。

4.1 测试环境

  • 测试机器配置

操作系统:CentOS 7

CPU: 2 cores

内存:10 G

磁盘:SSD

  • 核心测试参数

对测试中影响性能的关键参数,保持对等一致。

软件信息核心参数库表设计
DolphinDB:2.00.6 单节点memSize=8G TSDB引擎 / OLAP引擎partitioned by tenantId, datesortColumns = [deviceId,ts]
ClickHouse:22.6.1 单节点max_server_memory_usage=8GMergeTree引擎partition by tenantId, dateorder by deviceId, ts

测试时,DolphinDB 和 ClickHouse 均采用单节点,并分配 8G 最大内存。在引擎方面,DolphinDB TSDB 引擎,ClickHouse MergeTree 引擎的内部实现都采用了 LSM-tree。并保持库表设计完全一致。

  • 时间衡量标准

由于端到端的时间,容易受到网络抖动和客户端实现性能的影响,因此本次测试的测量时间设定为从查询引擎接收到请求至计算出结果为止。

4.2 测试结果

三者的具体测试结果为下表,表中数值为平均耗时/首次查询耗时(单位 ms),平均耗时的计算逻辑为:

平均耗时 = ( 首次耗时 + 9次缓存命中耗时 )/ 10

测试用例场景DolphinDB TSDBDolphinDB OLAPClickHouse
case1查询某个设备最新100 条记录2 / 1434 / 5114 / 150
case2查询某个租户所有设备的最新状态25 /12162 / 17073 / 400
case3查询某个设备 5min的噪声统计值2 / 1315 / 13612 / 82
case4查询某个设备最近一天的明细数据2 / 1624 / 22022 / 200

可以看出,OLAP 引擎和 ClickHouse 在不同的查询场景下性能各有其优势和劣势。

而 TSDB 引擎性能均优于 ClickHouse,在相对复杂的点查场景性能差距更大。在场景4下 ,DolphinDB TSDB 引擎比 ClickHouse 的性能高 12.5 倍,首次查询高13倍。在该场景中,TSDB 引擎需要读取对应设备的10000条记录,压缩后的存储大小约为90K。存储在6个连续的Block中,读取效率非常高效。而 ClickHouse 则是 scan 了该分区下1000000条记录的数据块,因此两者的首次查询性能差距较大,而缓存后的性能差距主要取决于两者在计算性能上的差别 。

5 总结

DolphinDB TSDB 引擎在物联网场景有着卓越的点查性能,可以以毫秒级延时迅速响应设备的状态信息,其性能更优于 ClickHouse 的 MergeTree 引擎。

6 附录

  • DolphinDB 脚本
  • ClickHouse 脚本

相关文章:

性能超越 Clickhouse | 物联网场景中的毫秒级查询案例

1 物联网应用场景简介 物联网(Internet of Things,简称 IoT)是指通过各种信息传感、通信和 IT 技术来实时连接、采集、监管海量的传感设备,从而实现对现实世界的精确感知和快速响应,继而实现自动化、智能化管理。在查…...

05、SpringBoot 集成 RocketMQ

目录 SpringBoot集成RocketMQ消息发送三种方式1、同步消息producer-springboot创建项目添加依赖配置文件同步消息发送代码启动类Test类 comsumer-springboot创建项目添加依赖配置文件同步消息消费代码 2、异步消息生产者消费者 3、一次性消息生产者消费者 消息消费两种方式1、集…...

PR2023中如何导入字幕

PR中如何导入字幕 方法一: 点开文本,字幕,新建字幕分段(点击右上角…三个点) 键入调整内容 方法二 点开基本图形,编辑,调整,拖动位置。...

读书笔记--华为数据之道有感

通过研读华为数据之道,了解到华为作为一家非数字原生企业,其业务涵盖研发、营销、制造、供应、采购、服务等,业务相当复杂。因此华为在开展数据治理过程中明确了由谁来对数据负责,特别是对数据质量负责,明确了数据质量的衡量或度量指标,并成立了数据管理部,确定其职能定…...

汽车数据安全事件频发,用户如何保护隐私信息?

面对日益增多的汽车数据安全事件,对于广大用户来说,有没有既廉价又安全的解决方案? 频发的汽车数据安全事件 随着汽车“新四化”大潮的来临,汽车用户从电动化、网联化、智能化、共享化中切实体验到了越来越多的便利,各…...

Redis主从复制流程

前言 Redis 支持部署多节点,然后按照 1:n 的方式构建主从集群,即一个主库、n 个从库。主从库之间会自动进行数据同步,但是只有主库同时允许读写,从库只允许读。 搭建主从复制集群的目的: 从库可用于容灾备份从库可以…...

微信公众号如何变更为订阅号?

公众号迁移有什么作用?只能变更主体吗?大家都知道,微信公众号是不支持直接变更主体的;但是很多情况下,我们又不得不进行账号主体的更换;这时候,我么就可以通过账号迁移功能,将A公众号…...

竞赛选题 深度学习YOLO抽烟行为检测 - python opencv

文章目录 1 前言1 课题背景2 实现效果3 Yolov5算法3.1 简介3.2 相关技术 4 数据集处理及实验5 部分核心代码6 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习YOLO抽烟行为检测 该项目较为新颖,适合作为竞赛课…...

mysql利用mysqldump方式搭建主从

背景:线上环境在主库不停服的情况下,利用mysqldump的方式搭建从库。 建议:在主库比较小的情况下(个人建议50G左右),主库不停服可以利用mysqldump搭建从库。如果主库很大,建议利用mysql热备份工…...

如何保护IP在线隐私,提高网络安全?

在数字时代,我们的在线IP隐私面临着越来越多的威胁。黑客、广告商和第三方机构都试图获取我们的个人信息和浏览习惯。因此,保护您的在线IP隐私至关重要。本文将介绍一些简单但有效的方法,帮助您保护自己的隐私。 使用防关联浏览器&#xff1a…...

掌握 C++ 编译过程:面试中常见问题解析

C是一种高级编程语言,但是计算机并不能直接理解它。因此,需要将C代码翻译成计算机可以理解的机器语言。这个过程就是编译过程,是C程序从源代码到可执行文件的转换过程,包括预处理、编译、汇编和链接四个阶段 预处理 在编译器开始…...

了解Qt QScreen的geometry ,size

目的 了解qt 对于屏幕的size, geometry含义, 更能有效实现最大化, 向下还原逻辑操作 Test 目前我有两个屏 ,1920x1080, 3840*2160. 检测当前程序所在screen(1920x1080)下属性 int screenNum…...

云安全—云计算基础

0x00 前言 学习云安全,那么必然要对云计算相关的内容进行学习和了解,所以云安全会分为两个部分来进行,首先是云计算先关的内容。 0x01 云计算 广泛传播 云计算最早大范围传播是2006年,8月,在圣何塞【1】举办的SES&a…...

【ARM Coresight Debug 系列 16 -- Linux 断点 BRK 中断使用详细介绍】

文章目录 1.1 ARM BRK 指令1.2 BRK 立即数宏定义介绍1.3 断点异常处理流程1.3.1 el1_sync_handler1.3.2 el1_dbg 跟踪 1.4 debug 异常处理函数注册1.4.1 brk 处理函数的注册 1.1 ARM BRK 指令 ARMv8 架构的 BRK 指令是用于生成一个软件断点的。当处理器执行到 BRK 指令时&…...

Rust星号(*)的作用-基础篇

在Rust中,*符号具有多种不同的用途,具体取决于它的使用方式。以下是Rust中*常见的用法. 1.解引用指针 当作为一元运算符放在指针变量之前时,*用于解引用指针并访问它指向的值。在Rust中,通常更推荐使用引用而不是原始指针。引用…...

企业该如何选择数字化转型工具?

对于希望在当今快速发展的商业环境中增强运营、提高效率并保持竞争力的公司来说,选择正确的数字化转型工具是一项关键决策。以下是选择数字化转型工具的关键步骤和注意事项: 1.定义业务目标: 清楚地阐明您的业务目的和目标。了解您希望通过数…...

element ui 中 el-button重新渲染后disabled属性失效

调试发现:disabled绑定的值和显示没有保持一致&#xff0c;发现是disabled属性失效 解决方式&#xff1a; 给标签添加key 比如&#xff1a;key“isOldVersion” <el-form-item><el-button type"primary" style"margin-left: 100px;" click"…...

WebRTC AIMD算法用处

WebRTC使用AIMD&#xff08;Additive Increase Multiplicative Decrease&#xff09;算法来进行码率控制。 在WebRTC中&#xff0c;码率控制的目标是优化音视频传输的质量和稳定性&#xff0c;以适应网络状况的变化。具体而言&#xff0c;AIMD算法通过监测网络的拥塞情况&…...

迁移kubelet、docker和containerd工作目录

文章目录 问题背景迁移Docker停止 Docker 服务修改配置移动文件重新启动 Docker 服务 containerd停止服务修改配置移动文件重新启动服务 kubelet&#xff08;遇到问题待解决&#xff09;停止服务修改配置移动文件&#xff08;遇到问题待解决&#xff09;重新启动服务 使用的版本…...

Go 重构:尽量避免使用 else、break 和 continue

今天&#xff0c;我想谈谈相当简单的事情。我不会发明什么&#xff0c;但我在生产代码中经常看到这样的事情&#xff0c;所以我不能回避这个话题。 我经常要解开多个复杂的 if else 结构。多余的缩进、过多的逻辑只会加深理解。首先&#xff0c;这篇文章的主要目的是让代码更透…...

惠普tank 2606,开机报错 ER-08 ,加了碳粉还是报错ER08,黄灯闪烁成像鼓接近寿命期限,别被维修店坑了,这个软件专门维修这个错误,软件运行一下2分钟搞好。

下载地址&#xff1a;链接:https://pan.baidu.com/s/1J7PN4m4fbIzku9DqBFg_nw?pwd0000 提取码:0000 备用下载&#xff1a;下载 惠普tank 2606系列&#xff0c;tank1005系列&#xff0c;打印机提示错误代码 er-08 &#xff0c;加了粉还是报错er08,提示没粉&#xff0c;闪黄灯…...

YOLOv8鹰眼目标检测实战:一键部署,实时识别80种物体(附WebUI)

YOLOv8鹰眼目标检测实战&#xff1a;一键部署&#xff0c;实时识别80种物体&#xff08;附WebUI&#xff09; 1. 项目概述 1.1 什么是YOLOv8鹰眼目标检测 YOLOv8鹰眼目标检测是基于Ultralytics最新YOLOv8模型的工业级解决方案。它能够在毫秒级别完成图像中多达80类物体的识别…...

国内开发者如何高效集成Nano Banana Pro与Sora2?——API中转站选型与实战避坑指南

1. 为什么需要API中转站&#xff1f; 对于国内开发者来说&#xff0c;想要直接调用Nano Banana Pro和Sora2的官方API&#xff0c;面临着几个现实问题。首先是网络访问的稳定性&#xff0c;Google和OpenAI的API服务器都部署在海外&#xff0c;国内直连经常会出现高延迟、丢包甚至…...

从收音机到WiFi:LC并联谐振电路在实际通信系统里是怎么用的?

从矿石收音机到5G基站&#xff1a;LC并联谐振电路的百年进化史 当你拧动老式收音机的调谐旋钮时&#xff0c;金属指针在刻度盘上滑过不同电台的频率标记&#xff0c;耳机里传来忽大忽小的静电噪声&#xff0c;直到某个瞬间——声音突然清晰起来。这个看似简单的动作背后&#x…...

电子电路实战:PWM转DAC的滤波参数优化策略

1. PWM转DAC的基础原理 PWM&#xff08;脉冲宽度调制&#xff09;转DAC&#xff08;数模转换&#xff09;是嵌入式系统中常见的低成本解决方案。简单来说&#xff0c;就是通过调节数字信号的占空比来模拟不同的电压值。比如一个3.3V的PWM信号&#xff0c;50%占空比就相当于1.65…...

Ubuntu20.04下QGroundControl开发环境搭建全攻略(含常见错误解决方案)

Ubuntu 20.04下QGroundControl开发环境搭建全攻略&#xff08;含常见错误解决方案&#xff09; 在无人机和机器人开发领域&#xff0c;QGroundControl作为一款开源的飞行控制地面站软件&#xff0c;已经成为开发者不可或缺的工具。本文将带你从零开始&#xff0c;在Ubuntu 20.0…...

马上深挖!!!三段逆置如何实现数组轮转?!用最简单的话让你秒懂

一、目的给定一个数组和一个整数k&#xff0c;让数组向右轮转k个数。如令[1,2,3,4,5,6]向右轮转3个数&#xff0c;结果为[4,5,6,1,2,3]。二、代码#include <iostream> using namespace std;void swap(int* a,int* b) {int tmp*a;*a*b;*btmp;return; }void reverse(int* a…...

【RT-DETR涨点改进】SCI一区 2025顶刊 |全网独家创新,注意力改进篇 | RT-DETR引入DOAM动态全向注意力模块,模块,显著增强了特征表达能力和结构恢复能力,含7种独家创新改进点

一、本文介绍 🔥本文给大家介绍利用 DOAM 动态全向注意力模块改进RT-DETR网络模型,可在不显著增加计算量的前提下增强全局上下文建模能力,通过空间轴向聚合获得更强的跨区域信息交互,并用通道动态加权突出目标相关特征、抑制背景干扰,从而优化多尺度特征融合效果,提升小…...

土地利用变化分析实战:用Python处理40年CNLUCC数据集

土地利用变化分析实战&#xff1a;用Python处理40年CNLUCC数据集 1972年至今的中国土地利用变化数据&#xff0c;如同一部记录国土变迁的"生态相册"。对于区域规划师、生态研究者而言&#xff0c;这套CNLUCC数据集的价值不亚于考古学家手中的碳14检测仪。本文将带您用…...

帆软FineDB数据库驱动上传权限配置与实战指南

1. 为什么需要配置数据库驱动上传权限 在企业级报表开发中&#xff0c;经常会遇到需要连接特殊数据库的场景。帆软报表平台默认只内置了常见数据库的驱动&#xff0c;比如MySQL、Oracle这些。但实际项目中&#xff0c;我们可能需要连接达梦、GBase这些国产数据库&#xff0c;或…...