===== Mit der v$bh den Oracle Buffer Cache auswerten ===== Seit der Version 8i wird auf jeden Block im Oracle Buffer Cache der aktuelle Status protokolliert. Über diese Statistik entscheidet die Datenbank, wann ein Block überschrieben wieder überschrieben werden kann bzw. welcher Block wieder in die Datendateien geschrieben werden muss. ==== Aufbau des Caches ==== Der Aufbau / Größe der Cache kann über die View "v$buffer_pool" überpürft werden. Siehe: [[http://docs.oracle.com/cd/E16655_01/server.121/e17615/refrn30032.htm|v$buffer_pool]] ==== Die Status der Cache Blöcke abfragen ==== Mit Hilfe der View "v$bh" können die Status auf den Blöcken abgefragt werden und es können "Hot Block" Probleme und die Cache Effizenz ermittelt werden. Siehe: [[http://docs.oracle.com/cd/E16655_01/server.121/e17615/refrn30029.htm#REFRN30029|v$bh]] === Übersicht über die Blöcke in Verwendung === sql>select dirty , count(*) from v$bh group by dirty / Dirty COUNT(*) ------ ------- Y 159 N 34115 D.h zur Zeit enhalten nur 159 Blöcke im Cache Daten die noch auf Platte geschrieben werden müssen. Mit einen Checkpoint kann nun das Schreiben erzwungen werden: SYS>alter system checkpoint; System wurde geõndert. SYS>select dirty , count(*) from v$bh group by dirty / D COUNT(*) - ---------- N 34306 Für das Zustandsattribute "STATE" kann im Detail untersucht werden, in welchen Zustand jeder Block sich befindet. select status , dirty , count(*) from v$bh group by status , dirty / STATUS Dirty COUNT(*) --------- ---- ---------- xcur N 33598 free N 189 cr N 1929 xcur Y 1794 Übersicht über die Satus Werte: ^state^status^Bedeutung^ |0|free |Der Block wurde noch nie verwendet| |1|xcur |Exclusive | |2|scur |Shared current| |3|cr |Consistent read| |4|read |Being read from disk| |5|mrec |In media recovery mode| |6|irec |In instance recovery mode| |7|write| | |8|pi |Past Image (RAC!) -lesekonsistente ältere (cr) Version des Blocks im shared cache| |9|memory || |10|mwrite || |11|donated || |12|protected || |13|securefile|Block einer Securefiles Datei| |14|siop | | |15|recckpt| | |16|flashfree|leerer Block im Database Flash Cache| |17|flashcur|aktueller Block liegt im Database Flash Cache| |18|flashna| | ==== x$bh ==== Mit der **x$bh** kann über den Touch Count ermittelt werden, wie oft auf einen Block zugriffen wurde. # Block id einer Tabelle ermitteln sql>select file_id,block_id from dba_extents where segment_name='DUAL' and owner ='SYS'; FILE_ID BLOCK_ID -------- -------- 1 465 # mit diesen Daten im Cache nach den Daten suchen sql> select tch from x$bh where file#=1 and dbablk=465; no rows selected sql>select * from dual; sql>select tch from x$bh where file#=1 and dbablk=465; TCH -------- 1 sql>select * from dual; sql>select tch from x$bh where file#=1 and dbablk=465; TCH -------- 2 ==== Quellen ==== * http://docs.oracle.com/cd/E16655_01/server.121/e17633/memory.htm#i8451 * http://docs.oracle.com/cd/E16655_01/server.121/e17615/refrn30029.htm#REFRN30029 * http://www.twg-it.de/notiz.php?id=fdnjs0s8d * Oracle8i Buffer Cache New Features - John Beresniewicz - im Netz nicht mehr auffindbar