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
- Проверить текущее активное состояние:
SELECT plan, active_state FROM v$rsrc_plan;
- Список всех планов и их состояния:
SELECT name, active_state FROM v$resource_manager_plan;
- Отфильтровать только активные планы:
SELECT * FROM v$rsrc_plan WHERE active_state = 'ACTIVE';
- Найти неактивные планы:
SELECT * FROM v$rsrc_plan WHERE active_state != 'ACTIVE';
- Группировка по состоянию:
SELECT active_state, COUNT(*) FROM v$rsrc_plan GROUP BY active_state;
- Просмотр всех состояний планов:
SELECT DISTINCT active_state FROM v$rsrc_plan;
- Получение только INACTIVE:
SELECT * FROM v$rsrc_plan WHERE active_state = 'INACTIVE';
- Сортировка по активности:
SELECT * FROM v$rsrc_plan ORDER BY active_state DESC;
- Объединение с 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;
- Сравнение с SYS_CONTEXT:
SELECT plan, active_state FROM v$rsrc_plan
WHERE active_state = SYS_CONTEXT('USERENV', 'ACTIVE_STATE');
- Использование в подзапросе:
SELECT name FROM v$resource_manager_plan
WHERE active_state IN (SELECT active_state FROM v$rsrc_plan);
- Отчёт по состояниям:
SELECT active_state, COUNT(*) AS count FROM v$resource_manager_plan GROUP BY active_state;
- Использование в аналитике:
SELECT name, active_state,
RANK() OVER (PARTITION BY active_state ORDER BY name) AS rnk
FROM v$resource_manager_plan;
- Привязка к инстансу:
SELECT * FROM gv$rsrc_plan WHERE inst_id = 1;
- Сравнение в разных кластерах:
SELECT inst_id, plan, active_state FROM gv$rsrc_plan ORDER BY inst_id;
- Использование в представлении:
CREATE VIEW v_active_plans AS
SELECT plan FROM v$rsrc_plan WHERE active_state = 'ACTIVE';
- Форматированный вывод:
SELECT plan || ' => ' || active_state AS status FROM v$rsrc_plan;
- Проверка на наличие активного плана:
SELECT COUNT(*) FROM v$rsrc_plan WHERE active_state = 'ACTIVE';
- Получение последних активных планов:
SELECT * FROM v$rsrc_plan WHERE active_state = 'ACTIVE' AND plan LIKE '%LIMIT%';
- Отчёт по планам и их активности:
SELECT plan, active_state FROM v$rsrc_plan
UNION ALL
SELECT name, active_state FROM v$resource_manager_plan;
- Проверка на PENDING:
SELECT * FROM v$rsrc_plan WHERE active_state = 'PENDING';
- Группировка + фильтрация:
SELECT plan, COUNT(*) FROM v$rsrc_plan
WHERE active_state IN ('ACTIVE', 'PENDING')
GROUP BY plan;
- Использование в 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;
- Сравнение между планами:
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;
- Фильтрация с LIKE:
SELECT * FROM v$rsrc_plan WHERE plan LIKE 'SYS%';
- Использование INSTR:
SELECT * FROM v$rsrc_plan WHERE INSTR(plan, 'OLTP') > 0;
- Аббревиатура состояния:
SELECT plan, SUBSTR(active_state, 1, 3) AS state_short FROM v$rsrc_plan;
- COUNT только ACTIVE:
SELECT COUNT(*) FROM v$rsrc_plan WHERE active_state = 'ACTIVE';
- Проверка в 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;
- Использование в JSON отчёте:
SELECT JSON_OBJECT('plan' VALUE plan, 'state' VALUE active_state) FROM v$rsrc_plan;
- Вывод статуса через CASE:
SELECT plan,
CASE active_state
WHEN 'ACTIVE' THEN '✅'
WHEN 'INACTIVE' THEN '🛑'
ELSE '⏳'
END AS status
FROM v$rsrc_plan;
- ORDER BY длине состояния:
SELECT * FROM v$rsrc_plan ORDER BY LENGTH(active_state);
- Объединение с 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;
- Анализ временных состояний:
SELECT plan, active_state FROM v$rsrc_plan
WHERE active_state IN ('PENDING', 'INACTIVE');
- Упрощённая агрегация:
SELECT COUNT(DISTINCT active_state) FROM v$rsrc_plan;
- Использование в процедуре:
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;
- SELECT с SYS_CONTEXT:
SELECT plan FROM v$rsrc_plan
WHERE active_state = SYS_CONTEXT('USERENV', 'ACTIVE_STATE');
- Группировка с процентами:
SELECT active_state,
ROUND(COUNT(*) * 100 / (SELECT COUNT(*) FROM v$rsrc_plan), 1) AS pct
FROM v$rsrc_plan GROUP BY active_state;
- Проверка доступности колонок:
DESC v$rsrc_plan;
- OFFSET по плану:
SELECT plan FROM (
SELECT plan, ROW_NUMBER() OVER (ORDER BY plan) AS rn FROM v$rsrc_plan
) WHERE rn BETWEEN 1 AND 5;
- Анализ для нескольких баз через DB_LINK:
SELECT * FROM v$rsrc_plan@db_link_name;
- Использование NVL:
SELECT plan, NVL(active_state, 'UNKNOWN') FROM v$rsrc_plan;
- Переименование столбца:
SELECT plan AS plan_name, active_state AS current_state FROM v$rsrc_plan;
- 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;
- Хранимая функция:
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 — как определить состояние пользователя