|
Partitionierung für Fortgeschrittene
von Frank Schneede, ORACLE Deutschland B.V. & Co. KG
In großen Datenbanken wird Partitionierung eingesetzt, um die Datenmengen, die eine einzelne Abfrage bewegen muss, zu reduzieren. Die aktuelle Datenbankversion Oracle 11g
bietet umfangreiche Erweiterungen, die dem DBA die Arbeit mit partitionierten Objekten stark vereinfacht. Einige grundlegende Funktionen wurden bereits in dem Community-Artikel
Partitionspflege mit Oracle 11g leicht gemacht vorgestellt.
Um die Beschreibung der Möglichkeiten abzurunden, die durch den Einsatz von Partitionierung gegeben sind, soll dieser Artikel die in der DBA Community bislang nicht näher erläuterten
Partitionierungsmethoden der Zusammengesetzten Partitionierung und System Partitionierung beschreiben.
Bereits mit der Datenbankversion Oracle 8i wurde die Zusammengesetzte Partitionierung als Range-Hash Partitionierung eingeführt. In der Datenbankversion Oracle 9i ist
die Erweiterung um Range-List Partitionierung erfolgt. Die Erfordernisse vieler Datawarehouses benötigen jedoch noch andere Methoden der Zusammengesetzten Partitionierung, die in der
aktuellen Datenbank Oracle 11g ergänzt worden sind.
Wenn sich in einer großen Tabelle kein offensichtliches Partitionierungskriterium findet, so kann trotzdem mittels der neuen System Partitionierung
eine Aufteilung der Daten und damit eine Steigerung der Abfrageperformance erreicht werden. System Partitionierung ist noch weitestgehend unbekannt und soll daher im
folgenden Artikel ebenfalls behandelt werden.
Zusammengesetzte Partitionierung
In Projekten, in denen es um die Analyse sehr großer Datenmengen geht, ist es sehr wichtig, die Daten so aufzuteilen, dass eine möglichst große Zahl von Abfragen
von der Aufteilung profitieren können. Bei der Festlegung der Partitionierungsstrategie war man bislang eingeschränkt. Ein Kriterium, das sich in Bereichen darstellen lies,
musste stets an erster Stelle kommen. Hierfür wurde oft das meistens ohnehin vorhandene Kriterium der Dimension Zeit benutzt. Als Subpartitionierung war lediglich eine Aufteilung in eine
festgelegte Anzahl von Subpartitionen möglich. Letzteres konnte wahlweise mit Hash Partitionierung oder durch die Auflistung diskreter Werte in Form von List Partitionierung geschehen.
Der eigentliche Gedanke, den man bei der Definition einer Partitionierungsstrategie beachten sollte, nämlich die Kardinalität des Partitionierungskriteriums, musste zwangsläufig
hintenan gestellt werden. In Oracle 11g hat sich das nun grundlegend geändert, die Partitionierungsstrategie kann ohne weiteres den Erfordernissen des Geschäftes - oder besser
der Abfragen - angepasst werden. Die folgende Auflistung zeigt die nun möglichen Kombinationen.
- Range-Hash Partitionierung (eingeführt in 8i)
- Range-List Partitionierung (eingeführt in 9i)
- Range-Range Partitionierung (eingeführt in 11g)
- List-Hash Partitionierung (eingeführt in 11g)
- List-List Partitionierung (eingeführt in 11g)
- List-Range Partitionierung (eingeführt in 11g)
- Interval-Hash Partitionierung (eingeführt in 11g)
- Interval-List Partitionierung (eingeführt in 11g)
- Interval-Range Partitionierung (eingeführt in 11g)
- Hash-Hash Partitionierung (eingeführt in 11g R2)
Die Intervall Partitionierung ist als Sonderfall der Range Partitionierung zu betrachten. Einzige Einschränkung ist (noch), dass die Intervall Partitionierung nur als oberste
Partitionierungsmethode gewählt werden darf.
Das folgende Beispiel aus der Vergangenheit zeigt, dass komplexe Partitionierungsstrategien nicht abgebildet wurden, weil die Technologie es einfach nicht hergab. Hier wurde
eine idealerweise mehrstufige Partitionierung als Range Partitionierung auf mehreren Spalten abgebildet.
Absicht einer Partitionierungsstrategie ist es, das Datenvolumen, welches durch Abfragen bearbeitet werden muss, durch Ausblenden nicht relevanter Partitionen einzuschränken. Dieser
Vorgang wird als Partition Pruning bezeichnet. Und hier lag in früheren Datenbankversionen bei der oben beschriebenen Datenstruktur das Problem. Partition Pruning fand
nämlich nur statt, wenn über die Prädikate auf den Spalten modelljahr, land_kunde, marke, modelljahr & land, modeljahr & land_kunde & marke
eine eingeschränkt wurde, die Abfrage also die führenden Bestandteile des Partitionierungsschlüssels beinhaltete.
Wurde hingegen nur mit den Prädikaten auf land_kunde, marke oder land_kund & marke gefiltert, so konnte kein Partition Pruning stattfinden! Durch die
Einführung des Multi-Column Partition Pruning in Oracle 10g R2 besteht allerdings mittlerweile kein Handlungsbedarf mehr, die Partitionierungsstrategie zu ändern.
Die Ausführungspläne zweier einfacher Statements zeigen das vorausgesagte Verhalten. In der ersten Abfrage erfolgt ein statischer Zugriff auf eine einzelne Partition.
Die zweite Abfrage zeigt, dass nun mit dynamischem Multi-Column Partition Pruning, im Ausführungsplan sichtbar durch KEY(MC), ebenfalls Partition Pruning
erfolgt.
In Oracle 11g kann man die Partitionierung verbessern, indem die Partitionierung der Tabelle FAHRZEUGE z. B. nach List-Range erfolgt. Dieses Beispiel soll nur
die grundsätzliche Möglichkeit der Partitionierung darstellen. In der Realität muss die gewählte Strategie von der Abfragecharakteristik abhängig
gemacht werden. In diesem Beispiel bedeutet das, ob eher nach Modelljahr oder nach Markt/Marke abgefragt wird. Entsprechend sollte dann die Partitionierung festgelegt werden.
Neben dem wesentlich übersichtlicheren Code zeigt sich, dass die Ausführungspläne sich leicht verändern. Im Fall der ersten Abfrage, die genau auf die
Partitionierungsschlüssel abgestimmt ist, wird auch hier nur eine einzelne Subpartition durchgearbeitet. In der zweiten Abfrage wird über alle Partitionen
iteriert und jeweils die über den Filter ermittelte Subpartition durchgearbeitet. Partition Pruning können wir also in beiden Beispielen feststellen.
Die Unterschiede liegen zwischen den beiden Beispielen eher im Detail,
was sich allerdings bei sehr großen Datenmengen - hier wurde mit jeweils 300000 Datensätzen gearbeitet - durchaus bemerkbar machen kann.
Dieses Beispiel illustriert, dass mit der neuen Zusammengesetzten Partitionierung eine deutlich bessere Abbildung der Geschäftsvorfälle möglich ist. Welche Partitionierungsstrategie
letztlich zum optimalen Ergebnis führt, ist von den gestellten Abfragen abhängig und muss jeweils im Einzelfall geprüft werden.
System Partitionierung
Die Methode der System Partitionierung ist für einen möglicherweise seltenen Anwendungsfall entwickelt worden, trotzdem möchte ich sie hier in Grundzügen vorstellen.
Es ist denkbar, dass ein DBA kein offensichtliches Kriterium für eine sinnvolle Partitionierung findet. Die Konsequenz wäre vor Oracle 11g gewesen, dass mit einer sehr großen
monolithischen Tabellen gearbeitet werden müsste, was zu einem erhöhten Pflegeaufwand für Indizes usw. führt. Falls die Anwendungsentwicklung sicherstellen kann, dass auf einzelne Partitionen
in "intelligenter" Weise zugegriffen wird, dann ist es möglich, aus der Anwendung die Datensätze in der geeigneten Partition zu platzieren. Der DBA bzw. die Datenbank muss nur
entsprechende Partitionen zur Verfügung stellen. Genau das ist der Einsatzzweck der System Partitionierung.
Hier ein kleines Beispiel. Es sind keine Partitionierungsschlüssel oder -grenzen festgelegt, die Datenbank erzeugt schlicht zwei Segmente anstelle einer monolithischen Tabelle.
Ein lokaler Index kann angelegt werden und wäre dann ebenso partitioniert wie die Tabelle.
Eine Überprüfung der Partitionierung zeigt die gewählte Methode System. Da bei der System Partitionierung keine Werte zugrundegelegt werden,
zeigt die Spalte high_value der Data Dictionary View user_tab_partitions natürlich keinen Wert.
Wenn nun kein Partitionierungsschlüssel oder ein sonstiger über Range, List oder Hash Partitionierung erzeugter Wert existiert, woher weiß die Datenbank dann, wohin ein
einzufügender Satz geschrieben werden soll? Ganz einfach: Oracle weiß es nicht! Diese Entscheidung muss aus der Anwendung heraus gefällt werden. Folgendes Beispiel:
Beim Löschen und Aktualisieren von Datensätzen tritt natürlich ein ähnliches Problem auf. Wenn die Partition nicht explizit angegeben wird, so muss die
Datenbank alle Partitionen scannen, um den betreffenden Datensatz zu finden. Daher sollte auch in diesem Fall die Angabe der Partition erfolgen.
Mit der Nutzung der System Partitionierung können die Vorteile der Partitionierungstechnik genutzt werden, vorausgesetzt, die Anwendung lässt sich dementsprechend
gestalten. Es sind jedoch auch einige systemimmanente Einschränkungen zu beachten, die folgenden Operationen/Features sind bei System Partitionierung nicht möglich.
- create table as select
- insert into table as select
- Split Partition Operationen
- Unique Local Indizes, da diese einen Partitionierungsschlüssel benötigen
Um die geschilderten Einschränkungen zu umgehen, kann man die gewünschte Zieltabelle anlegen und dann explizit die Partitionen befüllen.
Insgesamt bietet die Partitioning Option ab Version Oracle 11g einige Funktionen, die eine Optimierung des Datenmodells in Hinblick auf die geschäftlichen
Erfordernisse ermöglicht. Für den Fall, dass alle gängigen Partitionierungsmethoden nicht einsetzbar sind, kann durchaus auch die Methode der
System Partitionierung evaluiert werden. Um die oben gezeigten Beispiele nachvollziehen zu können, ist hier
ein Skript mit den verwendeten Statements hinterlegt.
Mehr zu diesem Thema bzw. zu weiteren Themen rund um die Datenbank lesen Sie in den nächsten Ausgaben ...
Zurück zur Community-Seite
|