技術交流

HCP 人力資產規劃系統:資料平行處理小技巧

Oracle Database Job

在 Oracle Database 中有一個稱為 Job 的功能,能夠讓資料庫新增一個 session 去執行指定的 store procedure 或一段 pl/sql,同時也可以指定執行的時間及週期,而使用 Job 的程序名稱是 sys.dbms_job.submit()

一般要執行程式時,使用者第一步需要先連線至資料庫,再呼叫資料庫中的 store procedure 來執行,且在執行的過程中一旦使用者離線或斷線,未存檔的資料會被回溯至未執行前。若使用者把要執行的 store procedure 透過 sys.dbms_job.submit() 送出到資料庫,則會變成由資料庫去呼叫要執行的 store procedure,送出後使用者若因任何原因離線或斷線,只要資料庫仍正常運作,程序就會繼續執行到結束並自動儲存資料。

使用 sys.dbms_job.submit() 送出 Job 的方式與呼叫 store procedure 一樣,至少要給兩個參數,第一個參數是接回該 Job 的號碼(由資料庫取號),第二個參數是傳入需要執行的 pl/sql 或直接呼叫資料庫的 store procedure,下圖即是該程式主要參數的說明。

dbms_job.submit() 主要參數的說明

資料平行處理

資通電腦 HCP(Human Capital Planner;人力資產規劃系統)的架構中,會將主要的計算邏輯程式以最小單位來進行設計。

以薪資模組的薪資結算作業來說,為了在操作畫面上可以用部門或員工代號等參數去篩選要計算的資料,篩選條件則要控制在最外一層,而內層計算邏輯則是一次計算一個員工,算完第一個員工後,回到外層抓第二個員工再進行計算,最小單位就是員工,主要計算邏輯也只有一種。

僅能執行一個工作時

然而對於人數較多或資料龐大的公司,在進行薪資結算作業時,若程式仍然按照這個流程進行時,就會從第一個員工按排序算到最後一個員工,且資料量是倍數成長(1 人 10 筆資料,1,000 人就是 10,000 筆資料),所耗費的時間則會以級數增加。

迴圈
1000 個員工須迴圈 1000 次,每次迴圈都要從 10000 筆資料中,找出屬於該員工的 10 筆資料,程式的總判斷次數將達到一千萬次(1000 * 10000)

可同時執行兩個工作時

但以薪資結算的模式來說,不同員工之間的資料其實是互不相關,也沒有先後順序的問題,故嘗試採用平行處理的概念。透過 Oracle 資料庫的 Job 功能,在開始進行薪資結算作業之前,將 1,000 人的資料拆成 500 人 + 500 人,送出兩個 Job 由資料庫去同時執行。

迴圈
若拆成 500 個員工各迴圈 500 次,每次迴圈只從 5000 筆資料中,找出屬於該員工的 10 筆資料,程式的總判斷次數可降低到五百萬次(500 * 5000 * 2),加上分成兩個迴圈同時執行,從開始到結束所需時間則為判斷兩百五十萬次的時間

根據實際測試後可以將時間壓縮到原本的 60% 左右,且人數與資料量越龐大,效果越是明顯。此方式並非直接改善程式效能,而是利用更多的硬體資源縮短執行時間,仍會受限於作業系統可同時執行的工作數量。但以現今的硬體規格,應至少能多利用到一個核心以上的計算能力。

資通 HCP 彈性高、操作容易,能協助人資快速完成每月結薪作業,促進企業營運管理,效率加倍!

閱讀更多