Вопрос по – Используйте gv $ session, чтобы узнать, зависает ли запрос

6

У меня есть запрос, работающий в Oracle, который может зависнуть или нет. Он работает в течение ~ 10 часов, но в зависимости от объема загружаемых данных, который может быть неоправданным.

Я смотрел на сессию в gv $ session и задавался вопросом, есть ли способ перевести эту информацию, чтобы увидеть, происходит ли на самом деле какая-либо активность, или запрос застрял в ожидании блокировки или завис.

Я уже прочитал документацию по этому виду.Вот, Я в основном ищу советы от любого, кто имел опыт отладки подобных проблем в Oracle.

Спасибо!

Есть ли запись вv$session_longops что вы можете проверить, если он продвигается? В качестве альтернативы проверьте эту ссылку, чтобы узнать, не блокируется ли ваша сессия:orafaq.com/node/854 Ollie
Спасибо, я могу объединить это с gv $ sqlarea, чтобы увидеть, какие утверждения меня удерживают! Paul

Ваш Ответ

3   ответа
0

select a.SID, a.SERIAL#, c.OBJECT_NAME 
from v$session a, v$locked_object b, user_objects c
where a.SID=b.SESSION_ID and b.OBJECT_ID=c.OBJECT_ID
8

gv$session,event  столбце указано, какое событие ожидания ожидает ваша сессия. Если ваша сессия ожидает какой-то блокировки, удерживаемой другой сессией,event сообщит вам об этом (например, это будет «enq: TX - конкуренция за блокировку строки», если вы поставлены в очередь в ожидании блокировки строки, удерживаемой другим сеансом), иblocking_instance а такжеblocking_session будет заполнен экземпляром и идентификатором сеанса владельца замка. ы также можете посмотреть наseconds_in_wait (еслиwait_time=0), чтобы определить, сколько секунд сеанс провел в текущем событии ожидания. Это должно, по крайней мере, сказать вам, «застрял» ли ваш сеанс в данный момент. но он не сообщает вам, действительно ли ваш запрос когда-нибудь будет завершен - если план плохой, вполне возможно, что вы получили "хороший" ответ. Ждать события, такие как ожидание дискового ввода-вывода, которые указывают, что сеанс что-то делает, но что запрос никогда не завершится.

Отличная информация Спасибо! Paul
выберите событие «ALTER SYSTEM KILL SESSION» «», «sid ||», «||», «SERIAL #», «|», событие из сеанса gv $, где машина = "ваша машина" удобно генерировать команды, чтобы убить их. Просто скопируйте вставить столбец 1
4

я пришел к следующим запросам, которые помогут отладить проблему:

select s.sid, 
       s.username,
       s.machine,
       s.osuser, 
       cpu_time,
       (elapsed_time/1000000)/60 as minutes,
       sql_text
from gv$sqlarea a, gv$session s
where s.sql_id = a.sql_id
and s.machine like '####';


select lo.*, 
       a.sql_text
from gv$sqlarea a, gv$session_longops lo
where lo.sql_id = a.sql_id
and lo.sid = ####
order by lo.start_time;
Это тоже работает. Я обновил ответ. Paul
Не проверяя точные столбцы в этих представлениях, не лучше ли связать gv $ sqlarea с gv $ session_longops через SQL_ID? В данный момент я не нахожусь перед своим компьютером, поэтому я не могу проверить :-(

Похожие вопросы