背景: 这两天有个需求,每天并且每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