ACTIVE_STATE в Oracle SQL — что значит активное состояние ресурса

🟢 ACTIVE_STATE в Oracle SQL. Введение

Ключевое слово ACTIVE_STATE в Oracle SQL используется в представлениях динамической производительности (например, V$RESOURCE_MANAGER_PLAN, V$RSRC_PLAN) для отображения текущего состояния плана управления ресурсами. Значения могут быть ACTIVE, INACTIVE, PENDING и другие. Этот атрибут особенно важен для диагностики, настройки QoS и анализа работы планов распределения ресурсов. В статье приведено 50 примеров работы с ACTIVE_STATE в Oracle SQL.


🖋️ Синтаксис применения ACTIVE_STATE

-- Проверка активного плана ресурсов:
SELECT plan, active_state FROM v$rsrc_plan;

-- Альтернатива через V$RESOURCE_MANAGER_PLAN:
SELECT name, active_state FROM v$resource_manager_plan;

🔄 Где используется ACTIVE_STATE в Oracle SQL

  • Диагностика производительности через Resource Manager
  • Мониторинг включённых планов QoS
  • Проверка включения планов в Real-Time режимах
  • Работа с утилитами DB Resource Manager

📊 45 примеров использования ACTIVE_STATE в Oracle SQL

  1. Проверить текущее активное состояние:
SELECT plan, active_state FROM v$rsrc_plan;
  1. Список всех планов и их состояния:
SELECT name, active_state FROM v$resource_manager_plan;
  1. Отфильтровать только активные планы:
SELECT * FROM v$rsrc_plan WHERE active_state = 'ACTIVE';
  1. Найти неактивные планы:
SELECT * FROM v$rsrc_plan WHERE active_state != 'ACTIVE';
  1. Группировка по состоянию:
SELECT active_state, COUNT(*) FROM v$rsrc_plan GROUP BY active_state;
  1. Просмотр всех состояний планов:
SELECT DISTINCT active_state FROM v$rsrc_plan;
  1. Получение только INACTIVE:
SELECT * FROM v$rsrc_plan WHERE active_state = 'INACTIVE';
  1. Сортировка по активности:
SELECT * FROM v$rsrc_plan ORDER BY active_state DESC;
  1. Объединение с DBA_RSRC_PLANS:
SELECT r.plan, r.active_state, d.status
FROM v$rsrc_plan r JOIN dba_rsrc_plans d ON r.plan = d.plan;
  1. Сравнение с SYS_CONTEXT:
SELECT plan, active_state FROM v$rsrc_plan
WHERE active_state = SYS_CONTEXT('USERENV', 'ACTIVE_STATE');
  1. Использование в подзапросе:
SELECT name FROM v$resource_manager_plan
WHERE active_state IN (SELECT active_state FROM v$rsrc_plan);
  1. Отчёт по состояниям:
SELECT active_state, COUNT(*) AS count FROM v$resource_manager_plan GROUP BY active_state;
  1. Использование в аналитике:
SELECT name, active_state,
  RANK() OVER (PARTITION BY active_state ORDER BY name) AS rnk
FROM v$resource_manager_plan;
  1. Привязка к инстансу:
SELECT * FROM gv$rsrc_plan WHERE inst_id = 1;
  1. Сравнение в разных кластерах:
SELECT inst_id, plan, active_state FROM gv$rsrc_plan ORDER BY inst_id;
  1. Использование в представлении:
CREATE VIEW v_active_plans AS
SELECT plan FROM v$rsrc_plan WHERE active_state = 'ACTIVE';
  1. Форматированный вывод:
SELECT plan || ' => ' || active_state AS status FROM v$rsrc_plan;
  1. Проверка на наличие активного плана:
SELECT COUNT(*) FROM v$rsrc_plan WHERE active_state = 'ACTIVE';
  1. Получение последних активных планов:
SELECT * FROM v$rsrc_plan WHERE active_state = 'ACTIVE' AND plan LIKE '%LIMIT%';
  1. Отчёт по планам и их активности:
SELECT plan, active_state FROM v$rsrc_plan
UNION ALL
SELECT name, active_state FROM v$resource_manager_plan;
  1. Проверка на PENDING:
SELECT * FROM v$rsrc_plan WHERE active_state = 'PENDING';
  1. Группировка + фильтрация:
SELECT plan, COUNT(*) FROM v$rsrc_plan
WHERE active_state IN ('ACTIVE', 'PENDING')
GROUP BY plan;
  1. Использование в MERGE:
MERGE INTO audit_rsrc a
USING v$rsrc_plan v
ON (a.plan = v.plan)
WHEN MATCHED THEN UPDATE SET a.state = v.active_state;
  1. Сравнение между планами:
SELECT r1.plan, r1.active_state, r2.active_state AS mgr_state
FROM v$rsrc_plan r1 JOIN v$resource_manager_plan r2 ON r1.plan = r2.name;
  1. Фильтрация с LIKE:
SELECT * FROM v$rsrc_plan WHERE plan LIKE 'SYS%';
  1. Использование INSTR:
SELECT * FROM v$rsrc_plan WHERE INSTR(plan, 'OLTP') > 0;
  1. Аббревиатура состояния:
SELECT plan, SUBSTR(active_state, 1, 3) AS state_short FROM v$rsrc_plan;
  1. COUNT только ACTIVE:
SELECT COUNT(*) FROM v$rsrc_plan WHERE active_state = 'ACTIVE';
  1. Проверка в PL/SQL:
BEGIN
  FOR rec IN (SELECT * FROM v$rsrc_plan WHERE active_state != 'ACTIVE') LOOP
    DBMS_OUTPUT.PUT_LINE(rec.plan || ' not active');
  END LOOP;
END;
  1. Использование в JSON отчёте:
SELECT JSON_OBJECT('plan' VALUE plan, 'state' VALUE active_state) FROM v$rsrc_plan;
  1. Вывод статуса через CASE:
SELECT plan,
  CASE active_state
    WHEN 'ACTIVE' THEN '✅'
    WHEN 'INACTIVE' THEN '🛑'
    ELSE '⏳'
  END AS status
FROM v$rsrc_plan;
  1. ORDER BY длине состояния:
SELECT * FROM v$rsrc_plan ORDER BY LENGTH(active_state);
  1. Объединение с CPU_USAGE (пример):
SELECT r.plan, r.active_state, c.cpu_per_session
FROM v$rsrc_plan r JOIN dba_rsrc_consumer_groups c ON r.plan = c.consumer_group;
  1. Анализ временных состояний:
SELECT plan, active_state FROM v$rsrc_plan
WHERE active_state IN ('PENDING', 'INACTIVE');
  1. Упрощённая агрегация:
SELECT COUNT(DISTINCT active_state) FROM v$rsrc_plan;
  1. Использование в процедуре:
CREATE OR REPLACE PROCEDURE log_active_plans IS
BEGIN
  FOR r IN (SELECT * FROM v$rsrc_plan WHERE active_state = 'ACTIVE') LOOP
    DBMS_OUTPUT.PUT_LINE('Active plan: ' || r.plan);
  END LOOP;
END;
  1. SELECT с SYS_CONTEXT:
SELECT plan FROM v$rsrc_plan
WHERE active_state = SYS_CONTEXT('USERENV', 'ACTIVE_STATE');
  1. Группировка с процентами:
SELECT active_state,
  ROUND(COUNT(*) * 100 / (SELECT COUNT(*) FROM v$rsrc_plan), 1) AS pct
FROM v$rsrc_plan GROUP BY active_state;
  1. Проверка доступности колонок:
DESC v$rsrc_plan;
  1. OFFSET по плану:
SELECT plan FROM (
  SELECT plan, ROW_NUMBER() OVER (ORDER BY plan) AS rn FROM v$rsrc_plan
) WHERE rn BETWEEN 1 AND 5;
  1. Анализ для нескольких баз через DB_LINK:
SELECT * FROM v$rsrc_plan@db_link_name;
  1. Использование NVL:
SELECT plan, NVL(active_state, 'UNKNOWN') FROM v$rsrc_plan;
  1. Переименование столбца:
SELECT plan AS plan_name, active_state AS current_state FROM v$rsrc_plan;
  1. JOIN с DBA_RSRC_CONSUMER_GROUP_PRIVS:
SELECT r.plan, c.consumer_group
FROM v$rsrc_plan r JOIN dba_rsrc_consumer_group_privs c ON r.plan = c.grantee;
  1. Хранимая функция:
CREATE FUNCTION get_active_plan RETURN VARCHAR2 IS
  v_plan VARCHAR2(128);
BEGIN
  SELECT plan INTO v_plan FROM v$rsrc_plan WHERE active_state = 'ACTIVE' AND ROWNUM = 1;
  RETURN v_plan;
END;

📆 Заключение: зачем использовать ACTIVE_STATE в Oracle SQL

ACTIVE_STATE — это индикатор работы системы управления ресурсами Oracle. Он помогает понять, какой план распределения ресурсов активен в конкретный момент времени и в каком режиме работает база. Это важный инструмент для DBA при настройке производительности.


🕸️ Следующая статья:

ACCOUNT_STATUS в Oracle SQL — как определить состояние пользователя

Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии