XML in kommerziellen Datenbanksystemen Vortrag im Rahmen des Seminares: „XML Datenbanken“ Cordula Bauer Thematik: · · · Untersucht werden MS SQL Server, Oracle und DB2 Alle drei Anbieter haben XML in ihre bestehenden, relationalen Datenbanksysteme integriert Ziel ist es das DBS als native XML Datenbank nutzen zu können · Zentrale Fragestellung des Vortrags: Wie kann XML innerhalb eines relationalen DBS gespeichert, indexiert, wiedergefunden und geupdated werden? Problem der fehlenden Standardisierung: • • • • der XML-Datentyp wurde im SQL-2003-Standard definiert abgesehen davon sind viele Standards für XML noch nicht durchgesetzt Mitglieder aller drei Firmen (v.a. IBM) sind Mitglieder in den W3C-Gremien dennoch finden die Spezifikationen erst langsam Eingang in die kommerziellen Systeme à Obwohl sich viele Gemeinsamkeiten in den 3 Systemen erkennen lassen, gibt es keine einheitliche Umsetzung Inhalt: · · · · · Allgemeine Konzepte MS SQL Server Oracle DB2 Zusammenfassung Allgemeine Konzepte: XML Modell vs. relationales Modell Speicherung: Bisher: · Speicherung als BLOB oder CLOB · Vorteil: schneller Aufruf des Dokuments · Nachteil: mit Knoten kann nicht direkt gearbeitet werden · Shredding: Knoten werden auf Tabellenzeilen gemappt (z.B. über Annotationen im XMLSchema) · Vorteil: einfacher Zugriff auf die Informationen in den einzelnen Knoten Nachteil: aufwändig zu erstellen, viele Tablellen, viele Nullwerte XML Datentyp • • • Kann wie number oder varchar als Datentyp für eine Spalte in einer relationalen Tabelle vergeben werden Zugrunde liegendes Datenmodell: XQuery Data Model Beim Einfügen eines neuen Dokuments kann so auf Wohlgeformtheit geprüft werden create table XMLDocs (id number, doc XMLDatentyp) Diese logische Abstraktion ist in allen 3 Systemen gleich. Unterschiede bestehen in der physischen Speicherung. SQL Server The Big Picture Physische Speicherung: Das physische Modell des XML Datentyps ist eine binäre Repräsentation der logischen Konzepte (Elemente, Attribute, etc.) XMLs. • • Speicherung dieser Repräsentation als BLOB Größe des Dokument wird um 20%-30% reduziert XML Schema Collection In der XML Schema Collection können verschiedene XML Schema Komponenten gespeichert werden, z.B. Element- oder Typ-Deklarationen create xml schema collection S1 as @s Spalte vom XML Typ kann mit Schema versehen werden: create table Orders(id int, orderdate datetime, POContract XML(document ContractSchema)) Auch expliziter Type-Check möglich: select CAST(@x as XML(S1)) (@x sei Instanz vom Typ XML) XML Index Der primäre XML Index von Microsoft nennt sich Node Table. Es ist eine Tabelle in welcher eine Zeile einem Knoten entspricht. create primary xml index xldx ON XDoc(doc) Vereinfacht sieht der Index in etwa so aus: OrdPath 1 1.1 1.3 Path_ID #BOOK #ISBN#BOOK #TITLE#BOOK tag 1 (BOOK) 2 (ISBN) 3 (TITLE) node type 1 (Element) 2 (Attribute) 1 (Element) value null ‘1-5586-34‘ „Bad Bugs“ Des weiteren stehen 3 sekundäre Indexe zur Verfügung: PATH Index | PROPERTY Index | VALUE Index XQuery Für SQL stehen Funktionen bereit um XQuery und XPath-Ausdrücke zu integrieren: .query() gibt Wert vom XML Datentyp zurück .value() gibt Wert eines der SQL-Datentypen zurück .exist() gibt 0 zurück wenn Ergebnis leere Menge, sonst 1 .nodes() gibt für jeden Unterknoten des Ergebnisknotens eine Zeile zurück Beispiel1: exist()-Funktion SELECT doc FROM TripReports WHERE 1 = doc.exist(‘/doc/customer//saleslead‘) Beispiel 2 query()-Funktion: SELECT doc.query (‘for $c in /doc/customer where $c//saleslead return <customer id=„{$c/@id}“> {$c//saleslead}</customer>‘) FROM TripReports Beispiel 3 value()-Funktion: SELECT doc.value(‘/doc/customer/order/@id‘, ‘int‘) as OrderID FROM TripReports Beispiel 4 value() und nodes()-Funktion: SELECT orders.value(‘@id‘, ‘int‘) as OrderID FROM TripReports doc.nodes(‘/doc/customer/order‘) as orders Falls node table (XML Index) von den vom Query betroffenen Dokumenten noch nicht erstellt wurde, wird dies nachgeholt. Er wird zur Query-Optimierung eingesetzt. XQuery wird transformiert. (siehe Grafik) XPath-Ausdrücke werden auf Path_ID im node table gemappt. Updating Geschieht über die in SQL integrierte modify()-Funktion. Beispiel: update TripReports set doc.modify(‘delete /doc/customer//saleslead[@year < 2000]‘) Physisch wird dies genauso realisiert wie XQuery- und XPath-Ausdrücke. OrdPath ist sozusagen die zugrundeliegende Update-Technologie Oracle The Big Picture physische Speicherung Hybrid Im XMLSchema wird angegeben welche Teile in CLOBs gespeichert werden und welche geshreddet werden sollen Binary XML Storage · Tag tokenization · Werte werden in ihrem ursprünglichen Datenformat gespeichert · Teilbäume werden auf verschiedenen Seiten gespeichert ! ist allerdings im aktuellen Release noch nicht vorhanden XML Schema Für eine Spalte vom Typ „XMLType“ oder eine Tabelle vom Typ „XMLType“ kann ein bestimmtes Schema erzwungen werden. Das Schema muss zunächst in die Datenbank eingefügt und dann als Schema angemeldet werden. Anmeldung: BEGIN DBMS_XMLSCHEMA.REGISTERSCHEMA (schemaurl=>'http://www.oracle.com/presentation.xsd', schemadoc=>sys.UriFactory.getUri('/public/DOAG/presentation.xsd')); END; Nun können Dokumente eingefügt werden und auf dieses Schema validiert werden. INSERT INTO "presentation1364_TAB" values(xmltype( '<presentation xmlns:xsi=http://w3.org/2001/XMLSchema-instance xsi:noNamespaceSchemaLocation= "http://www.oracle.com/presentation.xsd"> ... some content ... </presentation> ')); Angegebenes Schema wird in der Datenbank gesucht und gegen das einzufügende Dokument validiert. XML Index Oracle stellt einen XMLIndex für XML Dokumente, welche im (C)LOB Format gespeichert sind. Eine Zeile in der Indextabelle entspricht einem Knoten. document id dewey style order key path id value 5 1.2.3.1 #meal#menue „Rührei“ 3 sekundäre Indexe stehen desweiteren bereit: PATH Index | POSITION Index | VALUE Index XML Repository Das Oracle XML Repository stellt eine Abstraktionsebene dar, welche es ermöglicht in der Datenbank gespeicherte XML-Dokumente als Dateien im Dateisystem zu betrachten. à Lesen und Bearbeiten der XML-Dokumente z.B. mit MSWord, FTP, HTTP etc. ist möglich XML View Aus objekt-relationalen Daten können nicht nur objekt-relationale Views sondern auch XML Views, also virtuelle XML Dokumente erstellt werden. Dazu werden für SQL Funktionen für Publishing aus dem SQL/XML Standard bereitgestellt. einige dieser Funktionen: XMLElement() - Element-Konstruktor XMLForest() - Konstruktion eines Waldes von attributlosen Elementen XMLConcat() - Zusammenfügen mehrere XML-Werte zu einem create or replace view Emp_view of xmltype with object id (extract(sys_nc_rowinfo$,'/Emp/@empno').getnumberval()) as SELECT XMLElement("Emp", XMLAttributes(empno), XMLForest(e.fname ||' '|| e.lname AS "name", e.hire AS "hiredate")) AS "result" FROM emps e WHERE salary > 20000; <Emp EMPNO="2100"> <name>John Smith</name> <hiredate>24.05.00</hiredate> </Emp> <Emp EMPNO="2200"> <name>Mary Martin</name> <hiredate>01.02.96</hiredate> </Emp> XQuery XQuerys und XPath-Ausdrücke werden in SQL-Funktionen verarbeitet. Einige Funktionen: • ExistsNode() • Extract() • XMLSequence() • XMLQuery() • XMLTable() in der FROM Klausel 1. Beispiel extractValue()-Funktion: SELECT a.lfd_nr, extractValue(a.Adresse, '/Adr/Name') FROM adressenliste a 2. Beispiel: integrierter XQuery auf einem XML View SELECT XMLQuery(for $b in ora:view(„S_T“)/site/person where $b/@id = „0“ return $b/name‘ returning content) FROM dual; XQuerys können aber auch alleine stehen. Beispiel 3: Alleinstehender XQuery, in welchem die Dateisystem-Abstraktion ausgenutzt wird: xquery for $i in doc("/docs/Accounting.xml")/Department/Employee where $i/FirstName="Shelley" return $i Je nach der physischen Speicherung der XML Dokumente, wird der XQuery bzw. der XPath-Ausdruck anders ausgewertet. Falls ein Index vorhanden ist, so wird dieser zur Optimierung eingesetzt. · CLOB Ausdruck wird entweder über SAX oder über DOM abgearbeitet · Shredded Ausdruck wird in SQL-Funktion umgeschrieben, welche auf den entsprechenden zugrundeliegenden Tabellen ausgeführt wird Updating Auch dies geschieht über in SQL integrierte Funktionen (aus dem SQL/XML Standard). Auch diese Funktionen werden intern gemäß der physischen Speicherung ausgeführt. · · CLOB: Dokument wird in DOM transformiert, verändert, zurücktransformiert und das alte Dokument überschrieben Shredded: Werte in den entsprechenden zugrundeliegenden Tabellen werden verändert Funktionen: UpdateXML(), DeleteXML(), InsertChildXML(), InsertXMLBefore(), AppendChildXML() DB2 The Big Picture physische Speicherung: Das physische Modell ist eine hierarchische Repräsentation des XML Dokuments. (XML-Baum-Repräsentation) • • • • Baum (Dokument) kann in Teilbäume (Regionen) geteilt werden und auf verschiedenen Datenseiten gespeichert werden. Ein Region Index erlaubt beschleunigten Zugriff auf gewünschte Regionen Tagnamen werden auf StringIDs gemappt und durch diese ersetzt. StringID-Index wird dazu erstellt. Falls Dokument gegen Schema validiert wurde, so werden die Daten in ihrem xs:datentyp abgespeichert XML Schema Für jedes XML Dokument einer Spalte kann ein (anderes!) XMLSchema verlangt werden. Schema muss an der Datenbank angemeldet werden, dann können Dokumente eingefügt werden und gegen dieses Schema validiert werden. register xmlschema http://my.dept.com from dept.xsd as departments.deptschema complete insert into dept(deptdoc) values xmlvalidate(? according to xmlschema id departments.deptschema) insert into dept(deptdoc) values xmlvalidate(?) (hier wird das im XMLDokument angegebene Schema erst noch in der Datenbank gesucht) XML Index Der primäre Index in DB2 wird als “Value Index“ bezeichnet. Eine Zeile der Indextabelle entspricht einem Knoten create index idx1 on dept(deptdoc) generate key using xmlpattern ‘/dept/employee/name‘ as sql varchar(35) Es werden nur die in „xmlpattern“ angegebenen Knoten indexiert. RowID 7 identifiziert Dokument innerhalb der Spalte PathID 45FE22 id des Pfades aus dem Path Index NodeID value 45 „Susi“ id des Knotens, nach einem numbering scheme? Xquery XQuery wird über Funktionen in SQL integriert und umgekehrt! 1. XQuery-Funktionen in SQL, einige davon • XMLQuery() • XMLExists() • XMLTable() Beispiel xmlquery()-Funktion SELECT deptID, xmlquery(‘for $e in $deptdoc/dept/employee where $e/office = 344 return $e/name‘ passing by ref d.deptdoc as ‚deptdoc‘ returning sequence) FROM dept d 2. SQL-Funktionen in XQuery db2-fn:xmlcolumn | db2-fn:sqlquery 1. Beispiel db2-fn:xmlcolumn: for $e in db2fn:xmlcolumn(‚DEPT.DEPTDOC‘)/dept/employee where $e/office = 344 return $e/name 2. Beispiel db2-fn:xmlcolumn: for $e in db2-fn:sqlquery(‘SELECT DEPTDOC FROM DEPT‘)/dept/employee where $e/office = 344 return $e/name DB2 hat separate parser für SQL und XQuery, benutzt aber nur einen query compiler für beide Sprachen. Für XML gibt es einige neue Operatoren: XScan - für XML Navigation XIScan - für XML Index access Xandor - für Joins auf Indexen Falls ein Index vorhanden ist, so wird dieser zur Optimierung eingesetzt. Auch Statistiken Häufigkeiten von Elementen, Attributen und Werten sollen zur Query-Optimierung eingesetzt werden. Update Bisher ist noch kein Update-Mechanismus in DB2 integriert. Einige Entwickler haben sich jedoch Gedanken gemacht und Prozeduren geschrieben um Updates durchführen zu können. Hier eine Variante: DB2XMLFUNCTIONS.XMLUPDATE <name>Susi</name> wird durch <name>Tina</name> ersetzt call DB2XMLFUNCTIONS.XMLUPDATE ( '<updates><update action="replace" col="1" path="/x:customerinfo/x:name"> <name>Tina</name> </update> </updates>', 'Select info from XMLCustomer where cid=1006', 'update XMLCustomer set info=? Where cid=1006',?,?); Zusammenfassung Alle Systeme stecken noch mitten in der Entwicklung, genau wie die Standards zu den einzelnen Funktionalitäten. Parallelen in den einzelnen Systemen sind zu erkennen, dennoch sieht die Umsetzung teilweise ganz anders aus. Zuviel technische Details wollen die 3 Firmen nicht verraten, 1. aus Wettbewerbsgründen 2. weil einiges noch gar nicht umgesetzt wurde 3. weil es kaum Erfahrungswerte mit den neuen Funktionalitäten gibt Charakteristiken der einzelnen Systeme Oracle: - bisher noch keine effiziente physische Speicherung - XMLDokumente können wie Dateien in Dateisystem benutzt werden - XML Views können generiert werden SQLServer: - binäre Speicherung kann Größe des Dokuments reduzieren - sämtliches Arbeiten mit XML-Dokumenten läuft über SQL-Funktionen DB2: - hierarchische Speicherung, Split des Dokuments in Regionen - SQL in XQuery integrierbar, gemeinsame query engine - bisher noch keine Möglichkeit XML Updates durchzuführen Da XML zunehmend an Bedeutung gewinnt und fleißig an den Standards gearbeitet wird, darf man gespannt sein wie sich die Systeme in nächster Zeit weiterentwickeln werden