尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
ThingsBoard电能分时统计优化:PostgreSQL批处理方案
1. 项目背景与需求分析在物联网(IoT)平台ThingsBoard的实际应用中电能数据的统计分析一直是个棘手问题。传统方案通常只计算总量或平均值但电力行业特有的尖峰平谷分时计价机制要求我们对数据进行更精细的处理。每个客户可能有不同的时段划分标准比如A客户定义早8点到晚10点为峰时段而B客户可能将下午2点到6点设为尖峰时段。这种业务特性带来了两个技术挑战时段定义存储在客户属性中是动态可变的JSON结构设备注册初期可能还未分配客户归属无法获取时段规则最初我们尝试用数据库触发器实时计算但发现当面对百万级设备的海量遥测数据时触发器频繁解析JSON规则导致数据库性能急剧下降。实测显示高峰期CPU利用率可达90%以上严重影响了系统整体响应速度。2. 技术方案选型2.1 触发器方案的局限性触发器(Trigger)看似是实时计算的理想选择但在我们的场景中存在致命缺陷性能瓶颈每条数据插入都会触发规则解析和计算数据完整性风险设备注册初期没有客户归属时无法计算维护困难业务规则变更需要重建触发器通过pgBadger分析慢查询日志发现单个触发器的执行时间可能长达200ms这在批量插入场景下完全不可接受。2.2 定时批处理方案的优势改用PostgreSQL的定时任务(pgAgent)方案后计算集中化每天凌晨统一处理避开业务高峰资源可控可以限制任务执行时的CPU和内存占用容错性强单日数据问题不影响整体系统我们设计了两个聚合函数put_ts_kv_daily_a通用统计总量/平均/最大/最小put_ts_kv_daily_b专用于电能的分时段统计3. 数据库结构优化3.1 表结构变更为支持分时段统计我们对ts_kv_daily表进行了扩展ALTER TABLE ts_kv_daily ADD COLUMN sum_value_a DOUBLE PRECISION DEFAULT 0; ALTER TABLE ts_kv_daily ADD COLUMN sum_value_b DOUBLE PRECISION DEFAULT 0; ALTER TABLE ts_kv_daily ADD COLUMN sum_value_c DOUBLE PRECISION DEFAULT 0; ALTER TABLE ts_kv_daily ADD COLUMN sum_value_d DOUBLE PRECISION DEFAULT 0;这四个字段分别对应sum_value_a尖峰时段总和sum_value_b高峰时段总和sum_value_c平段总和sum_value_d谷段总和3.2 JSON规则解析函数创建专用函数解析客户配置的时段规则CREATE OR REPLACE FUNCTION public.parse_electric_quantity_rule( rule_json jsonb ) RETURNS TABLE( month integer, time_type text, start_time time, end_time time ) LANGUAGE sql IMMUTABLE AS $$ -- 实现JSON解析逻辑 $$;4. 核心聚合函数实现4.1 函数架构设计put_ts_kv_daily_b函数的主要处理流程计算当日时间范围转为毫秒时间戳联查设备-客户-时段规则关系按时段分类聚合数据执行UPSERT操作更新日统计表4.2 关键SQL片段解析WITH customer_parsed_rules AS ( SELECT ak.entity_id as customer_id, per.month, per.time_type, per.start_time, per.end_time FROM attribute_kv ak INNER JOIN key_dictionary kd ON kd.key_id ak.attribute_key JOIN public.parse_electric_quantity_rule(ak.json_v::jsonb) per ON TRUE WHERE kd.key 尖峰平谷 ) INSERT INTO ts_kv_daily (...) SELECT a.entity_id, p_key, v_daily_ts, SUM(...), COUNT(*), AVG(...), MIN(...), MAX(...), SUM(CASE WHEN cpr.time_type times_a THEN ... END), -- 尖峰 SUM(CASE WHEN cpr.time_type times_b THEN ... END), -- 高峰 SUM(CASE WHEN cpr.time_type times_c THEN ... END), -- 平段 SUM(CASE WHEN cpr.time_type times_d THEN ... END) -- 谷段 FROM ts_kv a /* 关联逻辑 */ ON CONFLICT (entity_id, key, ts) DO UPDATE SET ...;5. 定时任务配置5.1 pgAgent任务设置通过pgAdmin创建定时任务每天凌晨2点执行先处理常规指标功率因素等再处理电能分时段统计-- 凌晨2:05执行 SELECT put_ts_kv_daily_a(CURRENT_DATE - 1, 96); -- 功率因素 SELECT put_ts_kv_daily_b(CURRENT_DATE - 1, 98); -- 有功电量5.2 监控与日志添加任务执行日志检查-- 检查任务执行状态 SELECT * FROM pgagent.pga_joblog WHERE jobjclid (SELECT jobid FROM pgagent.pga_job WHERE jobname daily_stats); -- 检查错误信息 SELECT * FROM pgagent.pga_jobsteplog WHERE jsljclid (SELECT jobid FROM pgagent.pga_job WHERE jobname daily_stats) AND jslstatus f;6. 性能优化技巧6.1 索引优化建议必须确保以下索引存在-- 原始数据表索引 CREATE INDEX IF NOT EXISTS idx_ts_kv_entity_key_ts ON ts_kv(entity_id, key, ts); -- 日统计表索引 CREATE INDEX IF NOT EXISTS idx_ts_kv_daily_entity_key_ts ON ts_kv_daily(entity_id, key, ts);6.2 内存参数调整在postgresql.conf中增加工作内存work_mem 16MB # 原值通常为4MB maintenance_work_mem 256MB # 原值通常为64MB6.3 并行查询配置对于大型客户启用并行查询SET max_parallel_workers_per_gather 4;7. 常见问题排查7.1 数据缺失问题现象某设备的分时段统计数据为空 排查步骤检查设备是否已分配客户SELECT customer_id FROM device WHERE id 设备ID;检查客户是否配置时段规则SELECT * FROM attribute_kv WHERE entity_id 客户ID AND attribute_key ( SELECT key_id FROM key_dictionary WHERE key 尖峰平谷 );7.2 性能下降问题现象聚合任务执行时间变长 优化方案按客户分批处理-- 先获取客户列表 WITH customers AS ( SELECT DISTINCT customer_id FROM device WHERE id IN ( SELECT entity_id FROM ts_kv WHERE key 98 AND ts BETWEEN ... AND ... ) ) -- 然后逐个客户处理 SELECT put_ts_kv_daily_b_for_customer( CURRENT_DATE - 1, 98, customer_id ) FROM customers;8. 实际应用效果实施该优化后系统性能指标显著提升数据库CPU峰值负载从90%降至35%每日统计任务平均耗时从47分钟缩短到8分钟报表查询响应时间从秒级降到毫秒级某电力公司客户反馈分时段统计准确率从原来的78%提升到99.9%极大提升了他们的电费核算效率。
RELATED

相关推荐

传感器实验报告复现指南:半桥全桥、电子秤定标与差动位移

传感器实验报告复现指南:半桥全桥、电子秤定标与差动位移

简介:面向电子信息、自动化及测控技术等专业学生的传感器实验学习资料,内容为合肥工业大学宣城校区2019级传感器实验报告,可用于实验预习、报告撰写参考与数据处理对照。文档围绕应变式电阻传感器半桥与全桥性能测试展开,并涉及直…

📅 2026/10/31 5:02:37
AI Agent能力扩展:Skill、MCP与插件的三层协同架构

AI Agent能力扩展:Skill、MCP与插件的三层协同架构

1. 一个被严重误解的“三选一”陷阱:为什么AI Agent能力扩展根本不是在Skill、MCP和插件之间做选择我第一次在技术分享会上听到“给Agent加能力,你选Skill、MCP还是插件?”这个问题时,下意识就想举手说“都选”。台下三十多位工程…

📅 2026/10/31 5:02:37
剑指Offer第44题:数字序列中某一位的数字解析

剑指Offer第44题:数字序列中某一位的数字解析

1. 问题背景与需求分析数字序列中某一位的数字是《剑指Offer》中一道经典的数学类算法题,编号为第44题。这道题考察的是对数字规律的观察能力和数学建模能力,在实际面试中经常被用来测试候选人的逻辑思维和边界条件处理能力。题目描述为:数字…

📅 2026/10/31 5:02:37
MORE NEWS

更多资讯

📰

OpenShell 命令行框架实战:命令注册、参数校验与跨语言组合

1. 从零认识 OpenShell:它到底解决什么问题第一次听到 OpenShell 这个名字,很多人会下意识以为它跟某个操作系统内核或者远程终端工具有关。实际上,OpenShell 是一个面向命令行交互场景的开源框架,核心目标是把“人跟机器对话”这…

📰

串联混合动力汽车能量管理与模型预测控制实践

1. 串联混合动力汽车能量管理概述 串联混合动力汽车(Series Hybrid Electric Vehicle, SHEV)作为新能源汽车的重要分支,其能量管理系统的设计直接决定了整车性能和经济性表现。与传统燃油车相比,SHEV的动力系统架构具有显著差异&a…

📰

PostgreSQL并发控制:MVCC与锁机制详解

1. 并发控制的基本概念与PostgreSQL实现 在数据库系统中,并发控制是确保多个事务同时执行时数据一致性的关键技术。PostgreSQL作为一款功能强大的开源关系型数据库,提供了多种并发控制机制来应对不同的业务场景需求。 并发控制主要解决三类问题&#xf…

📰

搜索引擎高级检索的底层逻辑与六大全能语法

1. 这不是“搜索技巧”,而是信息筛选的底层逻辑重构很多人把“高级搜索语法”当成玄学口诀来背:site:、intitle:、filetype:这些符号像咒语一样被反复默念,却始终卡在“搜到了但不是我要的”这个死循环里。我带过不少刚接触信息检索的某高校学…

📰

DirectDraw老源码迁移实战:从编译到双缓冲游戏循环

简介:这份资源是《Windows游戏编程大师技巧(第二版)》配套光盘源码的完整打包,面向有一定C基础、希望系统学习Windows平台游戏开发的中高级读者,可用于对照书中章节动手复现示例、理解底层实现思路。压缩包共收录1035个…

📰

ICU4C 54.1 源码包实战:从编译集成到裁剪优化

简介:这份资源是 ICU4C 54.1 版本的完整 C 源码包,面向需要在 Windows 平台使用 Visual C 编译国际化与 Unicode 支持库的开发者,尤其适合从事跨语言、跨区域应用开发的中高级 C 工程师。压缩包共 4519 个文件,约 25.7MB&#xff…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬