Oracle Datenbank-Tuning - Der Buffer Cache

Hit Ratio des Buffer Cache

Für den Optimierungsprozess ist es wichtig, die Hit Ratio des Buffer Cache für individuelle Benutzer zu kennen. Es ist durchaus möglich, dass die allgemeine Performance der Datenbank in Ordnung ist, aber einzelne Benutzer Probleme berichten. Die Abfrage in folgendem Listing liefert die Hit Ratio pro Benutzer.

SQL> SELECT b.username, b.osuser,
2 (1-a.physical_reads / (a.block_gets+a.consistent_gets)) "Hit Ratio"
3 FROM v$sess_io a, v$session b
4 WHERE a.sid = b.sid
5 AND (a.block_gets + a.consistent_gets) != 0
6 AND b.username IS NOT NULL;
USERNAME OSUSER Hit Ratio
---------- ----------- ----------
DBSNMP oracle ,986853637
SYS oracle ,983943803
SYS Administrator 1
DBSNMP oracle ,998837278
SYS oracle ,953183521

Es gibt eine Reihe von Statistiken über Cash Misses. Mit deren Hilfe lässt sich analysieren, wie effektiv der LRU-Algorithmus arbeitet. Sie können die folgenden Werte abfragen:

  • Free Buffer Inspected – Anzahl der untersuchten Buffer, bevor ein freier gefunden wurde.

  • Free Buffer Waits – Anzahl von Warte-Ereignissen, während freie Buffer gesucht wurden.

  • Buffer Busy Waits – Anzahl von Warte-Ereignissen, bis ein freier Buffer zur Verfügung stand.

Eine große oder ständig wachsende Anzahl von diesen Werten zeigt an, dass die Server-Prozesse zu viel Zeit verbringen, um freie Buffer im Buffer Cache zu finden. Mit Hilfe der Abfrage in folgendem Listing können Sie diese Statistikwerte abfragen.

SQL> SELECT name, value
2 FROM v$sysstat
3 WHERE name IN
4 ('free buffer inspected',
'free buffer waits','buffer busy waits');
NAME VALUE
----------------------------------- ----------
free buffer inspected 2343
buffer busy waits 1287
free buffer waits 1343

Verwenden Sie die Abfrage in folgendem Listing, um festzustellen, welche Objekte momentan wie viele Blöcke im Buffer Cache belegen.

SQL> SELECT object_name, object_type,
count(*) "Anz. Buffer"
2 FROM x$bh a, dba_objects b
3 WHERE a.obj = b.object_id
4 AND owner NOT IN ('SYS','SYSTEM')
5 GROUP BY object_name, object_type
6 ORDER BY 3 DESC;
OBJECT_NAME OBJECT_TYPE Anz. Buffer
-------------------------- ------------ -----------
SMP_VTM_DISPLAY_STATE TABLE 8
SMP_VDG_NODE_LIST TABLE 7
SMP_VDD_OPERATIONS_TABLE TABLE 7
XDB$CONFIG TABLE 6
AQ$_QS_ES_ORDERS_MQTAB_S TABLE 6
AQ$_QS_OS_ORDERS_MQTAB_S TABLE 6
AQ$_QS_CS_ORDER_STATUS_QT_S TABLE 6
AQ$_QS_OS_ORDERS_PR_MQTAB_S TABLE 6

Das ultimative Ziel zur Verbesserung der Performance lautet für den Buffer Cache, die Hit Ratio zu erhöhen. Das kann mit den folgenden Strategien erreicht werden:

  • den Buffer Cache vergrößern

  • verschiedene Buffer Pools verwenden

  • Tabellen im Buffer Cache festnageln

  • Indexe sinnvoll einsetzen