INSERT INTO sy_api_c_meter (task_id, meter_id, .... .) SELECT in_task_id, meter_id,.. .. FROM c_meter a, c_mp b, c_meter_mp_rela c WHERE a.meter_id = c.meter_id AND b.mp_id = c.mp_id AND b.cons_id = v_cons_id AND b.org_no = v_org_no
上面的sql中select 查询语句没有性能问题,分区条件和索引都能走上,但是在一起执行insert 时就会很卡。这是刚开始写过程时会犯的错误。应该使用游标,修改结果如下:
FOR cur IN (SELECT c.meter_id FROM c_mp b, c_meter_mp_rela c WHERE b.mp_id = c.mp_id AND b.cons_id = v_cons_id AND b.org_no = v_org_no) LOOP INSERT INTO sy_api_c_meter (task_id, meter_id, inst_loc,....) SELECT in_task_id, meter_id, .... FROM c_meter a WHERE a.meter_id = cur.meter_id; END LOOP;
在实际操作中对表数据的批量操作,循环操作的速度要快很多。