V$SQLAREA: различия между версиями
Admin (обсуждение | вклад) |
Admin (обсуждение | вклад) |
||
| (не показано 5 промежуточных версий этого же участника) | |||
| Строка 26: | Строка 26: | ||
-- сортировка по disk_reads | -- сортировка по disk_reads | ||
SELECT sql_id, PLAN_HASH_VALUE, SQL_PLAN_BASELINE, fetches, executions, disk_reads, buffer_gets FROM V$SQLAREA order by buffer_gets desc; | SELECT sql_id, PLAN_HASH_VALUE, SQL_PLAN_BASELINE, fetches, executions, disk_reads, buffer_gets FROM V$SQLAREA order by buffer_gets desc; | ||
| + | </pre> | ||
| + | |||
| + | '''Топ-5 запросов по общему затраченному времени (ELAPSED_TIME)''' | ||
| + | |||
| + | Этот запрос найдет запросы, которые дольше всего суммарно выполнялись (включая время ожидания), что часто является лучшим показателем общего влияния на производительность системы. | ||
| + | |||
| + | <pre> | ||
| + | select * from | ||
| + | (SELECT | ||
| + | SQL_ID, | ||
| + | EXECUTIONS, | ||
| + | -- Переводим микросекунды в секунды и округляем | ||
| + | ROUND(ELAPSED_TIME / 1000000, 2) AS total_elapsed_sec, | ||
| + | -- Среднее время выполнения в секундах | ||
| + | ROUND((ELAPSED_TIME / 1000000) / DECODE(EXECUTIONS, 0, 1, EXECUTIONS), 3) AS avg_elapsed_sec, | ||
| + | BUFFER_GETS, | ||
| + | DISK_READS, | ||
| + | SQL_TEXT | ||
| + | FROM | ||
| + | V$SQLAREA | ||
| + | WHERE | ||
| + | -- Исключаем запросы без выполнений | ||
| + | EXECUTIONS > 0 | ||
| + | -- Опционально: исключаем запросы самого администратора | ||
| + | AND PARSING_SCHEMA_NAME != 'SYS' | ||
| + | ORDER BY | ||
| + | ELAPSED_TIME DESC) | ||
| + | where rownum<5; | ||
| + | |||
| + | -- для Oracle 12+ вместо вложенного запроса, можно использовать конструкцию FETCH FIRST 5 ROWS ONLY; | ||
| + | </pre> | ||
| + | |||
| + | '''Топ-5 запросов по использованию CPU (CPU_TIME)''' | ||
| + | |||
| + | Этот запрос полезен для поиска запросов, которые создают наибольшую нагрузку на процессор сервера. | ||
| + | |||
| + | <pre> | ||
| + | select * from | ||
| + | (SELECT | ||
| + | SQL_ID, | ||
| + | EXECUTIONS, | ||
| + | ROUND(CPU_TIME / 1000000, 2) AS total_cpu_sec, | ||
| + | ROUND((CPU_TIME / 1000000) / DECODE(EXECUTIONS, 0, 1, EXECUTIONS), 3) AS avg_cpu_sec, | ||
| + | BUFFER_GETS, | ||
| + | SQL_TEXT | ||
| + | FROM | ||
| + | V$SQLAREA | ||
| + | WHERE | ||
| + | EXECUTIONS > 0 | ||
| + | AND PARSING_SCHEMA_NAME != 'SYS' | ||
| + | ORDER BY | ||
| + | CPU_TIME DESC | ||
| + | ) | ||
| + | where rownum<5; | ||
| + | |||
| + | -- для Oracle 12+ вместо вложенного запроса, можно использовать конструкцию FETCH FIRST 5 ROWS ONLY; | ||
| + | </pre> | ||
| + | |||
| + | '''Топ-5 запросов по логическим чтениям (BUFFER_GETS)''' | ||
| + | |||
| + | BUFFER_GETS — это количество блоков данных, прочитанных из кэша памяти (SGA). Высокое значение часто свидетельствует о неэффективном использовании индексов или плохом плане запроса (например, слишком частые полные сканирования таблиц). | ||
| + | |||
| + | <pre> | ||
| + | select * from | ||
| + | (SELECT | ||
| + | SQL_ID, | ||
| + | EXECUTIONS, | ||
| + | BUFFER_GETS, | ||
| + | ROUND(BUFFER_GETS / DECODE(EXECUTIONS, 0, 1, EXECUTIONS), 1) AS avg_gets_per_exec, | ||
| + | DISK_READS, | ||
| + | SQL_TEXT | ||
| + | FROM | ||
| + | V$SQLAREA | ||
| + | WHERE | ||
| + | EXECUTIONS > 0 | ||
| + | AND PARSING_SCHEMA_NAME != 'SYS' | ||
| + | ORDER BY | ||
| + | BUFFER_GETS DESC) | ||
| + | where rownum < 5; | ||
| + | |||
| + | -- для Oracle 12+ вместо вложенного запроса, можно использовать конструкцию FETCH FIRST 5 ROWS ONLY; | ||
| + | </pre> | ||
| + | |||
| + | '''Топ-5 запросов по физическим чтениям с диска (DISK_READS)''' | ||
| + | |||
| + | Физические чтения с диска — самая медленная операция. Эти запросы напрямую влияют на производительность дисковой подсистемы (I/O). | ||
| + | |||
| + | <pre> | ||
| + | select * from | ||
| + | (SELECT | ||
| + | SQL_ID, | ||
| + | EXECUTIONS, | ||
| + | DISK_READS, | ||
| + | ROUND(DISK_READS / DECODE(EXECUTIONS, 0, 1, EXECUTIONS), 1) AS avg_reads_per_exec, | ||
| + | BUFFER_GETS, | ||
| + | SQL_TEXT | ||
| + | FROM | ||
| + | V$SQLAREA | ||
| + | WHERE | ||
| + | EXECUTIONS > 0 | ||
| + | AND PARSING_SCHEMA_NAME != 'SYS' | ||
| + | ORDER BY | ||
| + | DISK_READS DESC) | ||
| + | where rownum<5; | ||
| + | |||
| + | -- для Oracle 12+ вместо вложенного запроса, можно использовать конструкцию FETCH FIRST 5 ROWS ONLY; | ||
</pre> | </pre> | ||
Текущая версия на 15:53, 9 декабря 2025
V$SQLAREA - быстрый обзор наиболее ресурсоемких (Top N) запросов в системе за текущий период работы экземпляра базы данных
Dynamic Performance Views
Поля
SQL_ID Уникальный идентификатор запроса. SQL_TEXT Собственно текст SQL-запроса (первые 1000 символов). EXECUTIONS Общее количество выполнений запроса с момента загрузки в кэш. ELAPSED_TIME Общее суммарное затраченное время (в микросекундах) выполнения всех запусков запроса. CPU_TIME Общее время ЦП (в микросекундах). BUFFER_GETS Общее количество логических чтений блоков. DISK_READS Общее количество физических чтений с диска. PARSE_CALLS Количество вызовов разбора (парсинга) запроса. ROWS_PROCESSED Общее количество обработанных строк. USERS_EXECUTING Количество активных пользователей, выполняющих этот запрос прямо сейчас. PLAN_HASH_VALUE Идентификатор текущего используемого плана выполнения.
-- сортировка по buffer_gets SELECT sql_id, PLAN_HASH_VALUE, SQL_PLAN_BASELINE, fetches, executions, disk_reads, buffer_gets FROM V$SQLAREA order by buffer_gets desc; -- сортировка по disk_reads SELECT sql_id, PLAN_HASH_VALUE, SQL_PLAN_BASELINE, fetches, executions, disk_reads, buffer_gets FROM V$SQLAREA order by buffer_gets desc;
Топ-5 запросов по общему затраченному времени (ELAPSED_TIME)
Этот запрос найдет запросы, которые дольше всего суммарно выполнялись (включая время ожидания), что часто является лучшим показателем общего влияния на производительность системы.
select * from
(SELECT
SQL_ID,
EXECUTIONS,
-- Переводим микросекунды в секунды и округляем
ROUND(ELAPSED_TIME / 1000000, 2) AS total_elapsed_sec,
-- Среднее время выполнения в секундах
ROUND((ELAPSED_TIME / 1000000) / DECODE(EXECUTIONS, 0, 1, EXECUTIONS), 3) AS avg_elapsed_sec,
BUFFER_GETS,
DISK_READS,
SQL_TEXT
FROM
V$SQLAREA
WHERE
-- Исключаем запросы без выполнений
EXECUTIONS > 0
-- Опционально: исключаем запросы самого администратора
AND PARSING_SCHEMA_NAME != 'SYS'
ORDER BY
ELAPSED_TIME DESC)
where rownum<5;
-- для Oracle 12+ вместо вложенного запроса, можно использовать конструкцию FETCH FIRST 5 ROWS ONLY;
Топ-5 запросов по использованию CPU (CPU_TIME)
Этот запрос полезен для поиска запросов, которые создают наибольшую нагрузку на процессор сервера.
select * from
(SELECT
SQL_ID,
EXECUTIONS,
ROUND(CPU_TIME / 1000000, 2) AS total_cpu_sec,
ROUND((CPU_TIME / 1000000) / DECODE(EXECUTIONS, 0, 1, EXECUTIONS), 3) AS avg_cpu_sec,
BUFFER_GETS,
SQL_TEXT
FROM
V$SQLAREA
WHERE
EXECUTIONS > 0
AND PARSING_SCHEMA_NAME != 'SYS'
ORDER BY
CPU_TIME DESC
)
where rownum<5;
-- для Oracle 12+ вместо вложенного запроса, можно использовать конструкцию FETCH FIRST 5 ROWS ONLY;
Топ-5 запросов по логическим чтениям (BUFFER_GETS)
BUFFER_GETS — это количество блоков данных, прочитанных из кэша памяти (SGA). Высокое значение часто свидетельствует о неэффективном использовании индексов или плохом плане запроса (например, слишком частые полные сканирования таблиц).
select * from
(SELECT
SQL_ID,
EXECUTIONS,
BUFFER_GETS,
ROUND(BUFFER_GETS / DECODE(EXECUTIONS, 0, 1, EXECUTIONS), 1) AS avg_gets_per_exec,
DISK_READS,
SQL_TEXT
FROM
V$SQLAREA
WHERE
EXECUTIONS > 0
AND PARSING_SCHEMA_NAME != 'SYS'
ORDER BY
BUFFER_GETS DESC)
where rownum < 5;
-- для Oracle 12+ вместо вложенного запроса, можно использовать конструкцию FETCH FIRST 5 ROWS ONLY;
Топ-5 запросов по физическим чтениям с диска (DISK_READS)
Физические чтения с диска — самая медленная операция. Эти запросы напрямую влияют на производительность дисковой подсистемы (I/O).
select * from
(SELECT
SQL_ID,
EXECUTIONS,
DISK_READS,
ROUND(DISK_READS / DECODE(EXECUTIONS, 0, 1, EXECUTIONS), 1) AS avg_reads_per_exec,
BUFFER_GETS,
SQL_TEXT
FROM
V$SQLAREA
WHERE
EXECUTIONS > 0
AND PARSING_SCHEMA_NAME != 'SYS'
ORDER BY
DISK_READS DESC)
where rownum<5;
-- для Oracle 12+ вместо вложенного запроса, можно использовать конструкцию FETCH FIRST 5 ROWS ONLY;