Platz sparen mit Deferred Segment Creation in 11.2.0.2
von Frank Schneede, ORACLE Deutschland B.V. & Co. KG
Mit dem Anlegen von Tabellen wurden bis zur Version Oracle 11g abhängig vom Objektattribut MINEXTENTS automatisch ein
oder mehrere initiale Extents erzeugt. Durch die Installation
von Anwendungssystemen wie zum Beispiel Standardsoftware (SAP, Oracle EBS, ...) werden sehr viele Objekte in der Datenbank angelegt.
Für diese Objekte wird allein durch das Anlegen schon sehr viel Plattenplatz verbraucht, ohne dass bereits Daten im Schema
geladen sind. Kunden, deren Systeme bei einem Dienstleister betrieben werden, sind von diesem Umstand in besonderer Weise betroffen.
IT Dienstleister messen ihren Aufwand nämlich auch in der Menge des verbrauchten Plattenspeichers und stellen diesen dem Kunden
in Rechnung. Aus diesem Grunde ist das Erzeugen vieler leerer Segmente für diese Kunden ein ärgerliches und vor allem
teures Unterfangen!
Mit der Datenbankversion Oracle 11gR2 wurde die Funktionalität der deferred segment creation
eingeführt. Das bedeutet, dass Tabellen bei ihrer Erzeugung zwar im Data Dictionary registriert werden, Segmente aber erst dann
angelegt werden, wenn die Tabelle mit Daten gefüllt wird. Leider war diese Funktionalität noch sehr restriktiv implementiert,
so konnten zum Beispiel partitionierte Objekte noch nicht von der deferred segment creation profitieren. Mit dem aktuellen Patchset, der
Version 11.2.0.2, wurden einige Verbesserungen implementiert, die in diesem Tipp anhand von Praxisbeispielen vorgestellt werden.
Initialisierungsparameter DEFERRED_SEGMENT_CREATION
Projekte, die mit der aktuellen Datenbankversion 11.2.0.2 starten, können unmittelbar von der deferred segment creation
profitieren. Standardmäßig ist die Datenbank nämlich so eingestellt, dass Segmente erst bei der Befüllung mit Daten
angelegt werden. Der Initialisierungsparameter DEFERRED_SEGMENT_CREATION, der dynamisch änderbar ist, steuert das Verhalten.
Über ALTER SESSION oder ALTER SYSTEM Kommandos kann der Anwender, vorausgesetzt er hat die entsprechenden Berechtigungen, das System
nach seinen Bedürfnissen einrichten. Ein Punkt, der dabei beachtet werden sollte, ist die Arbeitsweise der Anwendung, die mit nicht
existierenden Segmenten zurecht kommen muss. Falls die Anwendung nämlich auf die Data Dictionary View DBA_SEGMENTS zugreift, um aus den
Segmentnamen Aktionen abzuleiten, so müssen die Segmente vorhanden sein. Es besteht daher die Möglichkeit, die Segmente auch ohne
Befüllen mit Daten anzulegen.
Erweiterung PL/SQL Package dbms_space_admin
Das Erzeugen ("Materialisieren") von Segmenten ohne das gleichzeitige Befüllen mit Daten geschieht mit dem PL/SQL Package
DBMS_SPACE_ADMIN - nicht zu verwechseln mit
dem PL/SQL Package DBMS_SPACE, das in erster Linie dazu
gedacht ist, das Wachstum und den Platzbedarf eines spezifischen Segmentes auszuwerten.
Das Package wird mit SYS Privilegien ausgeführt, das Ausführungsrecht ist für jeden Benutzer (PUBLIC) freigegeben. Der aufrufende Benutzer
muss lediglich das Recht besitzen, das betreffende Objekt zu analysieren. Das Package wird genutzt, um Segmente zu erzeugen ("materialisieren") und - was
im Fall einer auf 11.2.0.2 aktualisierten Datenbank sicher eher Relevanz besitzt - Segmente zu entfernen. Im folgenden Syntaxbeispiel wird
das Vorgehen gezeigt.
Das Beispiel zeigt die Funktionsweise des neuen Package und die entscheidende Erweiterung der deferred segment creation.
Das verzögerte Anlegen von Segmenten funktioniert mit der aktuellen Version 11.2.0.2 nämlich auch mit partitionierten
Tabellen! Die Abfrage der Data Dictionary View DBA_TAB_SUBPARTITIONS zeigt genau das gewünschte Bild.
Das Anlegen insbesondere zahlreicher großer Segmente kann viel Zeit kosten, die beispielsweise während eines Ladeprozesses in ein Datawarehouse
nicht unbedingt zur Verfügung steht. In einem solchen Fall können für die gesamte Tabelle die Segmente vorbereitet werden. Im
weiteren Verlauf des begonnenen Beispiels werden über das PL/SQL Package sämtliche Segmente erzeugt, die anschließend jedoch
nicht alle mit Daten befüllt und daher durch den Aufruf des Package DBMS_SPACE_ADMIN.DROP_EMPTY_SEGMENTS entfernt werden können.
Die Abfrage des Data Dictionary zeigt, welche Segmente Inhalte (Blöcke) haben und welche leeren Segmente entfernt wurden.
Die nicht befüllten Partitionen sind in erster Linie Überlaufpartitionen, die zur Absicherung des Ladeprozesses
vorhanden sein müssen, jedoch idealerweise nie mit Daten gefüllt werden. Durch den Aufruf
des PL/SQL Package DBMS_SPACE_ADMIN.DROP_EMPTY_SEGMENTS können durch die Belegung der sprechenden Parameter
leere Segmente eines Schemas, einer Tabelle oder einer einzelnen Partition entfernt werden. Wenn der Aufruf von
DBMS_SPACE_ADMIN.DROP_EMPTY_SEGMENTS ohne Parameter erfolgt, werden alle leeren Segmente eines Systems
mit einem Aufruf entfernt. Diese Methode empfiehlt sich bei Altsystemen mit vielen leeren Segmenten, deren Datenbankversion
auf 11.2.0.2 angehoben worden ist.
Neben den eigentlichen Tabellen- oder Partitionssegmenten werden beim Aufruf von DBMS_SPACE_ADMIN.DROP_EMPTY_SEGMENTS auch die
zugehörigen Indexsegmente und LOB-Daten sowie deren Indexsegmente entfernt. Die folgenden Einschränkungen der deferred segment creation
gelten weiterhin und werden bei der Package Ausführung berücksichtigt:
- deferred segment creation wird nicht unterstützt für Objekte der Schemata SYS, SYSTEM, PUBLIC, OUTLN, oder XDB
- deferred segment creation wird nicht unterstützt für index-organized tables, clustered tables, globale und Session-spezifische temporary tables, internal tables, typed tables, AQ tables, external tables
- deferred segment creation wird nicht unterstützt für Bitmap Join und Domain Indizes
- deferred segment creation wird nicht unterstützt für nicht-partitionierte Objekte in Dictionary-managed Tablespaces
- INSERT-Operationen innerhalb von serialisierbaren Transaktionen laufen auf einen Fehler, wenn das Segment noch nicht vorhanden ist.
Entfernen Segmente mit TRUNCATE TABLE
Mit dem SQL-Befehl TRUNCATE TABLE wurden bislang auf sehr schnelle Weise sämliche Daten aus einer Tabelle entfernt und die Highwater Mark auf die
Größe zurückgesetzt, die durch den Parameter MINEXTENTS in der Tabelledefiniton vorgegeben ist. Das leere Segment blieb erhalten. In Version 11.2.0.2
wurde die Syntax des Befehls TRUNCATE TABLE erweitert, um auch das letzte Segment freigeben zu können.
Durch Angabe der Storage Klausel DROP ALL STORAGE werden die angelegten Segmente geleert und vom Speicher entfernt.
Interne Änderung der Standardgröße der inititalen Extents
Die Verwendung der deferred segment creation ist in der aktuellen Version 11.2.0.2 für partitionierte Tabellen besonders wichtig,
denn für partitionierte Tabellen hat sich die Standard Größe der initialen Extents von 64kB auf 8MB geändert! Das folgende
Rechenbeispiel unterstreicht das Gesagte. Die in dem oben gezeigten Beispiel angelegte Tabelle hat 65 Partitionen bzw. Subpartitionen. Bisher
wäre die initiale Größe des gesamten Objektes ca. 4MB. In der Version 11.2.0.2 würden für das Objekt in Summe 520MB
allokiert! Die nachfolgend zu allokierenden Extents haben dann standardmäßig die Größe 1MB.
Exportieren und Importieren von Objekten, die mit deferred segment creation angelegt sind
Das Utility Data Pump Import ist ebenfalls um die Funktionalität der deferred segment creation erweitert worden. Durch die Verwendung des
Parameters TRANSFORM kann die SEGMENT CREATION Klausel zum CREATE TABLE Statement exportierter Tabellen hinzugefügt werden. Die Syntax sieht folgendermaßen aus:
Wird die Transformation auf y gesetzt, so erscheint explizit SEGMENT CREATION DEFERRED oder SEGMENT CREATION IMMEDIATE im CREATE TABLE Statement, je nachdem, wie
die Tabelle ursprünglich definiert worden ist. Dieses ist die Standardeinstellung. Wenn SEGMENT_CREATION:n gesetzt ist, so erscheint die SEGMENT CERATION Klausel nicht
und die Tabelle wird mit den Standardeinstellungen der Datenbank angelegt. Die Transformation SEGMENT_CREATION ist nur für Tabellen-Objekte gültig!
Benutzer, die auch heute noch auf das mittlerweile abgekündigte Utility export zurückgreifen, sollten beachten, dass Objekte ohne Segmente mit dieser Methode
nicht exportiert werden können! Daher sollte spätestens jetzt auf Data Pump umgestellt werden!
Fazit
Die deferred segment creation ist in der Oracle Version 11.2.0.2 sehr sinnvoll erweitert worden und bietet dem Datenbankadministrator viele Möglichkeiten,
signifikant Platz und damit auch Kosten einzusparen. Detaillierte Informationen zu den neuen Funktionen rund um den Speicherplatz bietet der
Database Administrator's Guide. In folgenden Community Tipps finden Sie
weitere nützliche Hinweise, den Speicherbedarf Ihrer Datenbanken zu optimieren.
Mehr zu diesem Thema bzw. zu weiteren Themen rund um die Datenbank lesen Sie in den nächsten Ausgaben ...
Zurück zur Community-Seite
|