V tomto příspěvku se podíváme na různé dotazy k načtení historie událostí čekání relace Oracle.
Historie událostí čekání v konkrétní relaci od začátku lze nalézt pomocí níže uvedeného dotazu
nastavit řádky 120 trimspool on
sloupec hlavička události “Waited for” formát a30
col total_waits head “Total|Waits” formát 999 999
col tw_ms head “Waited|for (ms)” formát 999 999,99
col aw_ms head “Average|Wait (ms)” formát 999,999,99
col mw_ms head “Max|Wait (ms)” formát 999,999,99
select event, total_waits, time_waited
z v$session_event
kde sid =&1
/
Předpokládejme, že chceme vidět historii událostí čekání relace v konkrétním období, abychom získali událost čekání pouze v tomto období
Poté můžeme použít níže uvedený dotaz ASH k extrahování dat
SQL> SELECT event,count()
FROM dba_hist_active_sess_history a
WHERE a.sample_time BETWEEN to_date('12-OCT-2016 11:49:00′,'DD-MON-YYYY HH24:MI:SS') AND
to_date('12-OCT-2016 15:04:00′,'DD-MON-YYYY HH24:MI:SS') a session_id=1853 a SESSION_SERIAL#=19 seskupit podle události;
POČET UDÁLOSTÍ( )
synchronizace souboru protokolu 88
SQL> SELECT module,count()
2 FROM dba_hist_active_sess_history a
3 WHERE a.sample_time BETWEEN to_date('12-OCT-2016 11:49:00′,'DD-MON-YYYY HH24:MI:SS') AND
4 to_date('12-OCT-2016 15:04:00′,'DD-MON-YYYY HH24:MI:SS') and session_id=1853 a SESSION_SERIAL#=19 a událost ='synchronizace souboru protokolu' seskupení podle modulu;
POČET MODULU( )
e:FND:cp:FNDICM 88
Předpokládejme, že chceme znát historii událostí čekání za poslední hodinu, pak lze použít níže uvedený dotaz
sloupec sample_time format a30
vyberte sample_time, session_state, event, sql_id
z v$active_session_history
kde session_id =&1 a sample_time> SYSDATE – 30/(24*60)
objednejte do 1;
Důležitý případ použití pro tuto techniku.
Předpokládejme, že chceme vědět, na co konkrétní relace během určitého období čekala a co ji blokovalo
Níže uvedený dotaz můžeme použít k získání události čekání a dalších důležitých věcí
formát události col a30
formát col sample_time a25
select session_id, sample_time, session_state, event, wait_time, time_waited, sql_id, sql_child_number CH#
z v$active_session_history
kde session_id =19
a sample_time mezi
to_date('9-DEC-16 01.25.00 PM','dd-MON-yy hh:mi:ss PM')
a
to_date( '9-DEC-16 02.25.00 PM','dd-MON-yy hh:mi:ss PM')
objednejte podle sample_time;
Nyní, pokud je událost enq:TX – spor o zámek řádku, víme, že určitá relace to bude blokovat.
vyberte sample_time, session_state, blocking_session, current_obj#, current_file#, current_block#, current_row#
z v$active_session_history
kde sample_time between
to_date('9-DEC-16 01.25.00 PM' ,'dd-MON-yy hh:mi:ss PM')
a
to_date('9-DEC-16 02.25.00 PM','dd-MON-yy hh:mi:ss PM ')
a session_id =19
a event ='enq:TX – spor o zámek řádku'
seřadit podle sample_time;
Blocking_session zobrazí ID relace, která byla relace zablokována. Můžeme extrahovat příkaz sql také pomocí sql_id získaného výše pro blokovanou relaci.
Podobné dotazy lze použít k identifikaci informací pro blokující relaci a poté k provedení vhodných nápravných opatření
Důležité informace
Určitě jste viděli, že jsme pro tyto dotazy používali často aktivní historii relací a archiv historie aktivních relací
Co je Historie aktivních relací
Historie aktivních relací dotazuje databázi, aby identifikovala aktivní relace a ukládá relevantní informace o každé z nich – jako je ID uživatele, stav, počítač, ze kterého je připojen, a SQL, který provádí – do speciální oblasti v globálním systému. oblast (SGA) instance databáze s názvem ASH buffer
Archiv historie aktivních relací
Active Session History shromažďuje informace o aktivních relacích z instance databáze každou sekundu. V závislosti na aktivitě databáze to povede k velkému množství dat shromážděných uvnitř vyrovnávací paměti ASH, ale protože je vyrovnávací paměť ASH strukturou rezidentní v paměti, má pouze omezené množství prostoru. Navíc, když instance selže, zmizí s ní i její paměť. Oracle Database proto archivuje informace z vyrovnávací paměti ASH do databázové tabulky, aby byly trvalé. Tato archivovaná data tabulky jsou viditelná v zobrazení s názvem DBA_HIST_ACTIVE_SESS_HISTORY
Související články
Oracle ASH (Active Session History) Užitečné dotazy
Jak zjistit, která strana provádí úplný sken tabulky
Jak najít podrobnosti o relaci v databázi Oracle
Co je čas DB a Průměrná aktivní relace, Aktivní relace v oracle
jak najít relaci generující spoustu opakování