Der Result Cache in 11g: Nutzung, Administration und Monitoring
von Ulrike Schwinn, ORACLE Deutschland GmbH
Seit Oracle Database 11g gibt es einen neuen Cache-Bereich im Shared Pool,
der speziell für Ergebnismengen reserviert ist, den sogenannten Result Cache. Dieser Cache steht automatisch mit jeder 11g Enterprise Edition
zur Verfügung und kann ohne zusätzliche Installation eingesetzt werden.
Ergebnisse von Statements, die den Result Cache nutzen, werden bei der Ausführung im Result Cache abgelegt und bei den
Folgeausführungen wiederverwendet. Die Ausführungszeit reduziert sich dabei drastisch.
Um konsistente Abfragen zu garantieren, wird bei Änderungen an den Tabellenwerten der Cache automatisch invalidiert.
Statements, die sich häufig wiederholen und deren Ergebnisse nur mit aufwändigen Mitteln d.h. mit
hohem Ressourcenaufwand und Ausführungszeiten zu realisieren sind, können nun einfach vom Result Cache
profitieren.
Der Einsatz ist besonders in folgenden Fällen von Vorteil:
Langlaufenden und rechenintensive SQL-Abfragen
Rechenintensive PL/SQL-Funktionen
Vorhersehbare SQL-Abfragen
Gleichbleibende deterministische Ergebnismengen
Kleine Ergebnismengen bzw. ausreichendes Memory
Geringe DML-Aktivität auf den zugrundeliegenden Tabellen
Die einfache Nutzung und das Monitoring werden in folgenden Abschnitten an Beispielen illustriert.
Wie kann nun dieser Cache eingeschaltet bzw. aktiviert werden?
Folgende vier Initialisierungsparameter in 11g sind speziell
zur Administration und Nutzung des Caches neu eingeführt worden. Dabei sind die Parameter gleich nach der Installation mit Defaultwerten belegt. Somit kann der Cache sofort verwendet werden.
Die Defaultwerte lassen sich dabei je nach Parameter mit dem ALTER SESSION- oder dem ALTER SYSTEM- Befehl verändern.
Folgende Abfrage gibt Auskunft über die Parameter und die mögliche Wertebelegung:
Mit dem Parameter RESULT_CACHE_MAX_SIZE wird die Gesamtgrösse des reservierten Bereichs für den Result Cache
im Shared Pool festgelegt. Dabei wird der Speicher für Ergebnisse von SQL-Abfragen UND auch für Ergebnisse
von PL/SQL-Funktionen reserviert. Wird dieser Parameter auf den Wert 0 gesetzt, ist der Result Cache ausgeschaltet.
Der Defaultwert ist in der Regel allerdings ungleich 0.
RESULT_CACHE_MAX_RESULT legt den prozentualen Anteil am gesamten Result Cache für die einzelnen Ergebnisse fest.
Beide Parameter benötigen das ALTER SYSTEM- Privileg.
Wird auf Remote Objekte zugegriffen, kann mit dem Parameter RESULT_CACHE_REMOTE_EXPIRATION festgelegt werden,
wie lange das Resultat in Minuten im Cache verbleibt. Dieser Parameter ist mit ALTER SESSION oder ALTER SYSTEM einstellbar.
Der Initialisierungsparameter RESULT_CACHE_MODE ist für die Nutzung des Caches reserviert und mit dem Privileg ALTER SESSION verändert werden.
Dieser kann die Werte MANUAL (Default) oder FORCE besitzen und bestimmt die Art der Nutzung dieses Cachebereichs für SQL Abfragen.
MANUAL bedeutet dabei, dass der Hint /*+ RESULT_CACHE */ in der SQL-Abfrage eingetragen werden muss, damit der Result Cache genutzt wird.
FORCE hingegen erzwingt automatisch die Verwendung in jedem SELECT- Statement auf der Root-SELECT-Ebene.
Folgendes Beispiel zeigt die Anwendung unter Verwendung des Wertes MANUAL.
Die neue Operation "RESULT CACHE" im Ausführungsplan zeigt an, dass der Result Cache erzeugt bzw.
bei wiederholter Ausführung genutzt wird.
Wiederholen wir die Ausführung und stellen zudem sicher, dass die darunterliegende Tabelle nicht geändert wird, werden wir festellen, dass sich die Statistiken
im folgenden Beispiel geändert haben. Der Wert von "consistent gets" hat sich zum Beispiel auf 0 reduziert.
Der Cache ist nun im Einsatz, und die Ausführung der Abfrage ist schneller als beim ersten Mal.
Wird die Tabelle BIGEMP allerdings mit DML-Operationen verändert, wird der Cache automatisch invalidiert und beim nächsten Mal erneut geladen.
Im nächsten Beispiel wird der Parameter RESULT_CACHE_MODE auf FORCE gesetzt. Wie vorher schon angedeutet, wird nun automatisch
der Result Cache für das Gesamtergebnis der jeweiligen Abfragen zur Verfügung gestellt. Allerdings gilt dies nicht für Abfragen auf Objekte im Schema SYS und SYSTEM.
Soll dieses Result Cache-Verhalten allerdings für einzelne SELECT-Statements ausgeschaltet werden,
kann der Hint /*+ NO_RESULT_CACHE */ verwendet werden.
Weitere Anwendungsbeispiele auch zur Verwendung mit PL/SQL Funktionen finden sich auf der Oracle Application Express Community Seite unter
http://www.oracle.com/global/de/community/tipps/resultcache/index.html
Um einen Überblick über die gesamte Result Cache Nutzung zu erhalten und genaues Monitoring zu gewährleisten,
sind zusätzlich weitere neue V$-Tabellen und ein neues Package eingeführt worden.
Das neue Package DBMS_RESULT_CACHE hilft z.B. dabei einfache administrative Aufgaben rund um den Result Cache durchzuführen.
So kann z.B mit DBMS_RESULT_CACHE.FLUSH() der Cache bereinigt (flush) werden.
DBMS_RESULT_CACHE.MEMORY_REPORT() gibt einen Gesamtüberblick über die Verwendung der Blöcke.
Folgendes Beispiel zeigt die Anwendung von DBMS_RESULT_CACHE.MEMORY_REPORT:
Offensichtlich ist ein (1) Block für ein SQL Ergebnis-Resultat und ein (1) Block für ein PL/SQL-Funktionsergebnis reserviert.
Allokiert sind im Moment nur 0.027% des Shared Pools, da wir gerade mit dem
Cachen von Ergebnissen begonnen haben. Im weiteren Verlauf wird sich natürlich dieser Wert entsprechend erhöhen.
V$RESULT_CACHE_OBJECTS gibt darüberhinaus Aufschluss über die Nutzung der einzelnen Ergebnisse im Cache
und ihre Abhängigkeiten. So kann man genau feststellen, wie häufig z.B. ein "Cache-Objekt" vom Typ "Result" oder "Dependency"
verwendet worden ist, oder ob und wie häufig dieses invalidiert worden ist.
Möchte man nun genau prüfen, welche Ergebnisse im Result Cache verwaltet werden, sollte man folgende Abfrage durchführen:
Die beiden Ergebnisblöcke setzen sich offensichtlich aus der Abfrage 'SELECT /*+ result_cache */ COUNT(*) ...'
und der ausgeführten PL/SQL Funktion HR.GET_DATUM zusammen. Dabei ist das Ergebnis der Abfrage schon 4 mal genutzt worden (siehe Spalte SCAN_COUNT).
Invalidierungen, d.h. Änderungen an den abhängigen Objekten (z.B. an der Tabelle BIGEMP) sind nicht erfolgt, wie am Spaltenwert 0 der Spalte INVALIDATIONS
zu erkennen ist.
Einige abschliessende Beispiele illustrieren im Folgenden die weitere Verwendung.
1) Im ersten Beispiel sollen Veränderungen an einer darunterliegenden Tabelle durchgeführt werden.
Aus diesem Grund verändern wir die Tabelle BIGEMP mit folgendem Statement:
Danach wird die erste Abfrage von oben mehrfach ausgeführt. Das Ergebnis in V$RESULT_CACHE_OBJECTS zeigt die Invalidierung
in der Spalte "INVALIDATIONS" der Tabelle HR.BIGEMP an. Der Status des "alten" Resultats ändert sich auf "Invalid",
parallel dazu wird eine neue Zeile mit den Informationen des neuen Result Cache erzeugt. Diese besitzt den Status "Published".
Mittlerweile wurde das Resultat schon 5 Mal genutzt, wie in der Spalte SCAN_COUNT zu sehen ist.
2.) In den nächsten Beispielen sollen unterschiedliche Abfragen durchgeführt werden. Dabei soll
überprüft werden, ob die existierenden Result Caches genutzt oder ob neue Result Cache Bereiche erzeugt
werden.
Folgende Queries, die diegleiche Ergebnismenge besitzen, werden nun ausgeführt:
Im nächsten Beispiel werden Bindvariablen in SQL*Plus verwendet, und folgende Abfragen ausgeführt:
Das Ergebnis in V$RESULT_CACHE_OBJECTS sieht dann folgendermassen aus:
Für die verwendeten Abfragen wurden neue Result Cache Bereiche erzeugt. Änderungen
an den Statements durch Hinzufügen der Schemabezeichnung oder einer WHERE-Klausel oder
die Anwendung von verschiedenen Werten bei Bindvariablen führen offensichtlich in unserem Test
zur Erweiterung des Result Caches.
Mehr zu diesem Thema bzw. zu weiteren Themen rund um die Datenbank lesen Sie in den nächsten Ausgaben ...
Zurück zur Community-Seite
|