溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

不為人知的技術(shù)--Oracle并行異步執(zhí)行存儲(chǔ)過(guò)程

發(fā)布時(shí)間:2020-08-12 10:30:49 來(lái)源:ITPUB博客 閱讀:245 作者:guocun09 欄目:關(guān)系型數(shù)據(jù)庫(kù)

背景:

最近遇到一個(gè)case,Client端程式調(diào)用存儲(chǔ)過(guò)程SP1,過(guò)程SP1執(zhí)行完成后返回結(jié)果到Client。

因?yàn)檫^(guò)程SP1執(zhí)行時(shí)間要5秒鐘,時(shí)間太長(zhǎng)Client用戶無(wú)法接受。

分析主過(guò)程SP1性能,發(fā)現(xiàn)主要是其中調(diào)用的子過(guò)程SP2執(zhí)行需要4秒,且子過(guò)程SP2中一條SQL因?yàn)橘Y料量巨大邏輯復(fù)雜已無(wú)優(yōu)化可能。另外子過(guò)程SP2的主要是計(jì)算審計(jì)功能并記錄日志作用的。


設(shè)想:

能否讓用戶執(zhí)行主過(guò)程時(shí)不等子過(guò)程完成就 直接返回結(jié)果 ,子過(guò)程異步方式在后臺(tái)慢慢的運(yùn)行?

直接通過(guò)Oracle的技術(shù)能否實(shí)現(xiàn)?

答案是可以的,通過(guò)DBMS_JOB.SUBMIT 下面的方法可以實(shí)現(xiàn)。


實(shí)現(xiàn):

創(chuàng)建log表:

CREATE TABLE SFIS1.JOBSUBMIT_LOG
(
  EXE_TIME  DATE,
  DATAX     VARCHAR2(5 BYTE)
)


創(chuàng)建子過(guò)程:

CREATE OR REPLACE PROCEDURE SFIS1.JOB_SUBMIT (DATA3  IN  VARCHAR2)
IS
BEGIN
    IF DATA3='1' THEN
        dbms_lock.sleep(10); --模擬子過(guò)程執(zhí)行10秒需要
        insert into sfis1.jobsubmit_log values(SYSDATE,DATA3);
    ELSE
        insert into sfis1.jobsubmit_log values(SYSDATE,DATA3);
    END IF;
    commit;
EXCEPTION
   WHEN OTHERS
   THEN
    DBMS_OUTPUT.PUT_LINE('FAIL2!');       
END;


創(chuàng)建主過(guò)程:

CREATE OR REPLACE PROCEDURE SFIS1.JOB_SP (DATA1  IN  VARCHAR2,DATA2  IN  VARCHAR2)
IS
   START_TIME   DATE;
   l_job        NUMBER;
BEGIN
   START_TIME := SYSDATE;
   DBMS_OUTPUT.PUT_LINE ('Start Time:' || TO_CHAR (START_TIME, 'YYYY-MM-DD-HH24:MI:SS'));
   DBMS_JOB.submit (l_job, 'SFIS1.JOB_SUBMIT('||data1||');');
   DBMS_JOB.submit (l_job, 'SFIS1.JOB_SUBMIT('||data2||');');
   COMMIT;
   DBMS_OUTPUT.PUT_LINE ('Elapsed Time:' || CEIL ( (SYSDATE - START_TIME) * 24 * 60 * 60)); --計(jì)算主過(guò)程運(yùn)行總時(shí)間
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.PUT_LINE ('FAIL!');
END;


執(zhí)行主過(guò)程:

exec SFIS1.JOB_SP('1','2');

結(jié)果:

Start Time:2019-06-04-10:11:12
Elapsed Time:0 --執(zhí)行時(shí)間0秒,說(shuō)明子過(guò)程已經(jīng)異步在后臺(tái)執(zhí)行了,主過(guò)程并沒(méi)有等待子過(guò)程執(zhí)行完成

查詢log表:

select * from sfis1.jobsubmit_log;

2019/6/4 10:11:13     2
2019/6/4 10:11:23     1   --進(jìn)一步說(shuō)明子過(guò)程異步在后臺(tái)執(zhí)行


以上,主要通過(guò) DBMS_JOB.SUBMIT 并行異步后臺(tái)執(zhí)行存儲(chǔ)過(guò)程。

本文使用技術(shù)主要參考Tom大師:

https://asktom.oracle.com/pls/asktom/asktom.search?tag=execute-procedures-concurently-in-a-procedure
 


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI