oracle的一個存盤程序放在job中自動執行效率很慢,幾秒鐘處理一條記錄,如果放到plsql中或者sqlplus中去執行速度很快,1萬條記錄大約在20秒鐘;
資料庫時oracle12c,rac環境,兩個節點,服務器記憶體有32g,cpu多核心的,服務器及配置上應該沒有問題,沒有死鎖,open_cursor設定為1000,配置如下:


我需要每分鐘執行一次這個存盤程序,但是現在每次執行都需要好長時間,處理的資料量也不是很大。
系統在oracle10g/11g下面都很正常,就是12c的rac環境下這樣,實在是不知道什么原因。
哪位高人指點下,不勝感激。
uj5u.com熱心網友回復:
記憶體32g有點少哦,一般都在128g以上~uj5u.com熱心網友回復:
發下你存盤程序,看下代碼如何?uj5u.com熱心網友回復:
PROCEDURE autoprocuploadconsumerecAS
out_msg VARCHAR2 (1000);
out_result NUMBER;
vplanstoptime VARCHAR2 (128);
vcount NUMBER;
visbalance NUMBER;
n_opcount NUMBER;
n_oddfare NUMBER;
n_subopcount NUMBER;
n_suboddfare NUMBER;
CURSOR c1
IS
SELECT *
FROM ( SELECT *
FROM t_xfjla
ORDER BY a.id)
WHERE ROWNUM < 800;
BEGIN
out_msg := '';
dbms_output.put_line( 'START PROCESS _CONSUME'|| to_char(SYSTIMESTAMP,'yy-mm-dd hh24:mi:ss:ff3') );
FOR c1_rec IN c1
LOOP
SELECT NVL (COUNT (*), 0)
INTO vcount
FROM base_customers a
WHERE a.customerid = c1_rec.customerid
AND a.dpid = c1_rec.dpid;
--如果為正式賬戶,則鎖住base_customers表中的行
IF vcount > 0
THEN
SELECT a.opcount,
a.oddfare,
a.subopcount,
a.suboddfare
INTO n_opcount,
n_oddfare,
n_subopcount,
n_suboddfare
FROM base_customers a
WHERE a.customerid = c1_rec.customerid
AND a.dpid = c1_rec.dpid
FOR UPDATE OF
a.opcount, a.oddfare, a.subopcount, a.suboddfare skip locked ;
END IF;
SELECT NVL (COUNT (*), 0)
INTO vcount
FROM rec_writeoff a
WHERE a.customerid = c1_rec.customerid
AND a.dpid = c1_rec.dpid;
pkg_rec_cust_acc.processconsumerec (c1_rec.customerid,
out_msg,
out_result);
--記錄處理成功,洗掉上傳記錄
DELETE rec_upload_consume
WHERE id = c1_rec.id;
dbms_output.put_line( 'END PROCESS REC_UPLOAD_CONSUME'|| to_char(SYSTIMESTAMP,'yy-mm-dd hh24:mi:ss:ff3') );
COMMIT;
END LOOP;
EXCEPTION
WHEN OTHERS
THEN
ROLLBACK;
out_msg := out_result || '_' || out_msg || '_' || SQLERRM;
out_result := -1;
dbms_output.put_line( 'proceupdateoldflag' || OUT_MSG || to_char(SYSTIMESTAMP,'yy-mm-dd hh24:mi:ss:ff3') );
END;
我用的exec dbms_scheduler做的job自動1分鐘執行一次,目前每次總超過1分鐘,plsql中執行速度很快
uj5u.com熱心網友回復:
記憶體好像是96g,足夠用了uj5u.com熱心網友回復:
job執行的時候,看看有沒有鎖,看看v$session_wait有什么等待事件uj5u.com熱心網友回復:
一分鐘執行一次為什么還要一條條記錄執行,直接一批執行不就好啦?而且你這種沒加監控時間,你自己都不知道你這個sql執行那一步比較慢uj5u.com熱心網友回復:
id 有索引沒有,加個索引看看! base_customers 查詢慢步 ,和 pkg_rec_cust_acc.processconsumerec 又是什么程序, FOR UPDATE OF 不用可以不,加個日志運行記錄臨時表分段記錄記錄時間為毫秒,看看運行到哪個代碼段慢了,就分析一下!轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/80544.html
標籤:高級技術
