当前位置: 代码迷 >> Oracle开发 >> 请问oracle中select * from 某个存储过程时速度很慢的有关问题
  详细解决方案

请问oracle中select * from 某个存储过程时速度很慢的有关问题

热度:124   发布时间:2016-04-24 06:35:56.0
请教oracle中select * from 某个存储过程时速度很慢的问题。

流程是:首先导入一些5000条左右的hphm到cph_tmp表中,然后执行存储过程P_QUERY_CAR,存储过程P_QUERY_CAR会获取cph_tmp表中的数据,然后 进行一些过程的执行,执行完毕后,存储过程P_QUERY_CAR会将数据导入到tmp_query_car表中, 之后对tmp_query_car表进行select * from tmp_query_car 或者 delete from tmp_query_car时 速度很慢,需要800多秒,  起初查询的速度 都在几秒之内,现在查询这个存储过程需要800多秒,一时搞不通到底是哪个环节出现了问题,请教大咖们,怎么才能提高对tmp_query_car表DML操作的速度?

存储过程名为P_QUERY_CAR:
create or replace procedure P_QUERY_CAR is
  v_pname varchar2(100) default 'P_QUERY_CAR';
  v_ecode varchar2(50);
  v_error varchar2(2000);

  --主程序
begin
  P_LOG(v_pname, 'INFO', 'START', 'P_QUERY_CAR');

  for rs in (select hphm from cph_tmp) loop
    begin
      insert into tmp_query_car
        (hphm, cpys, jcsj, ddms)
        select /*+index(v idx_tt_veh_hphm)*/
         v.hphm, v.cpys, v.jcsj,d.ddms
          from tt_vehicle_t v, tt_device_t d
         where v.hphm = rs.HPHM
           and v.jcsj between
               to_date('2014-09-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') and
               to_date('2014-09-30 23:59:59', 'yyyy-mm-dd hh24:mi:ss')
               and v.sbbh = d.sbbh;
               --and v.dmbh in (select d.dmbh from d_jcddm_t d where instr(d.hldm, '22') > 0);
               --and v.sbbh in ('TT001258','TT001259','JGJ30548','JGJ30546','JGJ30549');

      commit;
    exception
      when others then
        rollback;
    end;
  end loop;

  commit;
  P_LOG(v_pname, 'INFO', 'STOP', 'P_QUERY_CAR');
exception
  when others then
    rollback;
    --记录错误信息
    v_ecode := substr(sqlcode, 1, 50);
    v_error := substr(sqlerrm, 1, 2000);
    P_LOG(v_pname, 'ERROR', v_ecode, v_error);
end P_QUERY_CAR;



cph_tmp表:
Name Type         Nullable Default Comments 
---- ------------ -------- ------- -------- 
HPHM VARCHAR2(20) 



tmp_query_car表:
Name Type          Nullable Default Comments 
---- ------------- -------- ------- -------- 
HPHM VARCHAR2(20)  Y                         
CPYS VARCHAR2(10)  Y                         
JCSJ TIMESTAMP(6)                            
DDMS VARCHAR2(100) Y  

------解决思路----------------------
频繁用delete删除容易造成高水位,delete之后数据虽然没有了,但占用的空间还在
如果删除临时数据时是全表删除的话,建议使用truncate进行清除,这样直接就能把水位降到0了

------解决思路----------------------
1.  tt_vehicle_t v, tt_device_t  这两张表的数据是否很大?
2. 手动收集一下统计信息。
3. 版主所言极是。 1#
  相关解决方案