赞
踩
请教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#
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。