All 2gether

XML-Indizierung, Update und Schema-Verwaltung mit DB2 9

Holger Seubert

Neben der Speicherung und Verwaltung von XML als Baumstruktur und XQuery als primärer Anfragesprache, bietet der Datenserver von IBM eine Reihe weiterer neuer XML-Funktionen mit Version 9. Einige dieser neuen Funktionen, wie die Indizierung gespeicherter XML-Dokumente, die Verwendung von XML Schema und auch XML Update werden in diesem Artikel vorgestellt.

Hinter der pureXML-Technologie von DB2 9 verbirgt sich eine Reihe technischer Neuerungen rund um die Verarbeitung von XML in der Datenbank. So wird das bisher (objekt-) relationale Datenbanksystem mit einem hierarchischen Speicher- und Zugriffsmechanismus für XML-Daten erweitert. In [Holger Seubert: DB2 wird hybrid mit neuartiger XML-Unterstützung, in: Entwickler Magazin 6.06, Seite 93] wurde dieses neue XML-Speicherkonzept und die Abfrage mittels XQuery und SQL/XML-Funktionen vorgestellt. Basierend auf dem neuen Speicherkonzept von XML bietet DB2 9 neben XQuery eine Reihe weiterer XML-Funktionen, die der Applikationsebene hilfreich sind. So kann mit einer geeigneten Indizierung der gespeicherten XML-Daten die Anfrageperformanz gesteigert werden. Auch eine Verwaltung von XML-Schema-Dokumenten und ihre Verwendung zur Integritätskontrolle (Validierung) ist direkt in der Datenbank realisierbar. DB2 9 ermöglicht ebenfalls gezielte Änderungsoperationen der XML-Daten, ohne dass dafür das XML-Dokument zwischen Applikation und Datenbank ausgetauscht werden muss.

Der neue XML-Datentyp

Um XML-Daten mit der neuen pureXML-Speichertechnologie in der Datenbank abzulegen, wird der neue SQL/XML:2006-konforme XML-Datentyp verwendet. Wie jeder andere SQL-Datentyp auch, wird der XML-Datentyp für die Definition von Datenbankobjekten, wie Tabellen verwendet.

Die Beispiele in diesem Artikel beziehen sich auf eine „Produkt“-Tabelle, die neben einer Produkt-ID auch eine Produkt-Beschreibung in Form von XML-Dokumenten verwaltet:

create table Produkt(pid int not null, Beschreibung XML)

Mit einem regulären INSERT können XML-Dokumente „nativ“ in die Tabelle eingefügt werden:

INSERT INTO Produkte VALUES(21, 
  '
    Schaufel
Hochwerte Stahlblech-Ausführung mit Frankfurter Blattform. Zum Umsetzen von Sand, Schnee und anderem Schüttgut. 201
');

Alternativ kann auch das DB2 IMPORT Utility zum Einfügen von XML-Dokumenten verwendet werden:

IMPORT FROM 'F:ArtikelProduktprodukte.del' 
OF DEL XML FROM F:ArtikelProduktxml1 
INSERT INTO Produkt;

Die integrierten Funktionen zur Bearbeitung und Verwaltung von XML gruppieren sich um den neuen Datentyp XML. Der XML-Datentyp wird zwar wie jeder andere „relationale“ SQL-Datentyp bei der Definition von Datenbankobjekten (wie Tabellen etc.) verwendet, seine Implementierung ist aber vollkommen anders. Diese neue Implementierung macht DB2 zu einem hybriden Datenbanksystem, welches beides, relationale Daten sowie XML Daten, optimiert verwaltet. Abbildung 1 verdeutlicht die Idee hinter dem hybriden Datenserver.

Abb. 1: DB2 9 mit voll integrierter XML-Verwaltung

Dieser Artikel fokussiert auf Datenbankdienste, die „zwischen“ dem optimierten Speicher und der Datenbankanfrage liegen. Einer dieser Dienste ist die Indizierung. Anders als relationale Daten sind XML-Dokumente nicht „flach“, sondern haben eine Baumstruktur, die eine Reihe unterschiedlicher Werte strukturiert zusammenfasst. Für den Datenzugriff sind aber nicht immer alle Werte des XML-Dokuments relevant, sondern vielleicht nur ein bestimmtes Attribut und mehrere Elemente. Die Indizierung des gesamten Dokuments ist in der Regel nicht sinnvoll. Wie können geeignete Werteindexe in DB2 auf einer solchen Baumstruktur angelegt werden?

Effizientere Anfragen durch XML-Indizierung

Durch eine geeignete Indizierung lässt sich auch der Zugriff auf XML-Daten optimieren. Dabei kann jeder beliebige XML-Element- und Attributwert indiziert werden, ganz unabhängig davon, wie oft der Dokumentknoten vorkommen kann. Auch eine Unterscheidung unterschiedlicher XML-Werteindextypen ist bei DB2 nicht erforderlich. Durch eine erweiterte Index-DDL werden die zu indizierenden XML-Dokumentteile über einen XPath-Ausdruck (ein sog. XMLPATTERN) identifiziert. Im Folgenden wird ein XML-Werteindex PreisIndex auf das Produktpreis-Element der Beispieldaten angelegt. Der Indexschlüssel ist durch ein XMLPATTERN definiert, das eine eingeschränkte XPath-Syntax zulässt. Es können die child-axis (/) und die descendent-and-self-axis (//) bei der Index-Definition verwendet werden. Prädikate werden im XMLPATTERN nicht unterstützt. Optional ist auch eine Namensraum-Definition und die Definition von UNIQUE-XML-Indexen möglich.

CREATE INDEX PreisIndex ON Produkt(Beschreibung) 
  GENERATE KEY USING XMLPATTERN 
    'declare default element namespace "http://www.beispiel.de/demoProdukt"; 
    /Produkt/Details/Preis' 
  AS SQL DOUBLE

Wie in der Index-DDL zu sehen, wird mit der AS SQL-Klausel ein SQL-Datentyp dem Index zugeordnet. Vier SQL-Datentypen werden für einen XML-Werteindex unterstützt:

  • VARCHAR (HASHED)
  • DOUBLE
  • DATE
  • TIMESTAMP

Diese Datentypen beeinflussen, welche Vergleichsoperationen von dem Index profitieren können. Der PreisIndex ist als DOUBLE definiert. So kann der Datenbank-Optimizer bei der folgenden SQL-Anfrage auf den zuvor definierten PreisIndex zurückgreifen:

SELECT pid, 
  XMLQUERY('declare default element namespace
    "http://www.beispiel.de/demoProdukt";
     $prod//Name' passing Beschreibung as "prod") AS NAME
  FROM Produkt
  WHERE XMLEXISTS('declare default element namespace 
    "http://www.beispiel.de/demoProdukt";
     $prod/Produkt[Details/Preis > 15]' passing Beschreibung as "prod")

Das XPath-Prädikat in der XMLEXISTS()-Funktion selektiert alle Produkte, deren Preis größer als der numerische Wert 15 ist. Schaut man sich den Zugriffsplan der SELECT-Anfrage an, so findet man den neuen XISCAN-Operator (XML Index Scan Operator), der den Zugriff auf den XML-Index durchführt. Auch das DB2 Control Center unterstützt mit einem erweiterten Index-Wizard die Definition von wertebasierten Indexen auf XML-Spalten (Abb. 2).

Abb. 2: Der Index Creation Wizard

Im Gegensatz zu „relationalen Indexen“ ist die Definition mehrerer XML-Werteindexe auf eine Spalte, d.h. auf ein Dokument, möglich. Somit können unterschiedliche Dokumentteile eines Dokuments je nach Applikationsanforderungen indiziert werden. Obwohl es mit nur einem Index leicht möglich ist, alle Elemente zu indizieren, ist dies im Hinblick auf die Performanz von INSERT-und UPDATE-Operationen nicht immer ratsam. Ein Beispiel zum Einfügen von XML-Daten zeigt der Infokasten „Der neue XML-Datentyp“. Wie aber können Änderungsoperationen auf nativ gespeicherten XML-Dokumenten in DB2 durchgeführt werden?

Geschrieben von
Holger Seubert
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.