存储过程 动态sql 将动态列名作为变量传值

本文探讨了一个从Elasticsearch获取车辆状态数据并存储到数据库的问题。初始方案中,更新大量数据耗时过长。于是采用两表对比的存储过程方案,但执行速度仍然慢。最终通过添加索引显著提高了效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        背景: 这两天有个需求,每天并且每10分钟从es取一次数据(每次大概五万多条车辆数据),每台车有veh,vom两字段,vom为车辆状态信息(会改变),每十分钟都要记录一次车辆状态,将此信息存在数据库的veh_state表里面。

再将这些数据用echarts表现出来(后话)。

所以,数据库表的列名定为:veh,date,vom1,vom2,vom3,vom4....vom144;(vom1是凌晨0:00,vom2是0:10...直到 vom144是23:50)。

         方案一:

第一次从es取出数据后,直接存到veh_state里面,有数据的列是veh,date,vom1,第二次取es的数据时(凌晨0:20),做更新操作,将vom2这列的数据update到veh_state里面。

问题是每次五万多条数据做更新,无论是一次性提交还是分批次(500条/次)提交,耗时都在十分钟左右,这肯定是不行的。

        方案二:

建两个表,正式表veh_state和临时表veh_state_temp,每次从es查的数据都往veh_state_temp插入,包括第一次。然后写个存储过程,每次用veh_state_temp和veh_state做比对,veh和date字段都相同的,则更新这条数据的vom?状态,如果veh不存在且date字段相同(说明当天这次从es查的数据比上次查的数据多了几条车辆数据),则插入这条数据。最后再删除veh_state_temp临时表的数据。

临时表veh_state_temp的字段就没有144个vom,只有veh,date,vom三个字段。(这里万分感谢公司范姓大佬)

存储过程:

create or replace procedure P_ES
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值