傳統上,定時任務常交由作業系統處理(如 Linux crontab、Windows 排程器)。但對於「大量資料表操作」(如證券收盤結算、每日備份、資料清洗),OS 層級排程存在三大痛點:
Oracle Job Queue(任務佇列) 正是為了解決這些問題而生。它在資料庫核心層執行,由 SNP 背景程序 驅動,具備高效能、彈性排程、失敗重試與監控等企業級特性。
SNP 進程僅在「非受限模式」下啟動。以 SYSDBA 身分執行:
SQL> ALTER SYSTEM DISABLE RESTRICTED SESSION;
註:舊版文獻常見 svrmgrl 工具,9i 後已整合入 SQL*Plus。
| 參數 | 說明 | 預設值 | 建議範圍 |
|---|---|---|---|
job_queue_processes | SNP 進程啟動個數(並行作業數) | 0 | 0~36(視作業量調整) |
job_queue_interval | SNP 喚醒檢查間隔(秒) | 60 | 1~3600(高頻作業可調小) |
修改後須重啟資料庫生效。 若使用 SPFILE,可用 ALTER SYSTEM SET job_queue_processes=10 SCOPE=BOTH; 動態調整(10g+ 支援)。
SQL> GRANT EXECUTE ON DBMS_JOB TO scott;
建立儲存程序 my_job(範例:每日統計銷售資料):
CREATE OR REPLACE PROCEDURE my_job AS
BEGIN
-- 實際業務邏輯:彙總、備份、清理等
INSERT INTO daily_sales_summary
SELECT TRUNC(SYSDATE), COUNT(*), SUM(amount)
FROM sales WHERE sale_date = TRUNC(SYSDATE)-1;
COMMIT;
END;
/
SQL> VARIABLE jobno NUMBER
SQL> BEGIN
DBMS_JOB.SUBMIT(
job => :jobno,
what => 'my_job;',
next_date => SYSDATE,
interval => 'SYSDATE + 1/24' -- 每小時執行一次
);
COMMIT;
END;
/
SQL> PRINT jobno
參數詳解:
job:輸出參數,回傳作業編號what:要執行的 PL/SQL 區塊(以分號結尾)next_date:首次執行時間interval:再次執行間隔運算式,NULL 表示僅執行一次查詢使用者作業狀態:
SQL> SELECT job, next_date, failures, broken
FROM user_jobs;
輸出範例:
JOB NEXT_DATE FAILURES BROKEN
----- ------------------- -------- ------
300 2024-01-15 14:30:00 0 N
FAILURES >= 16 會自動標記 BROKEN='Y' 停止執行DBMS_JOB.RUN(300);DBMS_JOB.BROKEN(300, FALSE);DBMS_JOB.INTERVAL(300, 'SYSDATE+1');DBMS_JOB.REMOVE(300);Oracle 10g 引入功能更強大的 DBMS_SCHEDULER,支援:
FREQ=DAILY; BYHOUR=2)遷移建議: 新專案優先使用 Scheduler;既有 DBMS_JOB 可共存並逐步遷移。
job_queue_processes > 0EXECUTE ON DBMS_JOBinterval 避免作業重疊DBA_JOBS 監控失敗作業