Мое приложение, использующее базу данных Oracle, работает медленно или, похоже, полностью остановилось.
Как узнать, какие запросы самые дорогие, чтобы я мог продолжить изучение?
Это показывает SQL, который в настоящее время является «АКТИВНЫМ»: -
select S.USERNAME, s.sid, s.osuser, t.sql_id, sql_text
from v$sqltext_with_newlines t,V$SESSION s
where t.address =s.sql_address
and t.hash_value = s.sql_hash_value
and s.status = 'ACTIVE'
and s.username <> 'SYSTEM'
order by s.sid,t.piece
/
Это показывает замки. Иногда все идет медленно, но это потому, что он заблокирован в ожидании блокировки:
select
object_name,
object_type,
session_id,
type, -- Type or system/user lock
lmode, -- lock mode in which session holds lock
request,
block,
ctime -- Time since current mode was granted
from
v$locked_object, all_objects, v$lock
where
v$locked_object.object_id = all_objects.object_id AND
v$lock.id1 = all_objects.object_id AND
v$lock.sid = v$locked_object.session_id
order by
session_id, ctime desc, object_name
/
Это хороший вариант для поиска длительных операций (например, полного сканирования таблицы). Если это из-за большого количества коротких операций, ничего не появится.
COLUMN percent FORMAT 999.99
SELECT sid, to_char(start_time,'hh24:mi:ss') stime,
message,( sofar/totalwork)* 100 percent
FROM v$session_longops
WHERE sofar/totalwork < 1
/
alter system kill session
как описано здесь: docs.oracle.com/cd/B28359_01/server.111/b28310/…Попробуйте это, это даст вам запросы, которые в настоящее время выполняются более 60 секунд. Обратите внимание, что он печатает несколько строк для каждого выполняющегося запроса, если SQL имеет несколько строк. Посмотрите на sid, серийный номер, чтобы увидеть, что принадлежит друг другу.
источник
v $ session_longops
Если вы поищете sofar! = Totalwork, вы увидите те, которые не были завершены, но записи не удаляются после завершения операции, поэтому вы также можете увидеть там много истории.
источник
источник
Вы можете создать отчет AWR (автоматический репозиторий рабочей нагрузки) из базы данных.
Запустите из командной строки SQL * Plus:
Прочтите документ о том, как создать и понять отчет AWR. Это даст полное представление о производительности базы данных и проблемах с ресурсами. Когда мы ознакомимся с отчетом AWR, будет полезно найти Top SQL, который потребляет ресурсы.
Кроме того, в пользовательском интерфейсе 12C EM Express мы можем сгенерировать AWR.
источник
Вы можете проверить детали длительных запросов, такие как процент выполнения и оставшееся время, используя следующий запрос:
Полный список действий по устранению неполадок можно найти здесь: Устранение неполадок длительных сеансов
источник
источник
Вы можете использовать представление v $ sql_monitor, чтобы найти запросы, которые выполняются дольше 5 секунд. Это может быть доступно только в корпоративных версиях Oracle. Например, этот запрос будет определять медленно выполняющиеся запросы из моей службы TEST_APP:
Обратите внимание, что elapsed_time находится в микросекундах, поэтому / 1000000, чтобы получить что-то более читаемое
источник