一个过程跑的异常慢而无结果却没有找到原因所在
一个过程跑的异常慢而无结果却没有找到原因所在
昨天有个过程从凌晨0点跑到下午5:30 都没有跑完. 它是个移数据的过程.每一万条移一次.它运行过程中只移动了一次 数据量为5337条.后来观察该Sessin 一直在跑insert int 然后就是delete frm 循环地跑,就是在备份表看不到增加的数据.先介绍下情况: RUN_SENDINF 每天产生100万-200万的数据,也就是INSERT和UPDATE事务量大. 该表存放了3天内的数据,也就是600万.每过一天就把三天前的数据移到历史表中. 发生情况头两天运行半年正常的过程,突然运行失败,主要是ORA-08102: index key not found, obj# 51692, file 6, block 153602 (2).为此 开发人员把RUN_SENDINFO 该了个名 然后新建了个RUN_SENDINFO 把原来RUN里的数据重新分开了移动.而该事第二天过程只跑了1:11分该过程简要说明: 1给大家看的过程是主要部分 2该过程取最大和最小REQID 目的是分批插入 3 REQID值是数字型而且不连续差异很大 也就是最小跟最大之间有上千万,实际数据量也就是200万.CREATE R REPLACE PRCEDURE PR_BAK_SENDINFOinsert int sms_enginee_task_lg(bak,bak_begin_time,date_time) values(1,sysdate,t_char(currDate,'yyyy-mm-dd'));cmmit;ldateTime := sysdate - 3;
ldateTimeStr := t_char(ldateTime,'yyyy-mm-dd') || ' 23:59:59';select NVL(max(reqid),0) int maxId frm RUN_SENDINFO
-- 最大reqidwhere ldate<=t_date(ldateTimeStr,'yyyy-mm-dd HH24:MI:SS');select NVL(min(reqid),0) int minId frm RUN_SENDINFO
-- 最小reqidwhere ldate<=t_date(ldateTimeStr,'yyyy-mm-dd HH24:MI:SS');
status := 1;
tempId := NVL(minId,0);
perN := 10000;
while status = 1
Loop
exit when status = 0;
tempId := tempId + perN; ---每一万条插一次insert into HIS_SENDINFO select * frm RUN_SENDINFO
-- 把数据备份到备份表where reqid<=tempId and ldate<=t_date(ldateTimeStr,'yyyy-mm-dd HH24:MI:SS');delete frm RUN_SENDINFO where reqid<=tempId and ldate<=t_date(ldateTimeStr,'yyyy-mm-dd HH24:MI:SS');cmmit;
-- 删除已备份数据
IF (tempId > maxId) THEN
status := 0;
END IF;
END LP;
-- 任务完成标志
update sms_enginee_task_lg set bak=2,bak_finish_time=sysdate where date_time=t_char(currDate,'yyyy-mm-dd');
cmmit;END PR_BAK_SENDINFO;看它的等待事件:direct path read temp ;latch: cache buffers chains ; latch free 历史等待事件
direct path read temp看它的排序空间: SELECT *
FRM
V$SQL_WRKAREA_ACTIVE WHERE SQL_HASH_VALUE=3267319001 [@more@]
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10748419/viewspace-995684/
,如需转载,请注明出处,否则将追究法律责任。