【Oracle】Database Resource Manager完全ガイド|コンシューマーグループ・リソースプラン・DBMS_RESOURCE_MANAGER まで解説

バッチ処理が OLTP クエリを圧迫してレスポンスが遅くなる、分析クエリが大量の CPU を使い切ってしまうなど、複数の業務が同一データベース上で競合するケースは多くあります。

Database Resource Manager(DRM)は Oracle が提供するリソース制御機構です。セッションをコンシューマーグループに分類し、リソースプランで CPU・並列度・実行時間などのリソースを業務の優先度に応じて配分します。

この記事でわかること

  • Database Resource Manager の仕組み(コンシューマーグループとリソースプラン)
  • DBMS_RESOURCE_MANAGER でコンシューマーグループとリソースプランを作成する方法
  • CPU 比率・並列度・実行時間・アイドルタイムを制御するプランディレクティブ
  • ユーザーをコンシューマーグループに割り当てる方法
  • DBA_RSRC_CONSUMER_GROUPS / DBA_RSRC_PLANS で設定を確認する方法
  • 自動コンシューマーグループ切り替え(実行時間に応じた動的切り替え)
スポンサーリンク

Resource Manager の基本概念

概念 説明
コンシューマーグループ 同じリソース優先度を持つセッションのグループ。ユーザーやプログラム名でグループに割り当てる
リソースプラン コンシューマーグループへのリソース配分ルールの集合。同時に1つのみアクティブにできる
プランディレクティブ リソースプラン内で各コンシューマーグループに適用するリソース制限の設定
OTHER_GROUPS どのグループにも属さないセッションが自動的に割り当てられる予約グループ(必須)

現在のリソース設定を確認する

現在アクティブなリソースプランを確認する
-- 現在適用されているリソースプランを確認する
SHOW PARAMETER resource_manager_plan;

-- または V$PARAMETER から確認する
SELECT name, value FROM V$PARAMETER WHERE name = 'resource_manager_plan';
-- 値が空(NULL)= Resource Manager が無効

-- 登録されているコンシューマーグループの一覧
SELECT consumer_group, status, comments
FROM DBA_RSRC_CONSUMER_GROUPS
ORDER BY consumer_group;

-- 登録されているリソースプランの一覧
SELECT plan, status, comments
FROM DBA_RSRC_PLANS
ORDER BY plan;

-- プランディレクティブの詳細(どのグループにどのリソースを割り当てているか)
SELECT
    plan,
    group_or_subplan,
    cpu_p1,                  -- レベル1での CPU 配分(%)
    cpu_p2,                  -- レベル2での CPU 配分(%)
    parallel_degree_limit_p1,-- 並列度の上限
    active_sess_pool_p1,     -- 同時アクティブセッション数の上限
    max_est_exec_time,       -- 推定実行時間の上限(秒)
    undo_pool,               -- UNDO 使用量の上限(KB)
    switch_group             -- CPU 時間超過時の切り替え先グループ
FROM DBA_RSRC_PLAN_DIRECTIVES
WHERE plan = 'YOUR_PLAN_NAME'
ORDER BY group_or_subplan;

リソースプランとコンシューマーグループを作成する

Resource Manager の設定変更は保留エリア(Pending Area)上で行い、最後に SUBMIT_PENDING_AREA で確定します。不要になった変更は CLEAR_PENDING_AREA でキャンセルできます。

コンシューマーグループの作成
-- 保留エリアを作成する(作業開始前に必ず実行)
BEGIN
    DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
END;
/

-- コンシューマーグループを作成する
BEGIN
    -- OLTP 業務用グループ(高優先度)
    DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
        consumer_group => 'OLTP_GROUP',
        comment        => 'OLTP業務セッション(高優先度)'
    );

    -- バッチ処理用グループ(低優先度)
    DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
        consumer_group => 'BATCH_GROUP',
        comment        => 'バッチ処理セッション(低優先度)'
    );

    -- 分析クエリ用グループ(最低優先度・並列度制限あり)
    DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
        consumer_group => 'REPORT_GROUP',
        comment        => '分析・レポート処理(最低優先度)'
    );
END;
/
リソースプランとディレクティブの作成
-- リソースプランを作成する
BEGIN
    DBMS_RESOURCE_MANAGER.CREATE_PLAN(
        plan    => 'MIXED_WORKLOAD_PLAN',
        comment => 'OLTP・バッチ・レポートの混在環境向けプラン'
    );
END;
/

-- プランディレクティブを設定する(各グループへのリソース配分)
BEGIN
    -- OLTP グループ: CPU 70%(最優先)
    DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
        plan                    => 'MIXED_WORKLOAD_PLAN',
        group_or_subplan        => 'OLTP_GROUP',
        comment                 => 'OLTP 業務: CPU 最優先',
        cpu_p1                  => 70,    -- レベル1で CPU の 70% を割り当て
        parallel_degree_limit_p1 => 4     -- 並列度の上限
    );

    -- BATCH グループ: CPU 20%
    DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
        plan                    => 'MIXED_WORKLOAD_PLAN',
        group_or_subplan        => 'BATCH_GROUP',
        comment                 => 'バッチ処理: CPU 20%',
        cpu_p1                  => 20,
        parallel_degree_limit_p1 => 2
    );

    -- REPORT グループ: CPU 10%・実行時間 600 秒で自動切り替え
    DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
        plan                    => 'MIXED_WORKLOAD_PLAN',
        group_or_subplan        => 'REPORT_GROUP',
        comment                 => 'レポート: CPU 10%・時間制限あり',
        cpu_p1                  => 10,
        parallel_degree_limit_p1 => 8,      -- 並列クエリのみ上限を高く
        switch_time             => 600,      -- 600 秒でグループ切り替え
        switch_group            => 'LOW_GROUP'  -- 切り替え先グループ
    );

    -- OTHER_GROUPS: どのグループにも属さないセッション(必須設定)
    DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
        plan             => 'MIXED_WORKLOAD_PLAN',
        group_or_subplan => 'OTHER_GROUPS',
        comment          => '未分類セッション',
        cpu_p1           => 0   -- 余剰 CPU を使用
    );
END;
/

-- 保留エリアを確定する(ここで初めて設定が登録される)
BEGIN
    DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
END;
/

ユーザーをコンシューマーグループに割り当てる

ユーザーのデフォルトグループを設定する
-- ユーザーにコンシューマーグループの切り替え権限を付与する
BEGIN
    DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP(
        grantee_name   => 'BATCH_USER',
        consumer_group => 'BATCH_GROUP',
        grant_option   => FALSE
    );
END;
/

-- ユーザーのデフォルトコンシューマーグループを設定する(ログイン時のグループ)
BEGIN
    DBMS_RESOURCE_MANAGER.SET_INITIAL_CONSUMER_GROUP(
        user           => 'BATCH_USER',
        consumer_group => 'BATCH_GROUP'
    );
END;
/

-- セッション中にグループを切り替える(ユーザー自身が実行)
BEGIN
    DBMS_SESSION.SWITCH_CURRENT_CONSUMER_GROUP(
        new_consumer_group  => 'REPORT_GROUP',
        old_consumer_group  => :old_group,
        initial_group_on_error => FALSE
    );
END;
/
プロファイルでユーザーをグループに割り当てる(別の方法)
-- ユーザー設定でデフォルトグループを確認する
SELECT username, resource_consumer_group
FROM DBA_USERS
WHERE username = 'BATCH_USER';

-- ALTER USER でデフォルトコンシューマーグループを変更する
ALTER USER BATCH_USER DEFAULT_CONSUMER_GROUP = BATCH_GROUP;

リソースプランを有効にする

リソースプランをシステムに適用する
-- 作成したプランをアクティブにする
ALTER SYSTEM SET resource_manager_plan = 'MIXED_WORKLOAD_PLAN' SCOPE=BOTH;

-- 無効にする(Resource Manager を使わない状態に戻す)
ALTER SYSTEM SET resource_manager_plan = '' SCOPE=BOTH;

-- 特定の時間帯に自動的にプランを切り替える場合は DBMS_SCHEDULER と組み合わせる
-- (夜間バッチ用プランを 21:00-05:00 に自動適用するなど)

Resource Manager の稼働状況を確認する

コンシューマーグループ別の CPU 使用状況を確認する
-- 現在のセッション別コンシューマーグループを確認する
SELECT
    s.sid,
    s.username,
    s.program,
    s.resource_consumer_group,  -- 現在のコンシューマーグループ
    s.status,
    s.event,
    s.seconds_in_wait
FROM V$SESSION s
WHERE s.type = 'USER'
ORDER BY s.resource_consumer_group, s.sid;

-- グループ別の CPU 使用量・待機時間を確認する(V$RSRC_CONSUMER_GROUP)
SELECT
    name,
    active_sessions,      -- アクティブセッション数
    execution_waiters,    -- CPU を待っているセッション数
    consumed_cpu_time,    -- 消費した CPU 時間(ミリ秒)
    cpu_waits,            -- CPU 待機回数
    cpu_wait_time,        -- CPU 待機時間合計(ミリ秒)
    yield_waits           -- 他グループへの CPU 解放回数
FROM V$RSRC_CONSUMER_GROUP
ORDER BY name;
リソースプランの履歴統計を確認する(DBA_HIST_RSRC_CONSUMER_GROUP)
-- AWR に蓄積されたコンシューマーグループ統計を確認する
SELECT
    s.begin_interval_time,
    r.consumer_group_name,
    r.cpu_consumed_time / 1000 AS cpu_sec,
    r.avg_running_sessions,
    r.avg_waiting_sessions
FROM DBA_HIST_RSRC_CONSUMER_GROUP r
JOIN DBA_HIST_SNAPSHOT s ON r.snap_id = s.snap_id
WHERE s.begin_interval_time >= SYSDATE - 1   -- 過去 24 時間
ORDER BY s.begin_interval_time, r.consumer_group_name;

まとめ

  • コンシューマーグループでセッションを業務種別(OLTP・バッチ・レポート)に分類する
  • プランディレクティブで CPU 比率・並列度・実行時間・UNDO 使用量を制限できる
  • 保留エリア(Pending Area)で設定変更を行い、SUBMIT_PENDING_AREA で確定する
  • switch_timeで長時間実行クエリを低優先度グループに自動切り替えできる
  • V$RSRC_CONSUMER_GROUPでリアルタイムの CPU 使用・待機状況を確認できる
  • Resource Manager は DBMS_SCHEDULER と組み合わせて時間帯ごとのプラン切り替えができる

初期化パラメータ(resource_manager_plan)の管理は 初期化パラメータ完全ガイドを参照してください。CPU 待機イベント(scheduler wait)の詳細分析は 待機イベント完全ガイドも参照してください。