不為人知的技術--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大師:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25583515/viewspace-2646686/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle的儲存過程Oracle儲存過程
- Oracle儲存過程Oracle儲存過程
- 程式執行緒、同步非同步、阻塞非阻塞、併發並行執行緒非同步並行
- openGauss儲存技術(一)——行儲存引擎儲存引擎
- Oracle儲存過程-1Oracle儲存過程
- Oracle ASM Rebalance執行過程OracleASM
- Oracle儲存過程乾貨(一):儲存過程基礎Oracle儲存過程
- Sqlsugar呼叫Oracle的儲存過程SqlSugarOracle儲存過程
- 如何查詢一個儲存過程是否在執行儲存過程
- 應用儲存過程執行報錯解決方案儲存過程
- 執行緒,程式,協程, 併發,並行,同步,非同步概念解析執行緒並行非同步
- 原創:oracle 儲存過程Oracle儲存過程
- 對執行緒、協程和同步非同步、阻塞非阻塞的理解執行緒非同步
- 透過一個示例形象地理解C# async await 非並行非同步、並行非同步、並行非同步的併發量控制C#AI並行非同步
- 程式與執行緒、同步與非同步、阻塞與非阻塞、併發與並行執行緒非同步並行
- oracle儲存過程書寫格式Oracle儲存過程
- LightDB/PostgreSQL 相容Oracle儲存過程SQLOracle儲存過程
- MySQL 儲存過程進行切換表MySql儲存過程
- all許可權使用者無法執行儲存過程儲存過程
- 深入解讀MySQL InnoDB儲存引擎Update語句執行過程MySql儲存引擎
- oracle儲存過程和觸發器Oracle儲存過程觸發器
- Oracle 儲存過程分頁 + Sqlsugar呼叫Oracle儲存過程SqlSugar
- Springboot呼叫Oracle儲存過程的幾種方式Spring BootOracle儲存過程
- 儲存過程WHERE條件不生效儲存過程
- jsp的執行過程JS
- 指令的執行過程
- 非同步/同步,阻塞/非阻塞,單執行緒/多執行緒概念梳理非同步執行緒
- iOS執行緒、同步非同步、序列並行佇列iOS執行緒非同步並行佇列
- Oracle“並行執行”——監控檢視Oracle並行
- 執行緒池建立執行緒的過程執行緒
- Oracle資料庫SQL語句執行過程Oracle資料庫SQL
- ibatis呼叫oracle儲存過程(極簡版)BATOracle儲存過程
- 【Oracle】儲存過程中將動態SQL的多行結果進行迴圈遍歷Oracle儲存過程SQL
- Oracle儲存過程中跳出迴圈的寫法Oracle儲存過程
- Oracle儲存過程編譯卡死的解決方法Oracle儲存過程編譯
- webpack loader 的執行過程Web
- Redis 命令的執行過程Redis
- .Net執行SQL/儲存過程之易用輕量工具SQL儲存過程