有如图的两个表。从A表中找到每一个ds_code对应的rec_num的最大值和表B中此ds_code对应的rec_num的最大值相比较如果表A的rec_num大于或者等于表B的rec_num,就把最大值所在的记录插入到B表中。如果表A中存在表B中没有的ds_code则把表A中此ds_code对应rec_num最大值所在记录直接插入表B。由于A表的ds_code种类太多(大概有12万左右,A表中的记录大约有2200万条),我写了一个存储过程把ds_code当作参数传入存储过程判断是否符合条件然后插入表B。表A中的数据每天都会更新,所以表B的数据也要每天更新。我现在是用shell配合存储过程实现表B的自动更新。从表A中得到ds_code(大约12万个) 然后做成调用存储过程的语句即call dataset_maxnumber_load_procedure()(大约12万行)。但是这样每次花费的时间太长。每次的执行时间大约需要20分钟。大家帮我看看有没有其他方法能提高运行效率或者有没有其他写法能达到同样的目的。
create procedure dataset_maxnumber_load_procedure(IN dscode varchar(50))
begin
declare number_recnum double;
declare maxnumber_recnum double;
set number_recnum=(select max(cast(rec_num as signed)) from dataset_number_table where ds_code= dscode);
set maxnumber_recnum=(select max(cast(rec_num as signed)) from dataset_maxnumber_table where ds_code= dscode);

if(maxnumber_recnum is null or number_recnum > maxnumber_recnum or number_recnum = maxnumber_recnum) then
insert ignore into dataset_maxnumber_table select * from dataset_number_table
where rec_num = number_recnum
and ds_code = dscode order by exert_date;
end if;
end;call dataset_maxnumber_load_procedure("A001");

解决方案 »

  1.   

    @zhu19774279 @ACMAIN_CHM
      

  2.   

    这样的话插入a的数据是不是也要拿出来一条条对比以后才能插入b,每天插入a的数据是12万左右。
      

  3.   

    楼主对于问题和环境给得不是很具体,
    先从思路上聊聊吧。1 这是一个典型的增量处理,无论A表有少数据,每天更新或插入的只有12万。
    所以,如果index能比较高效地做的话,就index;
    如果效率低,那么用date的partition或者单独拿一张表先存下来,接着再分别放进A表和B表2 对于B表的更新是一个插入或更新的问题。
    所以,如果逻辑复杂,可以用procedure做;如果逻辑简单,用replace into效率应该更高,也更容易利用高级特性调优。
    12万件的插入/更新对于一个sql来说并不是太大,undo和表本身应该都可以支撑,所以这个问题是OK的。
    判断最大值的逻辑也不复杂。接下来,只要12万件数据里,大部分是需要更新的数据,就值得用replace into来试试。