6f429244e498457b8400e72e4af683b0 Alberto Blog: ASH Point

mercoledì 16 marzo 2011

ASH Point

In oracle 10G OEM Grid  è stata introdotta una nuova funzionalità a livello grafico chiamata ASH.
Sinceramente sono stato sempre affascinato da questa nuova feature, perchè permette di controllare quello che gli utenti eseguono in tempo reale nel database.
Oltre ad avere una funzione ovviamente di Tuning, in caso di bottleneck è uno dei primi check che ogni DBA dovrebbe eseguire.

Tendo a sottilineare che non tutti i problemi si possono identificare tramite ASH ma è un primo passo per verificare in tempo reale cosa sta accadendo all'interno del DB.

Sapere che statement sta eseguendo un utente aiuta, e non poco, a scoprire che cosa non funziona in una singola istruzione SQL.
Caso comune: squilla il telefono e un utente domanda come mai l'operazione che sta eseguendo ci impiega un "troppo" tempo o per utilizzare un'espressione più appropriata, un tempo maggiore diverso dalle aspettative o dallo standard.
Lasciando un attimo da parte la infrastruttura di rete e le relazioni tra client server, anch'esse molto importanti per determinare la causa, ci focalizziamo all'interno del db.

Collegandosi con OEM è possibile verificare che cosa sta facendo l'utente in questione ossia lo statement SQL, gli eventi di attesa e tanto altro ancora.
Tutto molto bello con grafici e altro ovviamente stiamo utilizzando un'interfaccia grafica.
Ma se volessi eseguire tutto ciò con un script sql sarebbe possibile?
Ovviamente sì, ci sono molti script che fanno questo tipo di analisi ma io per comodità e per capire di più dell'argomento ne ho creato uno.

select V$SQL_PLAN.child_number,
V$SQL_PLAN.OPERATION,OBJECT_NAME,OPTIONS, CARDINALITY as ROWS_,(bytes)/1024 as KByte,COST,(V$SQL_PLAN.TIME) as TIME_SEC, CPU_COST,io_cost,V$SQL_PLAN.PLAN_HASH_VALUE,
sid,serial#,status,osuser,machine, terminal, program,sql_text,executions,first_load_time,COMMAND_TYPE,state,OPTIMIZER_MODE,OPTIMIZER_COST, event,buffer_gets,
logon_time, blocking_session_status from v$session,v$sql,V$SQL_PLAN
where v$sql.sql_id = V$session.sql_id
and v$sql.CHILD_NUMBER=v$session.sql_child_number
and V$SQL_PLAN.SQL_ID = V$SQL.SQL_ID
order by SID;

Con questo script è possibile identificare tutto ciò che un utente sta facendo all'interno del DB. Inoltre ho aggiunto altri funzionalità per esempio l'execution plan di uno statement con i relativi costi, in base all'optimizer, di CPU e IO e il numero di righe che restituisce.
Lo script mostra inoltre l'event di attesa ed eventuali lock oltre il sid e tante informazioni utili.

Per un uso corretto si potrebbe aggiungere anche  status <> 'INACTIVE' per vedere solo quelli attivi ed eventualmente bloccati o bloccanti e poi magari inserire un filtro in machine, terminal e program per scartare alcuni server, client o addirittura applicativi.

Con questo script si riesce ad avere tutte le informazioni nel caso di una telefonata di uno o più utenti, per vericare dove quello statement SQL rimane in HANG.
Poi nel caso si possono eseguire controlli diversi con altri strumenti tipo AWR, ADDM ecc, che collezionano una serie di statistiche in una determinata forbice di tempo.

Inoltre aggiungo degli utilissimi link al sito di Kyle Hailey vero fautore dell'ASH per comprenderne meglio le potenzialità.

http://ashmasters.com/

http://sites.google.com/site/oraclemonitor/kyle-hailey

Nessun commento:

Posta un commento