Как найти последние операторы SQL в базе данных?

25

Мне нравится получать последние выполненные операторы в моей базе данных вместе с показателями эффективности.

Поэтому мне хотелось бы знать, какие операторы SQL наиболее интенсивно загружают ЦП / ДИСК.

Себастьян Рот
источник

Ответы:

17

Вот SQL, чтобы сделать работу. Открыть для суда.

Шаг 1: Определите идентификаторы установки и идентификаторы пользователей.

SELECT inst_id,sid FROM gv$session WHERE username='<ENTER-USERNAME>';

Шаг 2:

SELECT 
      s.sid
     ,s.CLIENT_INFO
     ,s.MACHINE
     ,s.PROGRAM
     ,s.TYPE
     ,s.logon_time
     ,s.osuser
     ,sq.sorts
     ,sq.DISK_READS
     ,sq.BUFFER_GETS
     ,sq.ROWS_PROCESSED
     ,sq.SQLTYPE
     ,sq.SQL_TEXT
 FROM gv$session s    
    , gv$sql sq
WHERE s.SQL_HASH_VALUE = sq.HASH_VALUE
  AND s.inst_id = :inst_id -- replace with instID from above
  AND s.sid = :sid -- replace with ID from above
  AND sq.inst_id = s.inst_id

Может быть возвращено несколько идентификаторов и идентификаторов экземпляров. Таким образом, выбор пользователей заключается в том, как использовать эти данные в веб-интерфейсе и т. Д.

Себастьян Рот
источник
Небольшое замечание: Oracle поддерживает (не знаю, из какой версии) inоператор с кортежами, поэтому из приведенного выше примера... AND (s.inst_id, s.sid) in ( (:id1, :sid1), (:id2, :sid2), ... )
Betlista
1
'inst_id' обозначает идентификатор экземпляра, это не означает идентификатор установки.
чудо173
13

Консоль Oracles Enterprise Monitor отображает огромное количество информации о том, какие запросы SQL занимают максимальную загрузку ЦП, узкие места, максимальную активность в базе данных, блокировку SQL и др.

Для исторического подхода вы можете использовать отчеты AWR Oracle, чтобы точно определить области, касающиеся вас.

альтернативный текст

введите описание изображения здесь

Сатьяджит Бхат
источник
1
Из любопытства - AWR - это инструмент, доступный для всех лицензий Oracle, и могу ли я использовать его только из командной строки?
Себастьян Рот
2
К сожалению, я должен был упомянуть об этом - насколько я знаю, AWR требует отдельного лицензирования - Oracle Tuning & Diagnostic Pack . Я предпочитаю использовать AWR из консоли Enterprise Manager - я наделен привилегией (!) Использовать консоль Enterprise Manager. Я также обнаружил, что вы можете использовать SQL Developer для мониторинга SQL, но для этого требуется вышеуказанное лицензирование
Сатьяджит Бхат
1
Oracle Enterprise Manager (OEM) очень хорош. Мы можем отслеживать состояние нашей базы данных практически в режиме реального времени с помощью автоматически обновляемых графиков. У нас на стене висит большой монитор, показывающий OEM для наших основных баз данных 24x7, и он чрезвычайно полезен для выявления проблем по мере их возникновения.
ScottCher
4

Вы также можете использовать V$SQL, есть несколько интересных столбцов RUNTIME_MEM, EXECUTIONS, DISK_READS, SORTS, ELAPSED_TIME, SQL_FULLTEXTи т. Д.

Это даст вам 10 лучших операторов по чтению с диска (примечание - это кумулятивно для всех исполнений):

select sql_id,child_number from
(
select sql_id,child_number from v$sql
order by disk_reads desc
)
where rownum<11

Если оператор все еще находится в распоряжении, V$SQL_PLANвы можете получить фактический план объяснения для запроса:

select * from table(dbms_xplan.display_cursor('sql_id',child_number));

Я также хотел бы использовать, V$SQL_PLANпоскольку он содержит хорошую информацию. Если statistics_level=ALLвы можете использовать V$SQL_PLAN_STATISTICS.

gabrielp
источник
2

Для недавнего SQL:

select * from v$sql

Для истории:

select * from dba_hist_sqltext
Grokster
источник