不為人知的技術--Oracle並行非同步執行儲存過程
背景:
最近遇到一個case,Client端程式呼叫儲存過程SP1,過程SP1執行完成後返回結果到Client。
因為過程SP1執行時間要5秒鐘,時間太長Client使用者無法接受。
分析主過程SP1效能,發現主要是其中呼叫的子過程SP2執行需要4秒,且子過程SP2中一條SQL因為資料量巨大邏輯複雜已無最佳化可能。另外子過程SP2的主要是計算審計功能並記錄日誌作用的。
設想:
能否讓使用者執行主過程時不等子過程完成就 直接返回結果 ,子過程非同步方式在後臺慢慢的執行?
直接透過Oracle的技術能否實現?
答案是可以的,透過DBMS_JOB.SUBMIT 下面的方法可以實現。
實現:
建立log表:
CREATE TABLE SFIS1.JOBSUBMIT_LOG ( EXE_TIME DATE, DATAX VARCHAR2(5 BYTE) )
建立子過程:
CREATE OR REPLACE PROCEDURE SFIS1.JOB_SUBMIT (DATA3 IN VARCHAR2) IS BEGIN IF DATA3='1' THEN dbms_lock.sleep(10); --模擬子過程執行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;
建立主過程:
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)); --計算主過程執行總時間 EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE ('FAIL!'); END;
執行主過程:
exec SFIS1.JOB_SP('1','2');
結果:
Start Time:2019-06-04-10:11:12
Elapsed Time:0 --執行時間0秒,說明子過程已經非同步在後臺執行了,主過程並沒有等待子過程執行完成
查詢log表:
select * from sfis1.jobsubmit_log;
2019/6/4 10:11:13 2
2019/6/4 10:11:23 1 --進一步說明子過程非同步在後臺執行
以上,主要透過
DBMS_JOB.SUBMIT
並行非同步後臺執行儲存過程。
本文使用技術主要參考Tom大師:
https://asktom.oracle.com/pls/asktom/asktom.search?tag=execute-procedures-concurently-in-a-procedure
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25583515/viewspace-2646686/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 執行Sybase儲存過程並返回ResultSet儲存過程
- oracle 如何終止儲存過程的執行Oracle儲存過程
- 行為儲存過程(23)儲存過程
- Oracle:建立JOB定時執行儲存過程Oracle儲存過程
- 儲存過程中巢狀儲存過程的變數執行方式儲存過程巢狀變數
- oracle 執行儲存過程 ora00131Oracle儲存過程
- 檢視正在執行的儲存過程儲存過程
- /*動態執行儲存過程DEMO*/儲存過程
- oracle 儲存過程執行報錯ORA-12828Oracle儲存過程
- 利用oracle儲存過程執行作業系統命令Oracle儲存過程作業系統
- Oracle中執行儲存過程call和exec區別Oracle儲存過程
- 使用ADO執行儲存過程 (轉)儲存過程
- 使用Command執行儲存過程 (轉)儲存過程
- 【Database】Oracle10g檢視正在執行的儲存過程DatabaseOracle儲存過程
- oracle儲存過程(procedure)中執行動態SQL小記Oracle儲存過程SQL
- 程式執行緒、同步非同步、阻塞非阻塞、併發並行執行緒非同步並行
- 儲存過程執行EXECUTE IMMEDIATE沒反應儲存過程
- [MSSQL]sql 儲存過程定時執行方法SQL儲存過程
- 儲存過程中檢視sql執行計劃的方法儲存過程SQL
- 通過v$access檢視正在執行的儲存過程procedure儲存過程
- 在.NET中用儲存過程執行SQL語句儲存過程SQL
- oracle的Parallel 並行技術OracleParallel並行
- oracle的儲存過程Oracle儲存過程
- Oracle資料庫學習之儲存過程--提高程式執行的效率Oracle資料庫儲存過程
- 為開發人員編寫每天凌晨2點執行一個儲存過程_dbms_job儲存過程
- Oracle DDL 執行過程Oracle
- openGauss儲存技術(一)——行儲存引擎儲存引擎
- 如何查詢一個儲存過程是否在執行儲存過程
- 應用儲存過程執行報錯解決方案儲存過程
- DBMS_PROFILER 檢視儲存過程執行時間儲存過程
- Oracle開發人員 JAVA儲存過程OracleJava儲存過程
- 從sybase的儲存過程轉向oracle的儲存過程儲存過程Oracle
- 執行緒,程式,協程, 併發,並行,同步,非同步概念解析執行緒並行非同步
- Oracle儲存過程Oracle儲存過程
- 【Oracle】-【show_space和show_space_asm】-執行儲存過程報錯OracleASM儲存過程
- 儲存過程結果進行查詢 select 存過過程儲存過程
- 對執行緒、協程和同步非同步、阻塞非阻塞的理解執行緒非同步
- 為何我不喜歡使用儲存過程儲存過程