益和热力性能优化实践:从 SQL Server 到 TDengine 时序数据库,写入快 20 秒、查询提速 5 倍

小T导读:在数字化转型浪潮下,各行业都在积极探索如何利用先进技术提升运营效率与服务质量。供热行业也不例外,大量的热力数据亟待高效处理与分析。安阳益和热力集团有限公司(以下简称 “益和热力”)作为安阳市城市集中供热的关键力量,选择了 TDengine TSDB 作为其热力数据处理的基础时序数据库,成功应对了大规模数据挑战,实现了供热业务的数字化升级。本文将深入剖析益和热力采用 TDengine TSDB 的背景、痛点,以及 TDengine TSDB 在其业务中的落地实践成果。

背景和痛点

作为城市热力保障的核心单位,益和热力负责全市市政热力管网的建设与维护、小区热力设施的维护维修以及用户冬季采暖管理等诸多工作。随着智慧供热理念的推进,为提升智慧供热应用系统的效率,其决定将热力站和用户数据接入汇聚存储,并集中部署在中心侧。然而,在供暖期间,数据量呈现出急剧增加的态势。大量的实时数据从各个热力站和用户端不断涌入,给数据库的存储和处理能力带来了巨大压力。

传统数据库在应对如此大规模、持续增长的数据时,往往难以保持稳定:随着数据量的不断攀升,写入速度逐渐下降,查询响应也越来越慢,不仅影响了对供热系统运行状态的实时监测,也阻碍了基于数据分析进行的供热调度优化和故障预警等工作。例如,在使用 SQL Server 时,数据落盘速度缓慢,严重制约了数据处理效率。面对这样的挑战,益和热力迫切需要一款性能稳定、能够高效处理海量数据的新型数据库。

TDengine TSDB 的落地实践

在智慧供热系统建设中,TDengine TSDB 凭借强大的性能和灵活的架构,在数据写入、查询与存储等核心环节展现出显著优势,全面提升了益和热力的数字化管理水平。

为了验证不同数据库在大规模数据场景下的性能差异,我们对原有的 SQL Server 与 TDengine TSDB 进行了多维度测试与对比。结果显示,TDengine 在写入速度、查询响应、存储效率及系统资源占用等方面均表现出显著优势。

下表展示了传统方案与 TDengine TSDB 在核心性能指标上的对比情况:

​​指标​​​​传统方案(SQL Server)​​​​TDengine TSDB方案​​​​提升效果​​
数据写入7万条/21秒7万条/1秒​​提速6.7倍​​
历史数据查询响应时间6秒(1个月数据)<1秒​​提速5倍以上​​
存储空间占用(4年数据)950GB77GB​​节省92%空间​​
服务器数量4台1台​​减少75%硬件成本​​
实时数据延迟分钟级秒级​​响应效率提升90%​

1. 极速数据写入,突破效率瓶颈

益和热力的众多热力站和用户端设备持续产生大量的实时热力数据,包括温度、压力、流量等。TDengine TSDB 采用创新的存储引擎设计,结合异步 IO、内存缓存批量落盘等优化技术,实现了惊人的数据写入速度。在实际应用中,TDengine TSDB 每秒可写入约 70,000 条记录,相比之前使用的 SQL Server,缩短了近 20 秒 。这一提升不仅确保了我们的热力数据能够及时、准确地入库,更为后续的实时分析和决策提供了坚实的数据基础,彻底解决了传统数据库写入缓慢的痛点。

2. 高效数据查询,赋能实时决策

在供热运营过程中,我们的工作人员需要快速查询和分析大量热力数据,以掌握供热系统的实时运行状况。TDengine TSDB 支持标准 SQL 查询,并针对时序数据特性进行深度优化,大幅提升了查询效率。以查询往年一个月的设备历史数据为例,使用 TDengine TSDB 后,数据呈现时间从原来的近 6 秒缩短至 1 秒内,查询速度提升了近 5 倍

工作人员可通过简单的 SQL 语句,快速获取特定时间段、区域的热力数据,并进行平均温度计算、流量变化趋势分析等操作,及时发现如管道故障、供热不足等异常情况,为供热调度和故障处理争取宝贵时间,显著提升了运营决策的及时性和准确性。

  • 供回水温运行趋势:
益和热力性能优化实践:从 SQL Server 到 TDengine 时序数据库,写入快 20 秒、查询提速 5 倍 - TDengine Database 时序数据库

  • 对应的查询 SQL 语句:
益和热力性能优化实践:从 SQL Server 到 TDengine 时序数据库,写入快 20 秒、查询提速 5 倍 - TDengine Database 时序数据库

  • 住户室温历史:
益和热力性能优化实践:从 SQL Server 到 TDengine 时序数据库,写入快 20 秒、查询提速 5 倍 - TDengine Database 时序数据库

  • 对应的查询 SQL 语句
益和热力性能优化实践:从 SQL Server 到 TDengine 时序数据库,写入快 20 秒、查询提速 5 倍 - TDengine Database 时序数据库

3. 极致存储优化,降低资源成本

在存储空间管理上,TDengine TSDB 通过高效的数据压缩算法和灵活的数据模型,实现了存储效率的大幅提升。益和热力保存 4 年左右的数据,使用传统方案时需占用 950GB 磁盘空间,且依赖 4 台数据服务器协同工作;而采用 TDengine TSDB 后,同样时长的数据仅占用 77GB 磁盘空间,数据服务器数量也从 4 台精简至 1 台。这不仅大幅降低了硬件采购和运维成本,还简化了数据管理的复杂度。同时,TDengine TSDB 的高可扩展性支持通过横向扩展轻松应对未来数据增长,为益和热力的长期发展提供了可持续的存储解决方案。

  • 数据库建模如下:
CREATE DATABASE `prod` BUFFER 256 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 1440m WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 1 KEEP 5256000m,5256000m,5256000m PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 10 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0 ENCRYPT_ALGORITHM 'none' S3_CHUNKSIZE 262144 S3_KEEPLOCAL 5256000m S3_COMPACT 0  

建库关键参数设计说明:

  1. DURATION 1440m:设置数据文件的时间跨度为 1 天,按天自动分区,实现结构化管理。在查询同一天数据时,可直接定位至对应文件组,有效减少磁盘 I/O 扫描,提高查询效率。
  2. VGROUPS 10:针对热力生产高并发写入场景,配置 10 个 vnode,并将子表均匀分布其中,实现数据分片。在检索时能够快速定位数据块,缩小读取范围,从而加快查询响应。
  • 超级表建模如下:
taos> desc dat_hscon_his;
             field              |          type          |   length    |    note    |
=====================================================================================
 gettime                        | TIMESTAMP              |           8 |            |
 conversion                     | INT                    |           4 |            |
 paramstate                     | INT                    |           4 |            |
 debugparamstate                | INT                    |           4 |            |
 tempremote                     | FLOAT                  |           4 |            |
 tempoutdmode                   | INT                    |           4 |            |
 protocolversion                | INT                    |           4 |            |
 targetvalueval                 | FLOAT                  |           4 |            |
 targetvaluepump                | FLOAT                  |           4 |            |
 cmdcntcollect                  | INT                    |           4 |            |
 cmdcntctrl                     | INT                    |           4 |            |
 cmdcntdebug                    | INT                    |           4 |            |
 dccommstate                    | INT                    |           4 |            |
 tempoutd                       | FLOAT                  |           4 |            |
 tempup                         | DOUBLE                 |           8 |            |
 tempret                        | DOUBLE                 |           8 |            |
 tempdiff                       | DOUBLE                 |           8 |            |
 firflowsum                     | DOUBLE                 |           8 |            |
 pressup                        | DOUBLE                 |           8 |            |
 pressret                       | DOUBLE                 |           8 |            |
 presdiff                       | DOUBLE                 |           8 |            |
 instflowsumret                 | DOUBLE                 |           8 |            |
 flowsumret                     | DOUBLE                 |           8 |            |
 instflowsumup                  | DOUBLE                 |           8 |            |
 instflowmuw                    | DOUBLE                 |           8 |            |
 instflowmuw2                   | DOUBLE                 |           8 |            |
 instheatsum                    | DOUBLE                 |           8 |            |
 heatsum                        | DOUBLE                 |           8 |            |
 createtime                     | TIMESTAMP              |           8 |            |
 sourceconid                    | NCHAR                  |          20 | TAG        |
Query OK, 30 row(s) in set (0.214752s)


taos> desc dat_hshmeter_his;
             field              |          type          |   length    |    note    |
=====================================================================================
 gettime                        | TIMESTAMP              |           8 |            |
 suptemp                        | DOUBLE                 |           8 |            |
 rettemp                        | DOUBLE                 |           8 |            |
 accflow                        | DOUBLE                 |           8 |            |
 instflow                       | DOUBLE                 |           8 |            |
 accheat                        | DOUBLE                 |           8 |            |
 instheat                       | DOUBLE                 |           8 |            |
 errorcode                      | INT                    |           4 |            |
 commstate                      | INT                    |           4 |            |
 commnum                        | INT                    |           4 |            |
 createtime                     | TIMESTAMP              |           8 |            |
 sourceconid                    | NCHAR                  |          20 | TAG        |
 meterid                        | INT                    |           4 | TAG        |
Query OK, 13 row(s) in set (0.095740s)

taos> desc dat_hes_wmeter_his;
             field              |          type          |   length    |    note    |
=====================================================================================
 gettime                        | TIMESTAMP              |           8 |            |
 conname                        | NCHAR                  |          30 |            |
 janespell                      | NCHAR                  |          20 |            |
 stationid                      | NCHAR                  |          11 |            |
 stationname                    | NCHAR                  |          30 |            |
 instflow                       | DOUBLE                 |           8 |            |
 metervalue                     | DOUBLE                 |           8 |            |
 commstate                      | INT                    |           4 |            |
 instflow_h_alarm               | INT                    |           4 |            |
 commnum                        | INT                    |           4 |            |
 createtime                     | TIMESTAMP              |           8 |            |
 conid                          | NCHAR                  |          11 | TAG        |
 meterid                        | INT                    |           4 | TAG        |
Query OK, 13 row(s) in set (0.107796s)

4. 全栈能力整合,简化系统架构

除核心性能优势外,TDengine TSDB 还将数据库、消息队列、缓存和流式计算等功能深度融合,构建出全栈式的时序数据处理引擎。在益和热力的智慧供热系统中,无需再集成 Kafka、Redis 等多种软件,极大简化了系统架构,降低了应用开发和维护的复杂度。例如,利用 TDengine TSDB 的缓存功能我们可快速获取每条时间线的最新数据,结合其流式计算能力,工作人员能够实时处理和分析热力数据,及时发现异常并预警,为供热系统的智能化管理提供了一站式解决方案。

益和热力性能优化实践:从 SQL Server 到 TDengine 时序数据库,写入快 20 秒、查询提速 5 倍 - TDengine Database 时序数据库

引入 TDengine TSDB 企业版后,我们的数据存储和查询效率有了明显提升,系统运行也更加稳定。这套方案让数字化管理更加完善,不仅为安阳城市供热的稳定运行提供了可靠支撑,也为我们的智慧供热系统的持续发展奠定了坚实的基础。

下一步规划

基于 TDengine TSDB 在智慧供热系统中的成功应用,接下来我们将进一步深化数据驱动的业务模式,围绕技术融合、功能拓展与服务升级制定以下发展规划:

  • 构建智能预测体系:依托 TDengine TSDB 汇聚的海量历史与实时数据基础,我们计划引入 TDengine IDMP 的 “无问智推” 功能。系统能够基于用户数据自动生成行为分析报告和可视化看板,不再需要人工查询或复杂分析,就能快速洞察用户的用热习惯和需求变化,为决策和服务优化提供更有价值的参考。
  • 设备健康管理升级:基于 TDengine TSDB 强大的时序数据分析能力,我们计划建设设备故障预测与健康管理系统。通过实时监测设备运行参数,系统可以提前识别潜在故障风险,实现从被动维修到主动维护的转变,降低设备故障率与运维成本。
  • 搭建智慧服务平台:我们也在规划基于 TDengine TSDB 的数据处理能力,打造面向终端用户的移动端 App 与 Web 平台。用户可以实时查看室温、用热账单,提交故障报修,真正享受一站式服务体验。结合大数据分析,系统还将智能推送节能用热建议,让供热服务更加精准、高效。

未来,益和热力将持续以 TDengine TSDB 为数据基石,不断探索创新应用模式,加速智慧供热生态建设,为推动供热行业的数字化、智能化转型贡献标杆经验。

作者 | 梁文龙

关于安阳益和热力

安阳益和热力集团有限公司主要职能是负责安阳市城市建成区内集中供热的特许经营和管理服务工作。益和热力公司集中供热托管经营、供热咨询设计、供热工程建设、供热材料生产供应、供热自动化运行、供热系统外销、供热专业维修服务、供热节能降耗和新能源开发利用于一体,具备全产业链集团化运作模式;实现了集中供热人才外输、产品外销、经验外传、品牌外树,为豫北乃至北方地区供热建设持续发展的典范。