Arbeiten mit External Tables
von Ulrike Schwinn, ORACLE Deutschland GmbH
External Tables sind seit Oracle 9i das geeignete Mittel, Datenmengen, die in Flat Files ausserhalb
der Datenbank gespeichert sind, im READ-ONLY Zugriff zu haben. In die Datenbank selbst werden keine Daten geladen,
sondern nur die Metadaten der External Tables gespeichert. Voraussetzung ist dabei die Beschreibbarkeit der Flat
Datei im "Oracle Access" Treiber-Format wie SQL*Loader und Datapump.
So können grosse Datenmengen aus Flat Dateien über External Tables einfach selektiert, über einen Join ausgewertet
oder sortiert werden wie mit normalen Tabellen. CREATE VIEW oder CREATE SYNONYM-Operationen sind ebenso möglich. Zu beachten ist allerdings,
dass keine DML-Operationen oder Indizierung erlaubt sind.
Darüberhinaus ist es seit Oracle 10g möglich, das Resultat eines beliebigen SELECT-Statements mit der
External Tables Technik zu entladen. Seit 11g Release 2 können die Flat Dateien für
die External Tables Nutzung vorab mit anderen Programmen aufbereitet werden (pre-processing). So können auch Daten, die nicht im Oracle Treiber
Format vorliegen, als Eingabe verwendet werden. Die Nutzung von External Tables bietet somit die Möglichkeit, Daten performant zu laden und zu entladen.
Der folgende Tipp zeigt an verschiedenen Beispielen die gesamte Bandbreite - bis einschliesslich 11g Release 2 Features -
der Funktionen der External Tables-Technik auf.
Als Einstieg steht die folgende Datei mit Namen prodDelta im logischen Directory data_dir auf dem Server zur Verfügung.
Ein Auschnitt der Datei sieht dabei folgendermassen aus:
Wie leicht zu erkennen ist, ist das Format dieser Datei prodDelta im SQL*Loader einfach zu beschreiben, so dass wir die Daten als External Table
zur Verfügung stellen können.
Folgendes Listing erzeugt eine External Table. Zuerst werden dabei die relationalen Spalten
angegeben, danach mit dem Parameter TYPE der Access Treiber (hier oracle_loader), der das Beschreibungsformat
festlegt. Der Ort und Name der Datei wird durch den Parameter DIRECTORY und LOCATION festgelegt. Der Abschnitt ACCESS PARAMETERS
legt die SQL*Loader-Beschreibung fest.
Das neuerzeugte Objekt products_delta lässt sich nun in verschiedenen Statements verwenden z.B. als Grundlage eines MERGE-Statements wie das folgende Beispiel zeigt.
Allerdings sind einige Einschränkungen zu berücksichtigen. So sind folgende Konstrukte nicht möglich:
DML-Operationen
Indizes
Virtuelle Spalten
Constraints
Temporäre Tabellen
Spezielle Datentypen wie Objekttypen, XMLTYPE oder LONG
Da die Anzahl der Zeilen unbekannt ist, kann auch keine Schätzung mit ESTIMATE_PERCENT bei der
Statistikberechnung erfolgen. So erhält man Statistiken auf External Tables nur über die Nutzung der COMPUTE-Option,
wie das folgende Beispiel zeigt:
Mit Oracle Version 10g sind External Tables um das Schreiben/Entladen von Daten erweitert worden.
Dabei werden die Daten aus der Datenbank in eine binäre Datei geschrieben und können dann einfach und schnell
auf einem anderen System zur Verfügung gestellt werden. Wie bei der ursprünglichen Verwendung von External Tables
ist auch hier der Zugriff auf ein logisches Datenbank-Directory notwendig. Das Entladen der Daten aus der Datenbank
erfolgt dann mit der erweiterten External Table-Syntax wie das folgende Listing zeigt. Im Unterschied zur 9i-Syntax wird
bei der Angabe der TYPE-Komponente der Wert oracle_datapump statt oracle_loader angegeben.
Das SELECT-Statement bestimmt dann den Inhalt der Daten.
Auf diese Weise ist eine binäre Datei mit Namen emp_dept.exp im logischen Directory data_dir erzeugt worden,
die auf das Zielsystem kopiert werden kann. Um nicht nur die Daten, sondern auch das passende
CREATE TABLE-Statement auf dem Zielsystem verfügbar zu haben, eignet sich die Nutzung des Package
DBMS_METADATA.
Das Ergebnis der Abfrage sieht dann folgendermassen aus:
Nach Ausführung des generierten CREATE TABLE-Statements und dem zur Verfügungstellen der binären Datei
im entsprechenden logischen Directory
auf dem Zieldatenbanksystem, stehen die Daten sofort für Abfragen zur Verfügung.
Neu in 11g Release 2 ist die Möglichkeit, Dateien die nicht im SQL*Loader Format vorliegen, zuerst
einen Preprozessor-Vorgang durchlaufen zu lassen.
Dies ist möglich mit der neuen zusätzlich Option PREPROCESSOR. Nehmen wir in unserem Beispiel an, dass die
Datei prodDelta nur gezippt als prodDelta.gz verfügbar ist. Der Preprocessor Vorgang wird also
den gzip Befehl mit entsprechender Option ausführen.
Unser Beispiel von oben sieht dann folgendermassen aus.
Zu beachten sind folgende Informationen:
Alle Programmaufrufe mit Argumentspezifikationen wie zum Beispiel 'gzip -c' müssen als Shell-Programm verfügbar sein.
Der vollständige Pfad des ausführenden Programms ist notwendig.
Es wird auf STDOUT geschrieben werden, damit die Verarbeitung stattfinden kann.
Das Privileg EXECUTE auf dem logischen Directory exec_dir, in dem die Preprozessor-Skripte liegen,
ist erforderlich.
Zusätzlich sind natürlich einige Sicherheitsaspekte zu berücksichtigen. Aus Sicherheitsgründen sollten
zum Beispiel separate Verzeichnisse für die Datendateien, die Preprozessor-Skripte, und Log- bzw. Bad-Dateien erzeugt
werden. WRITE- und EXECUTE- Privilegien sollten nicht gleichzeitig auf einem Directory existieren. Das CREATE ANY DIRECTORY- bzw.
DROP ANY DIRECTORY- Privileg sollte nur sparsam verwendet werden. Mehr Informationen dazu finden Sie im
Oracle Database Security Guide im Kapitel 10.
Um unser Beispiel kurz zu halten, sind nur die folgenden beiden logischen Directories und Zugriffsrechte erteilt
worden.
Die Log-und Bad-Dateien werden dabei in das logische Directory data_dir geschrieben. Dies sollte man aus Sicherheitgründen
natürlich in separate logische Directories legen. Das Shell-Programm gzip1.sh liegt im logischen Directory exec_dir und sieht folgendermassen aus:
$1 bezieht sich dabei auf die entspechende Datendatei - in unserem Fall prodDelta.gz.
Die Data Dictionary View USER_EXTERNAL_TABLES gibt generell Auskunft über die verwendeten External Tables.
Das folgende Beispiel zeigt einen Überblick über die verwendeten Beispiele:
Das Ergebnis sieht dann folgendermassen aus:
Mehr zu diesem Thema bzw. zu weiteren Themen rund um die Datenbank lesen Sie in den nächsten Ausgaben ...
Zurück zur Community-Seite
|