News
DBA-Tipp: Full Database Caching oder LRU ... und raus bist du

Die Information ist ein schnelllebiges Gut. Jeden Tag werden wir mit hunderten Informationen zugemüllt. Deshalb sind wir bestrebt uns auf das Wesentliche zu konzentrieren und nur substantiell nachhaltige Informationen bereitzustellen.

Icon Unternehmen

Eine Oracle Datenbank hält Datenblöcke, die einmal von Disk gelesen wurden, im Buffer Cache der SGA vor, um kostenintensive I/O-Operationen zu reduzieren. Zusätzlich wird eine sogenannte Least Recently Used (LRU) Liste gepflegt. In dieser LRU werden Verweise auf die Blöcke im Buffer Cache geordnet und anhand der Häufigkeit ihrer Leseanforderungen gespeichert. Anhand dieser Liste entscheidet die Oracle Datenbank, welcher Block zu Gunsten eines neuen, sich noch nicht im Buffer Cache befindlichen Blocks aus dem Cache entfernt werden soll.

Als besonderer Fall gilt hier ein Full Table Scan einer Tabelle. Dieser wird immer dann ausgeführt, wenn aus Sicht des Optimizers kein auf Indizes basierender günstigerer Zugriffspfad für eine Abfrage existiert. Da bei einem solchen Full Table Scan alle Blöcke eines Segments gelesen werden, welche wiederum tendenziell große Bereiche des Buffer Cache belegen, werden die zugehörigen Blöcke stets an das Ende der LRU gesetzt, d.h. diese Blöcke werden als erstes durch neue verdrängt.

Dieses Prinzip ist natürlich dann hinderlich, wenn es regelmäßig zu Full Table Scans kommt, etwa wenn die Filterkriterien bestimmter Abfragen nicht selektiv genug sind und der DBA auf die Formulierung der Abfragen bzw. die Applikationslogik keinen Einfluss hat. In dem Fall würden die Datenblöcke der betroffenen Tabellen sehr schnell wieder aus dem Buffer Cache verdrängt werden, kostenintensive Disk-I/O-Operationen sind die Folge.

Abhilfe schaffte hier bisher die Nutzung des dedizierten KEEP Pool des Buffer Cache. Die Prinzipien der Verdrängung anhand der LRU greifen hier zwar auch, durch explizites Caching ausgewählter Tabellen in einem isolierten Bereich des Buffer Cache kann dem aber vorgebeugt werden. Des Weiteren besteht mit dem CACHE Attribut die Möglichkeit, Datenblöcke ausgewählter Tabellen im Falle eines Full Table Scans nicht an das Ende der LRU zu setzen, sondern sie wie bei regulären Blockzugriffen zu behandeln. Beide Ansätze haben jedoch den Nachteil, dass sie für jede neue Tabelle einzeln geprüft und gegebenenfalls umgesetzt werden müssen.

Einen weiteren Spezialfall stellen LOB Segmente dar, welche per default gar nicht im Buffer Cache vorgehalten werden.

Force Full Database Caching Mode

Mit der Oracle Datenbank Version 12.1.0.2 wurde das klassische Caching Verfahren nunmehr erweitert. Dabei wird jeder Block im Buffer Cache vorgehalten, ungeachtet ob er mit einem Full Table Scan oder aber regulär gelesen wurde, vorausgesetzt natürlich, es steht ein ausreichend großer Buffer Cache für die Instanz zur Verfügung. Die Entscheidung für den Einsatz des neuen Caching Verfahrens trifft die Oracle Datenbank automatisch unter Berücksichtigung des zur Verfügung stehenden Speichers, etwaiger zu erwartender Verbesserungen der Performance sowie diverser Oracle Datenbank interner Kriterien. LOB Segmente werden aber auch in diesem Modus per default nicht gecached.

Der neue Caching Modus kann als sogenannter Force Full Database Caching Mode aber auch explizit aktiviert werden. In diesem Fall werden im Gegensatz zum automatischen Modus auch LOB Segmente gecached.

Um zu ermitteln, ob der Force Full Database Caching Modus aktiviert ist, kann folgende Abfrage genutzt werden:

SQL> SELECT FORCE_FULL_DB_CACHING FROM V$DATABASE;

FORCE_FULL_DB_CACHING

------------------------------

NO

SQL>

Damit der Force Full Database Caching Mode genutzt werden kann, muss die Oracle Datenbank Automatic Memory Management (AMM) oder Automatic Shared Memory Management (ASMM) nutzen.

Mit dem folgenden Kommando kann der neue Modus aktiviert werden, die Oracle Datenbank muss im MOUNT Zustand sein:

SQL> ALTER DATABASE FORCE FULL DATABASE CACHING;

Anzumerken ist, dass bei Aktivierung des Force Full Database Caching Mode nicht automatisch die komplette Oracle Datenbank gecached wird, sondern wie gehabt die Datenblöcke nach erstmaligem Lesen von Disk im Buffer Cache abgelegt werden.

Wichtig ist auch, dass die Oracle Datenbank den Force Full Database Caching Mode ungeachtet des tatsächlich für die Instanz zur Verfügung stehenden Speichers aktiviert, in dem Fall findet sich jedoch eine entsprechende Warnung im Alert-Logfile:

Buffer Cache Force Full DB Caching mode on when DB does not fit  in cache. Turning off Force Full DB Caching advisable

Steht kein ausreichend großer Buffer Cache zur Verfügung um die komplette Oracle Datenbank vorzuhalten, greifen die klassischen Verdrängungsmechanismen basierend auf der LRU Liste.

Fazit

Mit der Version 12.1.0.2 der Oracle Datenbank wird endlich eine Alternative zur klassischen Behandlung von Full Table Scans eingeführt. War man bisher, trotz ausreichend großer SGA gezwungen der Problematik manuell mit Bordmitteln begegnen zu müssen, erübrigt sich dies nunmehr zumindest bei kleinen Datenbanken.

Mit dem Force Full Database Caching Mode bietet Oracle ein Mittel um kleine bis mittelgroße Oracle Datenbanken komplett in der SGA einer Datenbank-Instanz vorzuhalten. Damit werden die negativen Effekte wiederkehrender Full Table Scans teilweise kompensiert. Darüber hinaus erlaubt der Modus das Vorhalten von LOB Segmenten im Buffer Cache, ungeachtet der LOB spezifischen Caching Vorgaben.