BEGIN DBMS_XMLSCHEMA.registerSchema( SCHEMAURL => 'http://www.ordix.de/binary_xml.xsd', SCHEMADOC => '<XMLSCHEMA>', LOCAL => FALSE, GENTYPES => FALSE, GENBEAN => FALSE, GENTABLES => FALSE, FORCE => FALSE, OPTIONS => DBMS_XMLSCHEMA.REGISTER_BINARYXML, OWNER => USER); END;
CREATE TABLE binary_xml_test1( id NUMBER(2), doc XMLTYPE) XMLTYPE COLUMN doc STORE AS BINARY XML;
CREATE TABLE binary_xml_test2( id NUMBER(2), doc XMLTYPE) XMLTYPE COLUMN doc STORE AS BINARY XML XMLSCHEMA "http://www.ordix.de/binary_xml.xsd" ELEMENT "Auto";
CREATE TABLE binary_xml_test3( id NUMBER(2), doc XMLTYPE) XMLTYPE COLUMN doc STORE AS BINARY XML XMLSCHEMA "http://www.ordix.de/binary_xml.xsd" ELEMENT "Auto" ALLOW NONSCHEMA;
CREATE TABLE binary_xml_test4( id NUMBER(2), doc XMLTYPE) XMLTYPE COLUMN doc STORE AS BINARY XML ALLOW ANYSCHEMA;
CREATE TABLE binary_xml_test5( id NUMBER(2), doc XMLTYPE) XMLTYPE COLUMN doc STORE AS BINARY XML ALLOW ANYSCHEMA ALLOW NONSCHEMA;
INSERT INTO binary_xml_test2 VALUES (1,XMLType('<?xml version="1.0" encoding="UTF-8"?> <Auto xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.ordix.de/ binary_xml.xsd"> <Herstellerliste> <Hersteller id="1"> <Name>Motorenwerke Rüdesheim</Name> </Hersteller> </Herstellerliste> </Auto>'));
XMLType-Daten konnten bisher auf zwei verschiedene Arten gespeichert werden:
Bei der strukturierten Speicherung ist das Abspeichern der XML-Dokumente und der Zugriff auf die Dokumente wesentlich performanter, da nicht mehr das ganze XML-Dokument gelesen werden muss. Zudem können Indizes bei der strukturierten Speicherung für eine bessere Performance sorgen. Darüber hinaus wird weniger Speicherplatz benötigt, da nicht zu jedem in der XMLType-Spalte abgelegten XML-Dokument jeder Tag-Name abgespeichert werden muss.
Binary XML ist eine neue Speicherungsmethode für XMLType-Daten. Dabei soll diese Speicherungsform die bisherigen nicht ablösen, sondern ergänzen. Die Speicherungsmethode Binary XML speichert XML-Dokumente in einem speziell für XML-Daten entworfenen Binärformat in der Datenbank.
Die Verwendung von Binary XML führt zu einer effizienteren Speicher-, CPU- und Netzwerkauslastung. Da die XML-Dokumente im speziellen Binärformat in der Datenbank abgelegt werden, wird der Speicherplatz, der für das Speichern der XML-Dokumente benötigt wird, reduziert. Es ist nicht mehr nötig, andere Kompressionstechniken, wie z. B. das Zippen von Dokumenten, zu verwenden. Die Speicherung als Binary XML sorgt für eine effektivere Speicher- und CPU-Auslastung, da das Parsen und Serialisieren der XML- Daten beim Austausch der Daten zwischen den einzelnen Applikationsschichten bzw. vor dem Speichern in der Datenbank wegfällt. Bei der Verwendung von Binary XML als Speichermethode für XML-Dokumente wird der Netzwerk-Overhead verringert, da für die Übertragung das kompakte, interne Format verwendet wird und nicht das traditionelle serialisierte Textformat.
Nachteilig ist dabei allerdings, dass die XML-Dokumente nicht mehr ohne weiteres editiert werden können. Hier müssen dann die entsprechenden Funktionen des Datentyps XMLType verwendet werden. Weitere Informationen über XMLType finden Sie in dem ORDIX News Artikel der Ausgabe 1/2007 [1] .
Nutzt man die Speichermethode Binary XML, so kann man Knoten und Dokumentteile effizient aus dem XML-Dokument extrahieren. Das Format Binary XML erlaubt Streaming XPath Evaluierung, womit mehrere Knoten oder mehrere Teile des XML-Dokuments in einem einzigen Dokumentdurchlauf extrahiert werden können.
Für die Speichermethode Binary XML liefert Oracle einen neuen Parser und einen neuen XML-Schema-Validator mit. Weder der Parser noch der Validator nutzen einen DOM-Baum zum Parsen bzw. Validieren der Daten. Dies führt zu einer geringeren CPU-Auslastung, weil der DOM-Baum immer im Hauptspeicher aufgebaut wird. Zudem wird der Overhead beim Update von XML-Dokumenten verringert, da nach einem Update nicht mehr das komplette XML-Dokument sondern nur der aktualisierte Teil des Dokuments neu validiert wird.
Binary XML bietet einen flexiblen XML-Schema-Support. So können beim Anlegen einer Tabelle verschiedene Encodings angegeben werden. Über diese Encodings wird geregelt, ob die zu speichernden XML-Dokumente einem XML-Schema genügen müssen oder nicht. Im Gegensatz zur strukturierten Speicherung des XMLType kann hier aber nicht nur ein Schema angegeben werden, das in der gesamten Tabelle verwendet wird. Es können mehrere XML-Schemata angegeben werden, denen die zu speichernden XML-Dokumente genügen müssen.
Binary XML unterstützt den Standard W3C XLIFF. Wenn das Dokument sprachspezifische Inhalte enthält, so wird beim Zugriff auf das XML-Dokument nur der Inhalt zurückgeliefert, der zu den entsprechenden Locale-Einstellungen passt.
Nachdem wir erfahren haben, was Binary XML ausmacht, wenden wir uns nun der eigentlichen Verwendung dieser Speicherungsform zu. Dabei wird vor allem auf die einzelnen Encoding-Optionen dieser Speicherungsform eingegangen.
Damit ein XML-Schema für das Encoding einer XMLType-Spalte, die die Speicherungsform Binary XML verwendet, eingesetzt werden kann, muss es zunächst in der Datenbank registriert werden. Es reicht dabei nicht, das Schema auf dem herkömmlichen Weg zu registrieren. Es muss die Option DBMS_XMLSCHEMA.REGISTER_BINARYXML mitgegeben werden. Erst dann kann das XML-Schema beim Anlegen von Tabellen und beim Einfügen von Werten verwendet werden (siehe Abbildung 1).
Wird das XML-Schema auf dem herkömmlichen Weg (DBMS_XMLSCHEMA.registerSchema('http://www.ordix.de/binary_xml.xsd',xml_schema);) registriert, so kommt es beim Anlegen einer Tabelle mit einer XMLType-Spalte mit der Speicherungsform Binary XML, zu folgendem Fehler:
FEHLER in Zeile 1: ORA-44424: BINARY-XML-Speicher erfordert, dass XML-Schema für BINARY-Gebrauch registriert ist.
Um den Fehler zu beheben, muss das XML-Schema, wie in Abbildung 1 beschrieben, registriert werden.
Beim Anlegen von Tabellen mit XMLType-Spalten gibt man im Storage Clause an, welche Speicherungsform verwendet werden soll. Wird die Speicherungsform nicht angegeben, so nimmt die Datenbank die textbasierte Speicherung. Soll die Speicherungsform Binary XML verwendet werden, so gibt man im Storage Clause die Option „STORE AS BINARY XML“ an. Zusätzlich zu dieser Option kann auch noch angegeben werden, ob und wie ein XML-Schema verwendet werden soll. Dazu muss beim Anlegen der Tabelle das Encoding mit angegeben werden. Die einzelnen Optionen werden in den folgenden Absätzen beschrieben.
Beim Speichern von XML-Dokumenten in einer mit diesem Encoding angelegten Spalte, wird kein XML-Schema verwendet. Die XML-Dokumente werden beim Insert und beim Update nicht gegen ein XML-Schema validiert. Wenn im XML-Dokument ein XML-Schema angegeben worden ist, wird dieses ignoriert (siehe Abbildung 2).
Diese Option wird verwendet, wenn das zu speichernde XML-Dokument einem einzelnen XML-Schema entsprechen soll. Das entsprechende CREATE TABLE Statement ist in Abbildung 3 dargestellt. Dieses Schema muss zunächst, wie oben beschrieben, in der Datenbank registriert werden. Möchte man in eine solche Spalte XML-Dokumente einfügen, die nicht dem registrierten XML-Schema entsprechen, so kommt es zu einem Fehler.
Beim Speichern von XML-Dokumenten in einer mit diesem Encoding angelegten Spalte, wird für alle XML-Schema-basierten XML-Dokumente ein auf dem referenzierten Schema basierendes Encoding verwendet. Für alle nicht-XML-Schema-basierten XML-Dokumente wird ein nicht-schema-basierendes Encoding verwendet. Die Abbildung 4 zeigt das entsprechende CREATE TABLE Statement. Das angegebene Schema muss zunächst, wie in Abbildung 1 beschrieben, in der Datenbank registriert werden. Versucht man in eine Spalte ein XML-Dokument einzufügen, welches ein XML-Schema referenziert, diesem aber nicht entspricht, kommt es zu einem Fehler. Versucht man in eine Spalte ein XML-Dokument einzufügen, das kein XML-Schema referenziert, kommt es nicht zu Fehlern.
Beim Speichern von XML-Dokumenten in einer mit diesem Encoding angelegten Spalte, wird für alle XML-Dokumente ein auf dem referenzierten XML-Schema basierendes Encoding verwendet. Es wird jeweils das XML-Schema verwendet, das im XML-Dokument referenziert wird. Abbildung 5 zeigt das entsprechende CREATE TABLE Statement. Das angegebene Schema muss zunächst in der Datenbank registriert werden. Versucht man in eine solche Spalte ein XML-Dokument einzufügen, das kein XML-Schema referenziert oder das nicht dem referenzierten XML-Schema entspricht, so kommt es zu einem Fehler.
Beim Speichern von XML-Dokumenten in einer mit diesem Encoding angelegten Spalte, wird für alle XML-Schema-basierten XML-Dokumente ein auf dem referenzierten Schema basierendes Encoding verwendet. Es wird jeweils das XML-Schema verwendet, das im XML-Dokument referenziert wird. Das angegebene Schema muss zunächst an der Datenbank registriert werden. Für alle nicht-XML-Schema-basierten XML-Dokumente wird ein nicht-schema-basierendes Encoding verwendet. Das entsprechende CREATE TABLE Statement ist in Abbildung 6 dargestellt.
Wenn nun ein XML-Dokument in die Tabelle eingefügt werden soll (siehe Abbildung 7), muss dieses XML-Dokument nicht nur wie bisher wellformed sondern auch valid sein, d. h. es muss dem registrierten XML-Schema entsprechen. Ansonsten kann das XML-Dokument nicht in die Datenbank eingefügt werden und es wird ein Fehler ausgegeben.
Die neue Speicherungsform Binary XML bietet sehr viele Möglichkeiten, XML-Dokumente in der Datenbank abzuspeichern. Der flexible Schema-Support sorgt dafür, dass komplett unterschiedliche XML-Dokumente in einer Spalte abgespeichert werden können und trotzdem gegen ein Schema validiert werden. Doch auch wenn kein XML-Schema verwendet wird, bietet die neue Speicherungsform durch die geringere Nutzung von Ressourcen große Vorteile.
Nun gibt es drei Speicherungsformen für den Datentyp XMLType. Da stellt sich die Frage, welche Speicherungsform wann eingesetzt werden sollte. Diese Frage werden wir im nächsten Teil dieser Reihe beleuchten.
Kathrin Hammerschmidt (info@ordix.de).