Full Database Caching in 12c
von Ulrike Schwinn, Oracle Deutschland B.V. & Co. KG
Die Datenbank übernimmt seit jeher automatisch das Caching von Datenbankblöcken im Database Buffer Cache. Der Cache
unterliegt dabei unterschiedlichen Algorithmen, was die Dauer und die Lagerung der Blöcke im Buffer Cache angeht.
So werden beispielsweise die Blöcke nach einen Least Used Algorithmus im Cache gehalten, um die Verweildauer im Cache effizient zu
gestalten oder können nach der Temperaturmethode (siehe Feature Automatic Big Table Caching) ausgelagert werden.
Ein Table Scan auf kleinen (SMALL) Tabellen (in der Regel kleiner als 2% des Buffer Caches) wird dabei im Buffer Cache
realisiert. Parallele und serielle Table Scans auf großen Tabellen werden hingegen über
Direct Read Operationen realisiert. Large Objects (auch LOBs) - also SecureFiles oder BasicFiles (in der 12c Terminologie) -
werden übrigens standardmässig nicht im Cache gespeichert. Dies sind ein paar Regeln, die man kennen sollte.
Neu in 12c ist ein automatischer Full Database Caching Mode. Falls das Memory ausreichend für die gesamte
Datenbank ist und bestimmte interne Regeln erfüllt sind, werden alle Tabellen als kleine (SMALL) Tabellen angesehen und
im Cache gelagert oder wie im Concepts Guide nachzulesen ist:
"Starting in Oracle Database 12c Release 1 (12.1.0.2), the buffer cache of a database instance automatically
performs an internal calculation to determine whether memory is sufficient for the database to be fully cached
in the instance SGA, and if caching tables on access would be beneficial for performance.
If the whole database can fully fit in memory, and if various other internal criteria are met,
then Oracle Database treats all tables in the database as small tables, and considers them eligible for caching.
However, the database does not cache LOBs marked with the NOCACHE attribute."
Möchte man unabhängig von diesen Regeln sein, kann man diesen Modus auch forcieren.
Das Konzept nennt sich dann Force Full Database Caching. Die Idee dahinter ist im Prinzip die gleiche wie
beim automatischen Full Database Caching: Ist der Cache groß genug um alle Objekte im Cache zu speichern,
können alle Objekte im Cache gelagert werden - allerdings einschließlich der LOB Objekte. Um den Full Database
Mode zu nutzen, muss dieser zusätzlich im MOUNT Stadium der Datenbank separat eingeschaltet werden.
Dieses Feature steht übrigens in allen Editionen zur Verfügung und ist somit auch gut geeignet für
"kleine" Standard Edition Datenbanken.
Das Setup
"Force Full Database Caching" wird wie der Name schon anzeigt, nicht automatisch aktiviert, sondern muss explizit vom Administrator
im MOUNT Stadium der Datenbank eingeschaltet werden. In einer Multitenant Umgebung bezieht sich diese Einstellung auf alle PDBS - dies ist also eine "Container"-
weite Entscheidung.
Um in meiner Beispielumgebung das Ganze zu demonstrieren, überprüfe ich zuerst den genutzten Speicher
in der Datenbank und das zur Verfügung stehende Memory. Offensichtlich ist der Buffer Cache ausreichend konfiguriert.
Danach schalten wir den Full Database Mode im MOUNT Stadium der Datenbank ein. Dies bedeutet
auch, dass die Information im Control File gespeichert wird.
Daher ist es sinnvoll direkt nach em Umsetzen des Modus ein Backup vom Controlfile zu erstellen.
Die Information über den Full Database Caching Mode der Datenbank lässt sich dann auch in der Alert Datei nachlesen.
Um Missverständnisse zu vermeiden: Nach der Konfiguration einer Datenbank im Force Full Database Mode werden
nicht automatisch alle Objekte in den Cache verlagert. Es muss zuerst ein Zugriff auf die Objekte erfolgen.
Überprüfen wir unsere Umgebung und betrachten wir dabei die Objekte des Users SCOTT.
Ohne Zugriffe sind keine Objekte im Cache zu verzeichnen.
Folgende Objekte stehen übrigens im Schema SCOTT zur Verfügung.
Die Tabelle TEST_LOB besitzt eine LOB Spalte, die standardmässig nicht für den Cache vorgesehen ist.
Um die Funktion des Force Full Database Caching Mode zu demonstrieren, werden nun Zugriffe auf das
Lobsegment in zwei verschiedenen Umgebungen (mit und ohne Force Full Database Caching) durchgeführt.
Nun greifen wir mehrfach auf das Objekt TEST_LOB zu.
Wie zu erwarten war, sind in der aktuellen Umgebung mit Force Full Database Caching keine Physical Reads zu verzeichnen.
Offensichtlich ist auch das LOB Segment im Cache, obwohl es standardmässig als
NO CACHE angelegt wird (siehe oben).
Auch die Überprüfung der V$BH View bestätigt das Ergebnis.
Nun vergleichen wir dieses Ergebnis mit dem Verhalten im Default Database Caching Mode. Dazu fahren wir die Datenbank
herunter und schalten im MOUNT Stadium der Datenbank den No Force Full Database Caching Mode ein.
Danach öffnen wir die Datenbank und wiederholen die gleiche Abfrage in der geänderten Umgebung.
Der gleiche Zugriff auf das Segment weist nun Physical Reads auf.
Häufig wird die Frage gestellt, was passiert, wenn die Datenbank wächst und die Speicherplatzanforderungen
den Buffer Cache übersteigen? Wichtig zu wissen ist: Der Modus wird nicht automatisch umgeschaltet. Man wird wieder
Physical Reads feststellen. Allerdings wird eine Information in der Alert Datei wie folgt notiert:
Fazit
Force Full Database Caching eignet sich hervorragend für kleine Datenbanken, deren genutzter Speicherplatz
in den Buffer Cache passt. So kann man sehr einfach, die Datenbank Performance von Full Table Scans
und Zugriffen auf Large Objects erhöhen. Keine Änderungen an den
Abfragen oder Segmenten ist dazu erforderlich. Nicht verwechseln sollte man diese Funktion mit der Oracle Database In-Memory Option, die viel
weiter geht. Sie zeichnet sich durch eine neue Form der Cache Ablage aus - nämlich Spalten basiert und zusätzlich komprimiert - und
profitiert zusätzlich von speziellen optimierten Statementzugriffen. Mit dieser Technik können ausserordentliche Performancegewinne erzielt werden,
wie uns einige Kunden schon nach einer ersten Testphase bestätigen konnten.
Bevor man diese Funktion verwendet, sollte man allerdings sicherstellen, dass ausreichend Memory vorhanden ist. Für RAC
Umgebungen bedeutet dies, dass der aktuell genutzte Datenbankspeicherplatz kleiner
als der jeweilige (individuelle) Buffer Cache jeder Datenbank Instance ist. Ist der Workload in der RAC Umgebung
ausreichend gut partitioniert (bzgl. Instance Zugriff), kann der aktuell genutzte Datenbankspeicherplatz auch kleiner
als 80% des kombinierten Buffer Caches sein.
Zurück zur Community-Seite
|