Oracle DRM 讓 DBA 以資源消費者群組為單位,控制 CPU、並行度、閒置逾時等資源分配,實現多租戶/混合負載隔離。
| 元件 | 角色 | 範例 |
|---|---|---|
| Resource Consumer Group | 用戶/會話的邏輯分組 | OLTP_GROUP, BATCH_GROUP, REPORT_GROUP |
| Resource Plan | 定義群組間資源分配比例 | DAY_PLAN: OLTP 75%, BATCH 25% |
| Plan Directive | 具體分配參數(CPU%、並行度、逾時) | OLTP: CPU_P1=75, MAX_DEGREE_PARALLEL=4 |
| Mapping Rule | 會話自動歸屬群組規則 | USER=SCOTT → OLTP_GROUP; MODULE='ETL' → BATCH_GROUP |
-- 1. 建立消費者群組
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
consumer_group => 'OLTP_GROUP', comment => '線上交易優先');
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
consumer_group => 'BATCH_GROUP', comment => '批次處理');
END;
/
-- 2. 建立資源計畫
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_PLAN(
plan => 'DAY_PLAN', comment => '白天計畫:OLTP 75% CPU');
DBMS_RESOURCE_MANAGER.CREATE_PLAN(
plan => 'NIGHT_PLAN', comment => '夜間計畫:批次 70% CPU');
END;
/
-- 3. 定義指令:多級 CPU 分配(P1 最高優先級)
BEGIN
-- 白天:OLTP 保證 75%,批次 25%
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => 'DAY_PLAN', group_or_subplan => 'OLTP_GROUP',
cpu_p1 => 75, parallel_degree_limit_p1 => 4);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => 'DAY_PLAN', group_or_subplan => 'BATCH_GROUP',
cpu_p1 => 25, parallel_degree_limit_p1 => 2);
-- 夜間:批次 70%,OLTP 30%
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => 'NIGHT_PLAN', group_or_subplan => 'BATCH_GROUP',
cpu_p1 => 70, parallel_degree_limit_p1 => 8);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => 'NIGHT_PLAN', group_or_subplan => 'OLTP_GROUP',
cpu_p1 => 30, parallel_degree_limit_p1 => 4);
END;
/
-- 4. 映射規則:依用房/模組自動分組
BEGIN
DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING(
attribute => DBMS_RESOURCE_MANAGER.ORACLE_USER, value => 'APP_USER',
consumer_group => 'OLTP_GROUP');
DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING(
attribute => DBMS_RESOURCE_MANAGER.MODULE, value => 'ETL_JOB',
consumer_group => 'BATCH_GROUP');
END;
/
-- 5. 啟用計畫(可排程切換)
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'DAY_PLAN' SCOPE=BOTH;
-- 夜間排程:DBMS_SCHEDULER 建立 JOB 切換 NIGHT_PLAN
DRM 進階能力:
MAX_IDLE_TIME閒置斷線、MAX_IDLE_BLOCKER_TIME阻塞釋放、SWITCH_GROUP超時降級、ACTIVE_SESS_POOL並發佇列、UNDO_POOL回滾段配額。
避開 ODBC → OLE DB 轉換層,減少呼叫開銷。連接字串:
Provider=OraOLEDB.Oracle;Data Source=ORCL;User Id=scott;Password=tiger;
| 無連接池 | 有連接池 |
|---|---|
| 每請求建立/銷毀物理連接 | 預建連接複用,毫秒級獲取 |
| 用戶等待網路握手、認證 | 無等待,直接從池取用 |
| 資料庫進程頻繁啟動/清理 | 進程穩定,減少 OS/DB 開銷 |
配置關鍵(以 IIS/ASP.NET 為例):
SELECT * FROM big_table → 必加 WHERE、分頁、限制欄位NOT NULL, CHECK, FK 在建表定義,而非應用層驗證COMMIT/ROLLBACK 显式控制事務邊界SET ARRAYSIZE 100 / JDBC setFetchSize(200) 減少網路往返| 技術 | 適用場景 | 實現方式 |
|---|---|---|
| 臨時表/全域暫存表 | 多步驟中間結果、複雜報表 | CREATE GLOBAL TEMPORARY TABLE gtt_rpt ... ON COMMIT PRESERVE ROWS |
| 物化視圖 | 預聚合、預連接、跨庫同步 | CREATE MATERIALIZED VIEW mv_sales SUMMARY ... REFRESH FAST ON COMMIT |
| PL/SQL 套件/存儲過程 | 封裝業務邏輯、批次處理 | 將多條 SQL 移入資料庫端單次呼叫 |
| 資料庫連結/遠程程序 | 分散式查詢、異構同步 | DBLINK + REMOTE PROCEDURE CALL |
| 快照/資料複製 | 唯讀報表卸載、異地備份 | CREATE SNAPSHOT ... REFRESH FAST EVERY 1 HOUR |
MEMORY_TARGET)、大頁面、結果快取「對所有性能問題,沒有一個統一的解決方法,但 Oracle 提供了豐富的選擇環境。」
優化是有目的地更改組件以改善性能的過程。成功關鍵在於:
掌握 DRM 資源隔離、連接池複用、SQL 七原則、後台處理四大支柱,配合系統級調優,才能在 Oracle 平台構建高吞吐、低延遲、可預測的資料庫服務。