V$SQLAREA: различия между версиями

Материал из sysadm
Перейти к навигации Перейти к поиску
 
(не показаны 3 промежуточные версии этого же участника)
Строка 33: Строка 33:
  
 
<pre>
 
<pre>
SELECT
+
select * from
 +
(SELECT
 
     SQL_ID,
 
     SQL_ID,
    SQL_TEXT,
 
 
     EXECUTIONS,
 
     EXECUTIONS,
 
     -- Переводим микросекунды в секунды и округляем
 
     -- Переводим микросекунды в секунды и округляем
Строка 42: Строка 42:
 
     ROUND((ELAPSED_TIME / 1000000) / DECODE(EXECUTIONS, 0, 1, EXECUTIONS), 3) AS avg_elapsed_sec,
 
     ROUND((ELAPSED_TIME / 1000000) / DECODE(EXECUTIONS, 0, 1, EXECUTIONS), 3) AS avg_elapsed_sec,
 
     BUFFER_GETS,
 
     BUFFER_GETS,
     DISK_READS
+
     DISK_READS,
 +
    SQL_TEXT
 
FROM
 
FROM
 
     V$SQLAREA
 
     V$SQLAREA
Строка 51: Строка 52:
 
     AND PARSING_SCHEMA_NAME != 'SYS'
 
     AND PARSING_SCHEMA_NAME != 'SYS'
 
ORDER BY
 
ORDER BY
     ELAPSED_TIME DESC
+
     ELAPSED_TIME DESC)
FETCH FIRST 5 ROWS ONLY; -- Синтаксис для Oracle 11.2.0.4, если у вас 12+
+
where rownum<5;
-- Для 11gR2 используйте: WHERE ... AND ROWNUM <= 5 ORDER BY ...
+
 
 +
-- для Oracle 12+ вместо вложенного запроса, можно использовать конструкцию FETCH FIRST 5 ROWS ONLY;
 
</pre>
 
</pre>
  
Строка 61: Строка 63:
  
 
<pre>
 
<pre>
SELECT
+
select * from
 +
(SELECT
 
     SQL_ID,
 
     SQL_ID,
    SQL_TEXT,
 
 
     EXECUTIONS,
 
     EXECUTIONS,
 
     ROUND(CPU_TIME / 1000000, 2) AS total_cpu_sec,
 
     ROUND(CPU_TIME / 1000000, 2) AS total_cpu_sec,
 
     ROUND((CPU_TIME / 1000000) / DECODE(EXECUTIONS, 0, 1, EXECUTIONS), 3) AS avg_cpu_sec,
 
     ROUND((CPU_TIME / 1000000) / DECODE(EXECUTIONS, 0, 1, EXECUTIONS), 3) AS avg_cpu_sec,
     BUFFER_GETS
+
     BUFFER_GETS,
 +
    SQL_TEXT
 
FROM
 
FROM
 
     V$SQLAREA
 
     V$SQLAREA
Строка 75: Строка 78:
 
ORDER BY
 
ORDER BY
 
     CPU_TIME DESC
 
     CPU_TIME DESC
FETCH FIRST 5 ROWS ONLY;
+
)
 +
where rownum<5;
 +
 
 +
-- для Oracle 12+ вместо вложенного запроса, можно использовать конструкцию FETCH FIRST 5 ROWS ONLY;
 
</pre>
 
</pre>
  
Строка 83: Строка 89:
  
 
<pre>
 
<pre>
SELECT
+
select * from
 +
(SELECT
 
     SQL_ID,
 
     SQL_ID,
    SQL_TEXT,
 
 
     EXECUTIONS,
 
     EXECUTIONS,
 
     BUFFER_GETS,
 
     BUFFER_GETS,
 
     ROUND(BUFFER_GETS / DECODE(EXECUTIONS, 0, 1, EXECUTIONS), 1) AS avg_gets_per_exec,
 
     ROUND(BUFFER_GETS / DECODE(EXECUTIONS, 0, 1, EXECUTIONS), 1) AS avg_gets_per_exec,
     DISK_READS
+
     DISK_READS,
 +
    SQL_TEXT
 
FROM
 
FROM
 
     V$SQLAREA
 
     V$SQLAREA
Строка 96: Строка 103:
 
     AND PARSING_SCHEMA_NAME != 'SYS'
 
     AND PARSING_SCHEMA_NAME != 'SYS'
 
ORDER BY
 
ORDER BY
     BUFFER_GETS DESC
+
     BUFFER_GETS DESC)
FETCH FIRST 5 ROWS ONLY;
+
where rownum < 5;
 +
 
 +
-- для Oracle 12+ вместо вложенного запроса, можно использовать конструкцию FETCH FIRST 5 ROWS ONLY;
 
</pre>
 
</pre>
  
Строка 105: Строка 114:
  
 
<pre>
 
<pre>
SELECT
+
select * from
 +
(SELECT
 
     SQL_ID,
 
     SQL_ID,
    SQL_TEXT,
 
 
     EXECUTIONS,
 
     EXECUTIONS,
 
     DISK_READS,
 
     DISK_READS,
 
     ROUND(DISK_READS / DECODE(EXECUTIONS, 0, 1, EXECUTIONS), 1) AS avg_reads_per_exec,
 
     ROUND(DISK_READS / DECODE(EXECUTIONS, 0, 1, EXECUTIONS), 1) AS avg_reads_per_exec,
     BUFFER_GETS
+
     BUFFER_GETS,
 +
    SQL_TEXT
 
FROM
 
FROM
 
     V$SQLAREA
 
     V$SQLAREA
Строка 118: Строка 128:
 
     AND PARSING_SCHEMA_NAME != 'SYS'
 
     AND PARSING_SCHEMA_NAME != 'SYS'
 
ORDER BY
 
ORDER BY
     DISK_READS DESC
+
     DISK_READS DESC)
FETCH FIRST 5 ROWS ONLY;
+
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;