Oracle Datenbank-Tuning - Der Buffer Cache

Tabellen mit Buffer Pools fest verbinden

Unabhängig davon, in welchem Pool Sie ein Objekt platzieren, wird es mit einem LRU-Mechanismus verwaltet. Normalerweise werden die Buffer an den Anfang der LRU-Liste gestellt. Im Fall eines Full Table Scan werden die Buffer jedoch ans Ende der LRU-Liste platziert.

Das kann zu Optimierungsproblemen führen. Für kleine Tabellen, wie z.B. Lookup-Tabellen, plant der Cost-Based Optimizer in der Regel einen Full Table Scan. Diese Tabellen fallen dann relativ schnell wieder aus dem Buffer Pool heraus, obwohl es sinnvoller wäre, sie möglichst lange zu behalten.

Ein Weg, diesem Problem zu begegnen, ist die Benutzung von Cache Tables. Datenblöcke dieser Tabellen werden in jedem Fall an den Anfang der LRUListe gestellt. Es gibt die folgenden Möglichkeiten, Cache Tables zu implementieren:

  • während die Tabelle erstellt wird

  • mit einem ALTER TABLE-Befehl

  • durch Optimizer Hints

Fügen Sie einfach die CACHE-Option in der CREATE TABLE-Anweisung hinzu, um eine Cache Table zu erstellen.

SQL> CREATE TABLE cache_test (
2 id NUMBER) CACHE;
Tabelle wurde angelegt.

Mit dem ALTER TABLE-Befehl können Sie die CACHE-Option ein- und ausschalten.

SQL> ALTER TABLE cache_test NOCACHE;
Tabelle wurde geändert.
SQL> ALTER TABLE cache_test CACHE;
Tabelle wurde geändert.

Auch mit einem Optimizer Hint können Sie eine Tabelle als Cache Table behandeln. Allerdings wird hierbei die Tabelle nicht permanent geändert, die CACHE-Option gilt nur für die Anweisung.

SQL> SELECT /*+ CACHE */ * FROM cache_test;

Mit der folgenden Anweisung können Sie alle Cache Tables identifizieren.

SQL> SELECT owner, table_name
2 FROM dba_tables
3 WHERE LTRIM(cache) = 'Y';
OWNER TABLE_NAME
------------ ---------------
SYS CACHE_TEST

Indexe sinnvoll einsetzen

Den wohl größten Einfluss auf die Performance des Buffer Cache haben Indexe. Wenn durch Verwendung eines Index der Explain-Plan so geändert wird, dass ein Full Table Scan vermieden wird, kommt es zwangsläufig zu viel weniger Leseoperationen von der Festplatte. (mha)