Der Datentyp XML in DB2 for z/OS aus Performance-Perspektive - Diplomarbeit - zur Erlangung des akademischen Grades Diplom-Informatiker eingereicht von Christoph Koch [email protected] Betreuer Prof. Klaus Küspert, Friedrich-Schiller-Universität Jena Norbert Wolf, DATEV eG Friedrich-Schiller-Universität Jena Fakultät für Mathematik und Informatik Institut für Informatik Lehrstuhl für Datenbanken und Informationssysteme Januar 2012 Danksagung Die vorliegende Diplomarbeit wurde nur durch die breite Unterstützung zahlreicher Akteure ermöglicht. Ihnen möchte ich an dieser Stelle meinen ausdrücklichen Dank aussprechen. Prof. Klaus Küspert Prof. Küspert trug maßgeblich dazu bei, dass ich über ein durch ihn vermitteltes Praktikum im Jahr 2010 mit der DATEV eG in Kontakt getreten bin. Daran schloss sich eine Studienarbeit und nun in thematisch ähnlichem Umfeld auch die vorliegende Diplomarbeit an, deren universitäre Betreuung in beiden Fällen Prof. Küspert selbst übernahm. Dabei scheute er keine Mühen und reiste neben diversen Besprechungsterminen in Jena auch mehrfach zur DATEV eG nach Nürnberg. Norbert Wolf Herr Wolf übernahm als Fachberater Datenbanken (DB2 for z/OS) die Betreuung der Diplomarbeit in der DATEV eG. In engem Kontakt stand er mir stets für Fragen zur Verfügung und investierte viel Zeit darin, mich mit seinem Wissen fachlich zu unterstützen. Darüber hinaus gab er mir auch zahlreiche persönliche Ratschläge, so dass er für mich eine Funktion als Mentor einnahm. „Belegwesen“-Projekt Das „Belegwesen“-Projekt in der DATEV eG verwaltet in DB2 for z/OS eine sehr umfangreiche Menge an XML-Dokumenten. Nach Absprache und Prüfung durch die verantwortlichen Kollegen konnte mit Hilfe dieser Daten ein breites Spektrum an PerformanceMessreihen durchgeführt werden. Anhand dieser Tests ließen sich wertvolle Erkenntnisse hinsichtlich der datenbankseitigen XML-Verarbeitung ableiten. Mengchu Cai Mengchu Cai ist Mitarbeiter von IBM im Silicon Valley Lab in San Jose (Kalifornien) und unterstützt die DATEV eG bei Fragen und Problemen in Verbindung mit der pureXMLImplementierung in DB2 for z/OS. In speziellen Kontexten trug er daher mit sehr hilfreichen, umfangreichen Ausführungen zu den detaillierten Betrachtungen dieser Arbeit bei. Dr. Ernst Lugert Als Leiter der Abteilung Datenbanken der DATEV eG hat mich Dr. Lugert ebenfalls weitreichend unterstützt. Er ermöglichte es mir parallel zu meinem Studium in Jena diese Arbeit anzufertigen. Zusätzlich erkundigte sich Dr. Lugert während regelmäßiger Besprechungstermine nach dem aktuellen Stand der Arbeit und zeigte bei auftretenden Problemen hilfreiche Gedankenansätze auf. Karin Arneth Frau Arneth hat durch ihre Position im Sekretariat der Abteilung Datenbanken einen großen Beitrag zu der Organisation dieser Arbeit geleistet. Dabei koordinierte sie unter anderem sämtliche Terminangelegenheiten. Weiterhin nahm sich Frau Arneth die Zeit, um die vorliegende Arbeit grammatikalisch zu prüfen und trug somit merklich zu deren Qualität bei. Uwe Heger Herr Heger war bis zu seinem Positionswechsel zu Beginn des Jahres 2012 Mitarbeiter der Gruppe Datenbankadministration der DATEV eG. Mit seinem breiten Wissensspektrum von Datenbanken bis hin zur Anwendungsentwicklung unterstützte er mich bei vielen konzeptuellen Überlegungen und reicherte damit die Diplomarbeit an. Eva Ising und Christa Hofmann Frau Ising und Frau Hofmann sind in der DATEV eG Mitarbeiterinnen der Gruppe Datenbanksysteme. Sie stellten meine Ansprechpartnerinnen bei systemseitigen Problemen im DB2 for z/OS dar und machten sich viel Mühe, um diese möglichst schnell zu beheben. Allen diesen Personen, sowie auch den nicht genannten Mitarbeitern der Gruppe Datenbankadministration, die mich sehr herzlich in ihr Kollegium aufgenommen haben, gilt mein besonderer Dank. Kurzfassung Mit der pureXML-Technologie ermöglicht das IBM-Datenbankmanagementsystem DB2 for z/OS neben der traditionellen relationalen Datenablage auch die native Speicherung von Daten im XML-Format. Letztere ermöglicht die XML-spezifische datenbankseitige Verarbeitung von Dokumenten und verspricht dabei einen hohen Grad an Effizienz zu gewährleisten. Nachdem bereits in einer vorangegangenen Studienarbeit die native XML-Speicherform aus struktureller Sicht den in der DATEV eG vorhandenen nicht-nativen Varianten gegenübergestellt wurde, ist in der vorliegenden Diplomarbeit der Fokus auf den Aspekt Performance gerichtet. In diesem Zusammenhang erfolgt die gezielte Betrachtung der Themenschwerpunkte Migration und Parsen, XML-Schema-Management und Query Performance. Aus den dabei gewonnenen Erkenntnissen wird abschließend ein Fazit gezogen, das diverse Vorzüge der nativen XMLSpeicherung bestätigt, aber auch Schwachpunkte dieser Ablageform zusammenfasst. Hier erfolgt insbesondere ein Ausblick auf die von IBM angekündigten Optimierungen rund um den nativen XML-Datentyp. Einige der erwähnten Punkte sind teilweise bereits in der Folgeversion 10 des hier betrachteten DB2 for z/OS implementiert worden. Diese Optimierungen finden im Kontext der vorliegenden Arbeit an geeigneter Stelle Erwähnung. Inhaltsverzeichnis 1 Einleitung ..............................................................................................................................8 1.1 Motivation.........................................................................................................................8 1.2 Einstiegsbeispiel .............................................................................................................10 1.3 Gliederung ......................................................................................................................11 2 Die DATEV eG...................................................................................................................14 2.1 Eingetragene Genossenschaft .........................................................................................14 2.2 Daten und Fakten ............................................................................................................14 2.3 Portfolio ..........................................................................................................................14 2.4 Hintergrund der XML-Untersuchung .............................................................................15 3 Grundlagen..........................................................................................................................17 3.1 XML................................................................................................................................17 3.1.1 Nativ vs. nicht-nativ .................................................................................................19 3.1.2 XML-Parsen und XML-Serialisieren .......................................................................20 3.1.3 XPath........................................................................................................................23 3.2 DB2-Infrastruktur in der DATEV...................................................................................24 3.2.1 DB2 for z/OS............................................................................................................25 3.2.2 Entwicklungsumgebung ...........................................................................................26 3.3 Performance-Zeiten: Elapsed- und CPU-Zeit .................................................................28 3.4 Toolumfeld......................................................................................................................29 3.4.1 IBM Data Studio ......................................................................................................30 3.4.2 Visual Explain ..........................................................................................................31 3.4.3 CA Detector..............................................................................................................32 4 Aktueller Kenntnisstand zu Performance-Kennzahlen .......................................................33 4.1 Veröffentlichte Messergebnisse......................................................................................33 4.2 Der TPOX-Benchmark ...................................................................................................34 5 Vorbetrachtungen zur Messdatenerhebung .........................................................................36 5.1 Generelle Vergleichskriterien .........................................................................................37 5.1.1 Größe und Anzahl ....................................................................................................37 5.1.2 Strukturiertheit..........................................................................................................40 5.1.3 Zusammensetzung ....................................................................................................44 5.2 Einflussfaktoren ..............................................................................................................46 5.2.1 Bufferpool-Management ..........................................................................................46 5.2.2 Data Sharing.............................................................................................................49 5.2.3 Zugriffsart.................................................................................................................51 5.2.4 Transaktionslänge.....................................................................................................53 5.3 Verfahrensweise zur Messdatenerhebung.......................................................................56 5.4 Schwankungen und Diskrepanzen ..................................................................................61 6 Migration und Parsen ..........................................................................................................64 6.1 Analyse der INSERT-Performance im Migrationsfall....................................................66 6.1.1 „Einfaches Kopieren“...............................................................................................67 6.1.2 Konkatenation ..........................................................................................................72 6.1.3 Unicode-Konvertierung............................................................................................77 6.1.4 XML-Parsen der Dokumente ...................................................................................81 6.1.5 Zusammenfassung und Verteilung der Kosten.........................................................87 6.2 Analyse der INSERT-Performance bei Neueinfügungen ...............................................90 6.3 Pflege von User-Defined-XML-Indexen ........................................................................92 6.4 Exkurs: UPDATE von XML-Dokumenten.....................................................................96 7 XML-Schema-Management................................................................................................99 7.1 Integrität der Daten .......................................................................................................100 7.1.1 Dokumentstruktur...................................................................................................101 7.1.2 Werteintegrität........................................................................................................103 7.1.3 Entitätsintegrität .....................................................................................................105 7.1.4 Referentielle Integrität............................................................................................107 7.2 Anforderungen an das XML-Schema-Management .....................................................108 7.2.1 Verknüpfung von XML-Dokument und XML-Schema.........................................109 7.2.2 Transparenz zur Anwendung..................................................................................110 7.2.3 Umgang mit ungültigen XML-Dokumenten ..........................................................111 7.2.4 Auskunft über Gültigkeit von XML-Dokumenten .................................................112 7.2.5 Nachträgliche Schemavalidierung..........................................................................113 7.2.6 Unterstützung bei Schemaevolution und nachträgliche Validierung .....................113 7.3 XML-Schema-Management in DB2.............................................................................115 7.3.1 Umsetzung der Anforderungen ..............................................................................117 7.3.2 Performance der Schemavalidierung......................................................................121 7.4 Alternative Konzepte ....................................................................................................126 7.4.1 DTD........................................................................................................................126 7.4.2 RELAX NG............................................................................................................128 7.4.3 Schematron.............................................................................................................129 8 Query Performance ...........................................................................................................130 8.1 Performance-relevante Aspekte ....................................................................................130 8.1.1 XML-Indexe...........................................................................................................131 8.1.2 Statistiken zu XML-Daten......................................................................................134 8.1.3 Zugriffspläne ..........................................................................................................136 8.2 Analyse der Query Performance...................................................................................139 8.2.1 Komplettzugriff ......................................................................................................141 8.2.2 Indexunterstützter Zugriff ......................................................................................145 8.2.3 Selektiver Zugriff ...................................................................................................149 8.2.4 Komplexe Prädikate ...............................................................................................153 9 Zusammenfassung und Bewertung von DB2....................................................................158 10 Schlussbetrachtung............................................................................................................163 Abkürzungs- und Begriffsverzeichnis .......................................................................................165 Abbildungsverzeichnis...............................................................................................................174 Literaturverzeichnis ...................................................................................................................177 Anhang.......................................................................................................................................188 1 Einleitung 1 Einleitung Das aktuelle Kapitel führt in die Thematik der vorliegenden, in der DATEV erstellten Diplomarbeit ein. Dazu folgt auf eine einleitende Motivation ein Einstiegsbeispiel, durch das die Bedeutung der hier behandelten Themenschwerpunkte aufgezeigt werden soll. Anknüpfend daran wird die Gliederung der Arbeit näher erläutert. 1.1 Motivation Die Extensible Markup Language (XML) [W3C08, W3C06b] wurde 1998 von dem W3CConsortium [W3C11] verabschiedet und entwickelte sich anschließend zum De-facto-Standard für den Austausch von (semi-)strukturierten Daten. Nachdem sich die Auszeichnungssprache XML in den vergangenen Jahren zunehmend weiter etabliert hatte, hielt sie auch Einzug in den Datenbanksektor. In diesem Zusammenhang erfolgte sowohl die Entwicklung dedizierter XML-Datenbankmanagementsysteme, beginnend schon vor ungefähr zehn Jahren, als auch die Erweiterung bereits bestehender relationaler Systeme (Oracle [Ora11b], DB2 [IBM11x], SQL Server [Mic11] und andere), um die Fähigkeit XML-Strukturen verwalten zu können. Ein Vertreter der zuletzt genannten Kategorie ist das in der vorliegenden Arbeit betrachtete, von IBM [IBM11e] vertriebene DB2 for z/OS Version 9 [IBM11o]. Die XML-Unterstützung entwickelte sich in DB2 for z/OS in zwei Stufen. Während die ersten Bestrebungen der datenbankseitigen Speicherung von XML-Daten ab 2001 mit dem XML-Extender [IBM04b] aufkamen, wurden diese mit der in DB2 for z/OS Version 9 implementierten pureXML-Technologie1 [IBM11w] wesentlich ausgeweitet. Der XMLExtender ist dabei der Form der nicht-nativen XML-Speicherung zuzuordnen. Er ermöglicht die Ablage von XML-Daten auf zwei Möglichkeiten – entweder durch die definierte Dekomposition zu relationalen Daten („xml collection“) oder durch die Deklaration eines benutzerdefinierten Datentyps („xml column“) [IBM04b]. Beide Varianten haben verschiedene Vor- und Nachteile, unterstützen aber unabhängig von diesen nur gewisse XML-spezifische Funktionalitäten. 1 Die pureXML-Technologie beschränkt sich nicht nur auf DB2 for z/OS, sondern ist auch für die Pro- duktlinie DB2 for LUW implementiert worden. 8 1 Einleitung Generell gilt, dass der XML-Extender nicht für den Einsatz in einer „Data Sharing“-Umgebung [IBM06a] geeignet ist. Da er aufgrund dieser Eigenschaft keine Verwendung in der DATEV eG2 [DAT11e] fand, wird er auch von den in dieser Arbeit durchgeführten Betrachtungen gänzlich ausgeschlossen [IBM06a]. Stattdessen erfolgt in der vorliegenden Arbeit die Untersuchung der in DB2 for z/OS Version 9 neuartigen pureXML-Technologie und der damit verbundenen Möglichkeit, XML-Daten auf native Weise datenbankseitig abzuspeichern. Demgegenüber findet in der DATEV momentan (noch) die nicht-native Speicherung von XML-Daten als einfache Textdokumente in Form des CLOB- oder VARCHAR-Datentyps statt. Da die native XML-Speicherung im Vergleich zur nicht-nativen Datenablage viele Vorzüge verspricht, besteht in der DATEV die Anforderung, den potentiellen Mehrwert dieser Art der XML-Speicherung zu untersuchen. Dahingehend sind in [Koc11] bereits aus struktureller Sicht diverse Vorbetrachtungen getätigt und Migrationsmöglichkeiten für nicht-native XML-Daten in die native Ablageform aufgezeigt worden. Im Fokus dieser Arbeit steht die Betrachtung von verschiedenen Anwendungsszenarien, in denen der Einsatz der pureXML-Technologie gegenüber den bisherigen nicht-nativen XML-Speicherformen sowohl funktional als auch bezüglich der Performance nutzbare Vorteile bietet. Im Speziellen werden dabei die folgenden Ziele im Kontext von DB2 for z/OS verfolgt. Performance-Analyse des in [Koc11] erarbeiteten Migrationskonzepts, insbesondere der Performance-Evaluierung des XML-Parse-Prozesses Anforderungs- und Performance-Analyse des Schema-Managements Performance-Analyse der Möglichkeiten des effizienten Datenzugriffs anhand ausgewählter Szenarien Generell lässt sich hinsichtlich der aufgeführten Themenschwerpunkte erwähnen, dass bereits IBM selbst diverse Performance-Analysen zur nativen XML-Verarbeitung und -Speicherung in DB2 for z/OS veröffentlicht hat. Diese sind jedoch bezogen auf die speziellen Anforderungen der DATEV aus verschiedenen Gründen zu erweitern/verfeinern. Genauere Details dazu finden sich in Kapitel 4 der vorliegenden Arbeit. An dieser Stelle sei analog zu [Koc11] folgende abschließende Anmerkung angeführt. Da die Ausgangssituation in DB2 for z/OS bei der DATEV durch das Vorhandensein von (nicht-nativ) relational gespeicherten XML-Dokumenten gekennzeichnet ist, wird von einer relationalen 2 fortan auch verkürzt als DATEV bezeichnet 9 1 Einleitung Speicherung der XML-Inhalte weiterhin ausgegangen. Eine Gegenüberstellung von (rein) relationaler Datenspeicherung und XML-Speicherung erfolgt nicht. Auch in bestimmten Szenarien durchaus sinnvolle Mischformen aus relationaler und XML-Speicherung sollen hier nicht diskutiert werden. Die gestellten Ziele beziehen sich in ihrem vollen Umfang stets auf den direkten Performance-Vergleich von nicht-nativen und nativen XML-Speicherformen in DB2 for z/OS. Die einzige Ausnahme dazu stellt lediglich die Untersuchung zum Thema XMLSchema-Management dar, da diese Funktionalität für die hier betrachteten nicht-nativen XML-Speicherformen nicht besteht. 1.2 Einstiegsbeispiel Die Ausführungen dieses Abschnitts sollen dazu dienen, an einem kompakten Einstiegsbeispiel die Bedeutung und Notwendigkeit der in der vorliegenden Arbeit betrachteten Themenschwerpunkte aufzuzeigen. Dazu sei eine Anwendung angenommen, die zum aktuellen Zeitpunkt XML-Daten nicht-nativ in Form von CLOB-Dokumenten speichert und gezielt anwendungsseitig auswertet. Mehrere solcher Anwendungen existieren derart in der DATEV. Aufgrund der durch die Anwendung datenbankseitig verwendeten nicht-nativen XML-Speicherform werden XML-Dokumente stets komplett (als Ganzes) in DB2 for z/OS eingefügt und ebenso aus jenem Datenbankmanagementsystem wieder komplett ausgelesen. XML-spezifische Funktionalitäten wie beispielsweise die XML-Schemavalidierung oder der selektive Datenzugriff sind nur anwendungsseitig realisierbar und finden dementsprechend auch anwendungsseitig statt. Zuvor müssen jedoch die nicht-nativ gespeicherten XML-Dokumente stets in der Anwendung mithilfe eines speziellen XML-Parsers in das XML-Format transformiert werden. Obwohl die hier betrachtete (Beispiel-)Anwendung nur gezielte Informationen aus den in DB2 for z/OS abgelegten XML-Daten benötigt, ist es für den Datenzugriff trotzdem zwingend erforderlich, die kompletten XML-Dokumente auszulesen und anschließend zu parsen. Aus dieser Vorgehensweise resultiert ein (zu) hoher Aufwand, der für jeden weiteren Datenzugriff auf die datenbankseitig gespeicherten XML-Dokumente zu wiederholen ist. Demzufolge besteht hier erheblicher Optimierungsbedarf. Bezogen auf die oben beschriebene Anwendung sind diverse Vorteile durch die pureXMLTechnologie denkbar. Zum einen wäre es mit dieser möglich, einzelne Dokumentteile gezielt 10 1 Einleitung und indexunterstützt aus DB2 for z/OS auszulesen (siehe Kapitel 8). Dementsprechend müssten anwendungsseitig nicht mehr die kompletten XML-Dokumente geparst und verarbeitet werden, sondern nur die speziell gewünschten Dokumentteile. Das wiederum hat den Vorteil, dass sich die Performance der Anwendung verbessert, der Datenzugriff effizienter erfolgt und auch der Kommunikationsaufwand zwischen DB2 for z/OS und der Anwendung vermindert wird. Weiterhin könnte die zur Integritätssicherung notwendige XML-Schemavalidierung von der Anwendung nach DB2 for z/OS verlagert werden (siehe Kapitel 7). Das würde nicht nur die Anwendung „schlanker“ machen, sondern auch die datenbankseitig abgelegten XML-Daten an zentraler Stelle konsistent halten. In welcher Art und Weise und vor allem in welcher Qualität mithilfe der pureXML-Technologie die hier angedeuteten Verbesserungen tatsächlich realisierbar sind, wird im weiteren Verlauf der vorliegenden Arbeit geklärt. Dabei wird auch der Aufwand betrachtet, den eine zuvor notwendige Migration der nicht-nativen Daten in die native Speicherform nach sich zieht und vor allem wie zeitintensiv die datenbankseitig daraufhin notwendig werdenden Datenmanipulationen insbesondere des XML-Parse-Prozesses wären (siehe Kapitel 6). 1.3 Gliederung Die Struktur dieser Arbeit leitet sich von den drei Themenkomplexen Migration und Parsen, XML-Schema-Management und Query Performance ab. Dazu zählen auch Vor- und Nachbetrachtungen sowie eine Vorstellung des Unternehmens DATEV. Im Detail resultiert für die abzuhandelnden Aspekte aber noch eine feinere Granularität. Der anschließende Abschnitt gibt einen Gesamtüberblick über die inhaltlichen Schwerpunkte der einzelnen Kapitel. Die DATEV eG (Kapitel 2) Die vorliegende Arbeit wurde in der DATEV im Rahmen einer umfassenden Untersuchung zum nativen XML-Datentyp in DB2 for z/OS angefertigt. In Kapitel 2 erfolgt deshalb eine kurze Vorstellung des Unternehmens. Hier wird neben allgemeinen Informationen zur DATEV auch auf die dortigen Intentionen Bezug genommen, die zu der Auseinandersetzung mit der XML-Thematik und demzufolge auch zur Erstellung dieser Arbeit geführt haben. 11 1 Einleitung Die Ausführungen in diesem Teil sind eng an die Darstellungen aus der dieser Arbeit vorangehenden Studienarbeit [Koc11] angelehnt. Grundlagen (Kapitel 3) In Kapitel 3 werden grundlegende Begrifflichkeiten und Sachverhalte wie die Auszeichnungssprache XML, Details zur DB2-Infrastruktur der DATEV sowie nähere Informationen zu den Performance-relevanten Messzeiten und den verwendeten Tools ausführlich beschrieben. Da sich auch hier thematische Parallelen zur Studienarbeit [Koc11] ergeben, werden die dortigen Ausführungen in der vorliegenden Diplomarbeit an passender Stelle aufgegriffen und mit Zusatzinformationen erweitert beziehungsweise aktualisiert. Aktueller Kenntnisstand zu Performance-Kennzahlen (Kapitel 4) Zum momentanen Zeitpunkt existieren keine Veröffentlichungen zu PerformanceAnalysen, die dem Detailgrad der in dieser Arbeit durchgeführten, an die DATEV-Spezifika angelehnten Betrachtungen zu den Bereichen Migration und Parsen, XML-SchemaManagement und Query Performance entsprechen. Dennoch gibt es zahlreiche allgemein ausgelegte Veröffentlichungen von Performance-Kennzahlen. Diese sollen in Kapitel 4 aufgegliedert und referenziert werden. Vorbetrachtungen zur Messdatenerhebung (Kapitel 5) Die in dieser Arbeit durchgeführten Performance-Messungen orientieren sich alle an einem gemeinsamen (Ablauf-)Muster. Dieses soll zusammen mit den dazu nötigen Vorüberlegungen in Kapitel 5 vorgestellt werden. Hier wird auch auf die Art und Weise eingegangen, wie die weiteren Auswertungen zu interpretieren und welche Einflussgrößen bei der Messdatenerhebung zu beachten sind. Migration und Parsen (Kapitel 6) Kapitel 6 behandelt den ersten großen thematischen Schwerpunkt – Migration und Parsen. Hier wird in Anlehnung an die Betrachtungen aus [Koc11] die Performance von wesentlichen, im Rahmen einer Migration oder Neueinfügung stattfindenden Prozessen untersucht und anhand konkreter Messreihen verifiziert. Darin eingeschlossen ist insbesondere der Aspekt der Pflege von User-Defined-XML-Indexen. Zum Abschluss des Kapitels erfolgt noch ein Exkurs zum Thema UPDATE von XML-Dokumenten in DB2 for z/OS. 12 1 Einleitung XML-Schema-Management (Kapitel 7) Genau wie im relationalen Kontext nimmt das Thema Integrität auch eine wichtige Rolle bei der nativen datenbankseitigen Ablage von XML-Dokumenten ein. Das W3CConsortium verabschiedete zu diesem Zweck das Konzept des XML-Schemas. Kapitel 7 setzt sich damit auseinander, betrachtet alternative Ansätze, stellt Anforderungen und prüft deren Umsetzung in DB2 for z/OS. Query Performance (Kapitel 8) In Kapitel 8 erfolgt die Betrachtung des nativen XML-Datentyps anhand typischer Performance-Aspekte. Dazu zählen Indexe, Statistiken und Zugriffspläne. Darüber hinaus findet in diesem Kapitel eine Messdatenerhebung zu verschiedenen Testszenarien statt, anhand deren die Effizienzvorteile beziehungsweise -defizite der nativen XML-Implementierung in DB2 for z/OS verifiziert werden. Zusammenfassung und Bewertung von DB2 (Kapitel 9) Die im Rahmen der Untersuchungen zu dem nativen XML-Datentyp in DB2 for z/OS gewonnenen Erkenntnisse werden in Kapitel 9 kompakt zusammengefasst. Neben vielen Vorzügen erfolgt hier auch die Thematisierung nachteiliger Aspekte der nativen XML-Speicherung, sodass infolgedessen konkrete Defizite gemeinsam mit Anregungen zur Optimierung beschrieben werden. Schlussbetrachtung (Kapitel 10) Kapitel 10 zieht ein abschließendes Resümee zu den in dieser Arbeit gewonnenen Erkenntnissen und gibt zudem einen Ausblick auf mögliche weitere Schritte beziehungsweise Untersuchungen zum Thema der nativen XML-Verarbeitung in DB2 for z/OS. Anhang Ein wichtiger Bestandteil dieser Arbeit sind die verschiedenen Messreihen, die zur Evaluation der Performance des nativen XML-Datentyps konzipiert und durchgeführt wurden. Da die vollständige Darstellung der Messresultate innerhalb der jeweiligen Kapitel zu umfangreich wäre, finden sich Informationen zu den Messprozeduren, Ergebnistabellen (inklusive der Elapsed-Zeiten) und für Kapitel 8 auch zu den Zugriffsplänen generell im Anhang der vorliegenden Arbeit. 13 2 Die DATEV eG 2 Die DATEV eG Die DATEV eG [DAT11e] ist ein Softwarehaus und IT-Dienstleister für Steuerberater, Wirtschaftsprüfer und Rechtsanwälte sowie deren Mandanten. In dem folgenden Kapitel soll eine kurze Vorstellung des Unternehmens erfolgen. 2.1 Eingetragene Genossenschaft Bei der Organisationsform der DATEV handelt es sich um eine eingetragene Genossenschaft. Als solche ist sie nicht auf die Maximierung der eigenen Gewinne ausgerichtet. Vielmehr steht das Wohl der Genossenschaftsmitglieder im Vordergrund. Demnach zeichnet sich eine erfolgreiche Genossenschaft nicht durch ihren eigenen Erfolg aus, sondern durch den ihrer Mitglieder. Im Fall der DATEV sind dies Steuerberater, Wirtschaftsprüfer und Rechtsanwälte. [DAT11a] 2.2 Daten und Fakten Die DATEV wurde 1966 von 65 Steuerbevollmächtigten, darunter Heinz Sebiger3, in Nürnberg gegründet [DAT11h]. Dort befindet sich auch heute noch der Hauptsitz der Genossenschaft. Bundesweit zählt die DATEV 25 Niederlassungen, mehr als 5.800 Mitarbeiter und über 39.000 Mitglieder [DAT11b]. Seit 1996 wird sie von dem Vorstandsvorsitzenden Prof. Dieter Kempf [DAT11d] geleitet. 2.3 Portfolio Das Leistungsspektrum der DATEV umfasst Software für verschiedene Bereiche wie Rechnungswesen, Personalwirtschaft, betriebswirtschaftliche Beratung, Steuerberechnung und Organisation von Unternehmen und Kanzleien. Zusätzlich bietet die Genossenschaft ihren 3 bis 1996 Vorstandsvorsitzender der DATEV 14 2 Die DATEV eG Mitgliedern noch weitere Leistungen, wie Möglichkeiten des IT-Outsourcing [DAT11f] (beispielsweise in Form von DATEVasp [DAT11g]) oder die Nutzung des hauseigenen Druckund Versandzentrums. Ebenso zählen vielfältige Fortbildungs- und Informationsangebote zu Gesetzesänderungen, Programmhandling, Betriebswirtschaft oder Qualitätssicherung zum Portfolio der DATEV. Alle genannten Leistungen unterstehen den höchsten Datenschutz- und Datensicherheitsanforderungen. [DAT11c] 2.4 Hintergrund der XML-Untersuchung In der DATEV sind verschiedene Datenbankmanagementsysteme im Einsatz. Eine zentrale Rolle nimmt dabei IBM DB2 for z/OS ein, das aktuell in Version 9.1 („new-function mode“) eingesetzt wird. DB2 for z/OS ist auf zwei Mainframes der jüngsten z196-Generation [DAT11h] installiert, die als zentrale Daten- und Anwendungsserver dienen [DAT10]. Die Zuständigkeit für DB2 for z/OS liegt in der Abteilung Datenbanken. Die dortige Ausrichtung orientiert sich stets an den aktuellen Möglichkeiten im Datenbankmanagementsystem. Daher trat auch die XML-Thematik in der vergangenen Zeit vermehrt in den Fokus der Betrachtung. Ausschlaggebend dafür ist aber vor allem auch die Tatsache, dass bereits seit längerer Zeit diverse XML-Daten verschiedener Projektanwendungen auf nicht-native Art in DB2 for z/OS gespeichert und verarbeitet werden. Durch die mit DB2 for z/OS Version 9 eingeführten Möglichkeiten der pureXML-Technologie [IBM11w] ergeben sich verschiedene Fragestellungen. Im Mittelpunkt steht dabei die Frage nach dem Mehrwert einer möglichen nativen XML-Speicherung gegenüber den bisherigen nicht-nativen Ablageformen. Um Antworten geben zu können, traf die DATEV den Entschluss, sich im Rahmen einer Studienarbeit [Koc11] näher mit dem Thema der nativen XMLSpeicherung auseinanderzusetzen. Hier wurden insbesondere die internen Strukturen der nativen XML-Speicherung in DB2 for z/OS Version 9 detailliert betrachtet, sowie Konzepte zur Überführung von nicht-nativen Daten in den nativen XML-Datentyp entwickelt. Die daraus gewonnenen Erkenntnisse hinsichtlich des datenbankseitigen Nutzens von nativem XML waren durchaus positiv, sodass sich weitere Untersuchungen an diese Arbeit anschließen sollten. Dazu zählt unter anderem die hier erbrachte Diplomarbeit. Deren Zielstellung ist es, die konkreten 15 2 Die DATEV eG (Performance-)Vorteile der nativen XML-Speicherung in den unterschiedlichen Themenschwerpunkten Migration und Parsen, XML-Schema-Management und Query Performance herauszuarbeiten und anhand der Durchführung geeigneter Messreihen zu belegen. Für die DATEV ist es in diesem Zusammenhang wichtig, mittels eigener Erfahrungswerte einen Überblick darüber zu bekommen, wo der Einsatz der nativen XML-Speicherung sinnvoll ist. Ebenso soll evaluiert werden, an welchen Stellen (weiterhin) die Verwendung der bestehenden nichtnativen Strukturen effizienter ist. 16 3 Grundlagen 3 Grundlagen Im folgenden Kapitel werden grundlegende Aspekte beschrieben, die für den weiteren Verlauf der vorliegenden Arbeit von Bedeutung sind. Zusätzlich zu diesen Erklärungen finden sich im Abkürzungs- und Begriffsverzeichnis allgemein gehaltene Ausführungen zu den relevanten Begrifflichkeiten. 3.1 XML Die Extensible Markup Language (XML) wurde 1998 durch das World Wide Web Consortium (W3C) [W3C11] eingeführt. Dabei handelt es sich um eine Auszeichnungssprache (Markup Language) zur Beschreibung hierarchisch strukturierter Daten. Aktuell existieren zwei Versionen der XML-Spezifikation – XML 1.0 [W3C08] und XML 1.1 [W3C06b]. Generell stellt XML ein flexibles und universell einsetzbares Datenaustausch- und auch Datenspeicherformat dar. Im Kern der XML-Spezifikation stehen die Konzepte XML-Dokument, XML-Schema [W3C04a, W3C04b, W3C04c] und XML-Namespace. [Mül08] Ein XML-Dokument ist grundlegend ein Text-Dokument, das durch diverse Auszeichnungen (Markups) strukturiert ist. Diese werden auch als Tags bezeichnet, wobei auf jeden öffnenden genau ein schließender Tag folgen muss. Mithilfe der Auszeichnungen lassen sich die einzelnen Bestandteile eines XML-Dokuments voneinander separieren. Aufgrund der hierarchischen (Baum-)Struktur der XML-Daten werden diese Bestandteile fortan auch als Knoten bezeichnet. Ein XML-Dokument kann aus einem bis beliebig vielen Knoten zusammengesetzt sein. Dabei ist zwischen Elementen, Attributen, Kommentaren und Verarbeitungsanweisungen zu unterscheiden. Zusätzlich können XML-Dokumente noch eine einleitende XML-Deklaration und eine Document-Type-Definition (DTD) [W3C06b, W3C08] umfassen. [Von05] Elemente und Attribute sind die wichtigsten Knotentypen. Ein Element wird durch die oben genannten Tags begrenzt. Dazwischen befindet sich der Elementinhalt, der mit einem Textknoten oder weiteren Elementen gefüllt sein kann. Leere Elemente sind ebenfalls zulässig. Wichtig ist, dass jedes XML-Dokument genau aus einem Wurzelelement besteht, welches alle weiteren Elemente in sich trägt. Attribute sind stets an bestimmte Elemente gebunden. Dort 17 3 Grundlagen werden sie innerhalb des öffnenden Element-Tags deklariert. Auf die Beschreibung der weiteren Knotentypen soll hier verzichtet und auf [Von05] verwiesen werden. [Hee02] Bei XML-Dokumenten ist zwischen wohlgeformten und gültigen Dokumenten zu unterscheiden [Von05]. Während jedes XML-Dokument, das den in der XML-Spezifikation festgelegten Syntaxregeln4 entspricht, gleichzeitig auch ein wohlgeformtes Dokument darstellt, gilt dies bezüglich der Gültigkeit nicht. Damit ist die Gültigkeit also „mehr“ als nur die Wohlgeformtheit. Mithilfe der DTD oder den später in die XML-Spezifikation aufgenommenen XML-Schemas kann die Struktur von XML-Dokumenten genauer beschrieben und damit auch integritätssteigernd eingeschränkt werden. Auf diese Weise können beispielsweise die einzelnen Elemente und Attribute, die Reihenfolge ihres Auftretens oder auch die möglichen Werte (Wertebereiche) vordefiniert werden. Ein XML-Dokument gilt nur dann als gültig, wenn es diesen Einschränkungen genügt. Das dazu notwendige Prüfen des Dokuments wird im Weiteren auch als Validierung bezeichnet. Sollte weder eine DTD noch ein XML-Schema definiert sein, dann gilt ein wohlgeformtes XML-Dokument automatisch als gültig. Abbildung 1 zeigt ein Beispiel für ein solches wohlgeformtes Dokument. Eine ausführliche Abhandlung der genannten Konzepte DTD und XML-Schema erfolgt zusammen mit weiteren alternativen Ansätzen in Kapitel 7. Dabei richtet sich der Fokus primär auf die Betrachtung und DB2-seitige Evaluierung des XMLSchema-Konzepts. [Mül08] Element (öffnender Tag) Attribut <seite id="seite1"> <textblock id="textblock1"> Ich bin ein Text! </textblock> </seite> Elementinhalt Element (schließender Tag) Abbildung 1: wohlgeformtes XML-Dokument 4 Eine ausführliche Abhandlung der Syntaxregeln findet sich in [W3C06b] beziehungsweise in [W3C08]. 18 3 Grundlagen XML-Namespaces sind Namensräume, die optional für Elemente und Attribute vergeben werden können. Sie dienen dazu, in unterschiedlichen Kontexten auftretende gleiche Elemente und Attribute voneinander zu unterscheiden und mittels eines Uniform Resource Identifiers (URI) [IES98] eindeutig zu identifizieren. Da XML-Namespaces für die hier erbrachte Arbeit nicht weiter relevant sind, wird von einer detaillierten Betrachtung dieses Konzepts abgesehen und auf [Mül08] verwiesen. 3.1.1 Nativ vs. nicht-nativ Im Verlauf der vorliegenden Arbeit wird die Unterscheidung zwischen nativer und nicht-nativer XML-Speicherung eine wichtige Rolle einnehmen. Um ein grundlegendes Verständnis von diesen unterschiedlichen Speicherformen zu bekommen, sollen im Folgenden zunächst die Begriffe „nativ“ und „nicht-nativ“ erläutert werden. Der Wortherkunft nach bedeutet „nativ“ unter anderem „natürlich“ oder „unverändert“. Das heißt, native XML-Daten sind natürlich und unverändert in einem hierarchischen Datenmodell abgelegte Daten. Dabei ist ein Speicherformat vorausgesetzt, das dem Verarbeitungsformat entspricht. Formen der einfachen Textablage von XML (beispielsweise als VARCHAR oder CLOB) sind davon ausgeschlossen und werden als nicht-native oder auch XML-enabled Speicherung betitelt [Päß07]. Für letztere findet daher im weiteren Verlauf der Arbeit ausschließlich der Begriff „nicht-nativ“ Verwendung. Auf nicht-native Weise gespeicherte XML-Dokumente benötigen für die Zwecke ihrer XMLspezifischen Verarbeitung ein Mapping von dem vorliegenden (relationalen) Speichermodell hin zu dem XML-Datenmodell [Päß07]. Dazu existiert zum einen die Möglichkeit der XMLDekomposition5 [NK09]. Mit deren Hilfe ist es möglich, XML-Dokumente zur nichtnativen XML-Speicherung datenbankseitig in relationale Strukturen zu zerlegen. Da diese Funktionalität aber in der DATEV derzeit keine Anwendung findet (und zudem PerformanceNachteile mit sich bringen kann), soll sie auch in den folgenden Ausführungen nicht weiter betrachtet werden. 5 Das Pendant zur Dekomposition ist das Publishing [NK09], bei dem relationale Daten zu XML-Doku- menten zusammengesetzt werden. 19 3 Grundlagen Gemäß den Ausführungen aus [Koc11] sind XML-Daten in der DATEV momentan primär nicht-nativ in Form von CLOB- und VARCHAR-Dokumenten (in der EBCDIC-Codepage) in DB2 for z/OS abgelegt. Dementsprechend ergibt sich das oben erwähnte Mapping von den genannten nicht-nativen Ablageformen in die native Form im Wesentlichen durch ein notwendiges XML-Parsen der nicht-nativ gespeicherten Dokumente. Auf diesen XML-ParseProzess wird im folgenden Abschnitt 3.1.2 näher eingegangen. Die native XML-Speicherform verspricht durch ihre „natürliche“ Art der Datenablage gegenüber der nicht-nativen Variante viele Vorteile. Da eine theoretische Betrachtung hierzu bereits in [Koc11] vorgenommen wurde, konzentrieren sich die Ausführungen der vorliegenden Arbeit auf eine Performance-Untersuchung der nativen XML-Speicherung in Relation zur nichtnativen Ablage. Detaillierte Betrachtungen zu den Strukturen der dabei miteinander verglichenen nativen und nicht-nativen Formen der XML-Speicherung als XML-, CLOBoder VARCHAR-Dokument finden sich ebenfalls in [Koc11] und werden im Verlauf der vorliegenden Arbeit an geeigneter Stelle aufgegriffen. 3.1.2 XML-Parsen und XML-Serialisieren In engem Zusammenhang mit den im vorangehenden Abschnitt beschriebenen Begriffen nativ und nicht-nativ stehen die Prozesse XML-Parsen und XML-Serialisieren. Diese ermöglichen es zum einen, nicht-native XML-Dokumente in die native Form zu überführen (XML-Parsen). Umgekehrt lassen sich mit ihrer Hilfe auch native XML-Dokumente wieder in die nicht-native Form transformieren (XML-Serialisieren). Abbildung 2 veranschaulicht die angesprochenen Verfahren an einem Beispiel. 20 3 Grundlagen XML-Parsen nicht-natives XML-Dokument natives XML-Dokument <seite id="seite1"> <textblock id="textblock1"> Ich bin ein Text! </textblock> </seite> <seite id="seite1"><t extblock id="textbloc k1">Ich bin ein Text! </textblock></seite> XML-Serialisieren Abbildung 2: Beispiel für XML-Parsen und XML-Serialisieren Die Prozesse XML-Parsen und XML-Serialisieren – fortan auch verkürzt als Parsen und Serialisieren bezeichnet – sind Kernfunktionalitäten im Rahmen der (nativen) XML-Verarbeitung. Das bedeutet, dass alle aus einer externen Anwendung in DB2 for z/OS nativ einzufügenden XMLDokumente während ihres INSERTs zu parsen sind. Da native XML-Dokumente „DB2 for z/OS“-intern binär gespeichert sind [Koc11], ist auf der anderen Seite bei jedem anschließenden Auslesen der Daten aus dem Datenbankmanagementsystem zwingend ein Serialisierungsprozess erforderlich. Beide Prozesse finden aber auch an anderer Stelle, wie beispielsweise innerhalb der in Kapitel 7 beschriebenen Verfahren zur Schemavalidierung, Anwendung. In DB2 for z/OS sind die beiden beschriebenen Funktionalitäten XML-Parsen und -Serialisieren in Form der gleichnamigen skalaren Funktionen XMLPARSE und XMLSERIALIZE umgesetzt worden. Details zu deren Syntax finden sich in [IBM11a] und sollen hier nicht näher betrachtet werden. Stattdessen wird in den weiteren Ausführungen auf die für diese Arbeit relevanten Besonderheiten der Funktionen näher eingegangen. Allgemein lässt sich formulieren, dass die native XML-Speicherung in DB2 for z/OS transparent zu externen Anwendungen implementiert ist. Sämtliche zur nativen XML-Speicherung benötigten Strukturen werden vom Datenbankmanagementsystem selbst verwaltet und bleiben durch geeignete Mechanismen extern verborgen (Details siehe [Koc11]). Auch die Funktionen XML-Parsen und XML-Serialisieren werden implizit benutzt, sofern eine Transformation von XML-Dokumenten durch eine SQL-Verarbeitung notwendig ist und nicht explizit vom Anwender durch die entsprechenden Funktionsaufrufe veranlasst wird. Durch diese Sachverhalte wird 21 3 Grundlagen eine umfassende Transparenz der nativen XML-Speicherung erreicht, was vor allem in Migrationsszenarien – Details dazu siehe [Koc11] – viele Vorteile mit sich bringt. Die XMLPARSE-Funktion nutzt zum Parsen von XML-Dokumenten die z/OS XML System Services [IBM09c], die das validierende und das nicht-validierende XML-Parsen unterstützen. Bereits an dieser Tatsache lässt sich erkennen, dass zwischen dem Prozess des Parsens und dem der Validierung ein enger Zusammenhang besteht, auf den in Kapitel 7 näher eingegangen wird. Eine wichtige Eigenschaft der XMLPARSE-Funktion besteht in der Art und Weise, wie mit so genanntem Whitespace umgegangen werden soll. Damit sind Formatierungszeichen wie beispielsweise Leerzeichen gemeint, die sich zwischen Elementen ohne darin (direkt) enthaltene Textknoten befinden (siehe Abbildung 3). Dieser Whitespace hat demnach keine inhaltliche Bedeutung für ein XML-Dokument und dient nur dessen besserer Lesbarkeit durch den Anwender. Die XMLPARSE-Funktion ermöglicht hier zwei Alternativen. Mithilfe der Option STRIP WHITESPACE lässt sich Whitespace beim Parsen entfernen oder per PRESERVE WHITESPACE beibehalten. Die Variante STRIP WHITESPACE ist dabei der Default-Wert und wird aus diesem Grund auch für die weiteren Betrachtungen der vorliegenden Arbeit verwendet. XML-Dokument mit Whitespace XML-Dokument ohne Whitespace <seite id="seite1"> <textblock id="textblock1"> Ich bin ein Text! </textblock> </seite> <seite id="seite1"><textbloc k id="textblock1">Ich bin ei n Text!</textblock></seite> Abbildung 3: Whitespace in XML-Dokumenten Für die XMLSERIALIZE-Funktion lassen sich derartige Besonderheiten nicht aufführen. Sie ermöglicht es, die nativen XML-Dokumente entweder in einen Binary-String [IBM11a] oder in einen Character-String [IBM11a], wie beispielsweise ein CLOB-Dokument, zu transformieren. Dabei lässt sich lediglich der genaue Zieldatentyp bestimmen und ob das resultierende, serialisierte XML-Dokument über eine XML-Deklaration verfügen soll oder nicht. Per Default wird auf das Hinzufügen der XML-Deklaration verzichtet. Daran orientieren sich auch die weiteren Ausführungen dieser Arbeit. 22 3 Grundlagen Aufgrund der bereits angesprochenen großen Bedeutung der beiden Funktionen XMLPARSE und XMLSERIALIZE für die Verarbeitung von XML-Daten werden diese in der vorliegenden Arbeit ebenfalls hinsichtlich ihrer Performance untersucht. Zur XMLPARSE-Funktion finden sich in Abschnitt 6.1.4 verschiedene Messreihen zu diversen Vergleichskriterien (siehe Abschnitt 5.1). Die Effizienz der XMLSERIALIZE-Funktion wird in Zusammenhang mit den Ausführungen in Abschnitt 8.2 betrachtet. 3.1.3 XPath Die XML Path Language (XPath) [W3C99] ist eine 1999 in Version 1.0 vom W3C-Consortium verabschiedete Abfragesprache für XML-Dokumente. Sie orientiert sich an der baumartigen Struktur der XML-Dokumente und verwendet XPath-Ausdrücke zur Adressierung einzelner (Baum-)Knoten. Die wichtigste Form eines XPath-Ausdrucks ist der Lokalisierungspfad, der sich aus verschiedenen durch „/“ getrennte Lokalisierungsschritten zusammensetzt. Diese wiederum bestehen aus je einer Achse, einem Knotentest und optional aus beliebig vielen Prädikaten. [W3C99] Mithilfe der Achsendefinition lässt sich auf unterschiedliche Weise durch die einzelnen Knoten eines XML-Dokuments navigieren [W3C99]. Dazu stehen verschiedene Möglichkeiten zur Verfügung, von denen in Abbildung 4 nur ein für diese Arbeit wesentlicher Auszug vorgestellt wird. Achse Beschreibung / Selektiert von dem Wurzelknoten ausgehend // Selektiert alle Knoten des Dokuments, die der weiteren Selektion entsprechen, egal wo sie sich befinden . Selektiert den aktuellen Knoten .. Selektiert den Elternknoten des aktuellen Knotens @ Selektiert einen Attributknoten Abbildung 4: Beschreibung wesentlicher XPath-Ausdrücke [W3S11b] 23 3 Grundlagen Durch einen Knotentest können abhängig von der Achsendefinition die gesuchten Elemente noch näher beschrieben werden. Die einfachste Form ist dabei die Angabe eines Knotennamens. Wird ein solcher verwendet, dann wird innerhalb der Knotenmenge, die sich durch die aktuelle Achsendefinition ergibt, nach Knoten gesucht, die exakt diesen Namen besitzen. Das Resultat ist entsprechend eine spezielle Knotenteilmenge. [W3C99] Prädikate, fortan auch Filterprädikate genannt, erlauben es, die durch die Achsendefinition und den Knotentest resultierende Knotenteilmenge weiter einzuschränken. Dazu lassen sich innerhalb von eckigen Klammern „[“ und „]“ nahezu beliebige XPath-Ausdrücke verwenden, die insbesondere Operatoren wie beispielsweise die in dieser Arbeit verwendeten AND- und OR-Operatoren enthalten können. [W3C99] Nähere Details zur XPath-Spezifikation sind für die folgenden Ausführungen dieser Arbeit nicht wesentlich und sollen daher nicht diskutiert werden. Weiterführende Informationen finden sich in [W3C99]. Mittlerweile existieren verschiedene auf der Abfragesprache XPath 1.0 aufbauende Standards, wie beispielsweise die Spezifikationen XPath 2.0 [W3C10b] oder XQuery 1.0 [W3C10c]. DB2 for z/OS Version 9 unterstützt im Gegensatz zu der Produktlinie DB2 for LUW6 keine der genannten Erweiterungen. Jedoch orientiert sich die dortige Umsetzung der „XPath 1.0“Spezifikation bereits am Datenmodell und Typsystem der Spezifikationen XPath 2.0 und XQuery 1.0. Ausführlichere Informationen dazu liefert [IBM10e]. 3.2 DB2-Infrastruktur in der DATEV DB2 for z/OS ist das zentralste Datenbankmanagementsystem in der IT-Landschaft7 der DATEV. Die Installation dort umfasst mehrere Data Sharing Groups (siehe Abschnitt 5.2.2), sodass mit zunehmend produktiverem Charakter zwischen 6 DB2 for LUW bietet in Version 9 Unterstützung für die „XQuery 1.0“-Spezifikation. 7 Darüber hinaus werden in der DATEV aber auch andere Datenbankmanagementsysteme wie beispiels- weise Microsoft SQL Server oder auch Oracle betrieben. 24 3 Grundlagen Test, Entwicklung, Qualitätsmanagement und Produktion unterschieden wird. Die in dieser Auflistung enthaltene Entwicklungsumgebung ist auch die Ebene, auf der die in der vorliegenden Arbeit untersuchten Performance-Messreihen durchgeführt wurden. Eine detaillierte Beschreibung der Kenndaten dieser Umgebung erfolgt in Abschnitt 3.2.2 in speziellem Bezug zum Subsystem Mem1 und zu den Objekten, die zu den einzelnen Messreihen verwendet wurden. Allgemein gehaltene Informationen zu DB2 for z/OS werden in Abschnitt 3.2.1 beschrieben. 3.2.1 DB2 for z/OS DB2 [IBM11x] ist ein von IBM entwickeltes und vertriebenes relationales Datenbankmanagementsystem, das für verschiedene Plattformen verfügbar ist. Die verbreitetsten Produktlinien sind dabei das in dieser Arbeit betrachtete DB2 for z/OS (aktuelle Version: 10) [IBM11o] und DB2 for Linux, UNIX and Windows (DB2 for LUW, aktuelle Version: 9.7) [IBM11p]. In seinen Ursprüngen geht DB2 auf den in den 1970er Jahren entwickelten Prototypen „System R“ [Ley11] zurück, aus dem dann SQL/DS8 als erstes relationales Produkt von IBM entstand. DB2 ist erstmalig 1983 als Datenbankmanagementsystem für das Betriebssystem Multiple Virtual Storage (MVS) [IBM78] veröffentlicht worden. Aus diesem entwickelte sich das heutige z/OSBetriebssystem [IBM11q] der modernen IBM-Mainframe-Architektur „System z“. [Mil11] Die umgangssprachlich auch als Dinosaurier betitelten Großrechner (Mainframes) galten lange Zeit als vom „Aussterben“ bedroht. Aufgrund ihrer Eigenschaft, hohe Anforderungen an Skalierbarkeit, Verfügbarkeit und Sicherheit erfüllen zu können, nehmen sie jedoch auch heute noch eine wichtige Rolle in der IT-Landschaft zahlreicher Großunternehmen ein [Pic09]. In den vergangenen Jahren hat sich in der Industrie sogar eine steigende Tendenz gezeigt, den Mainframe wieder vermehrt zu verwenden und die IT-Landschaft dahingehend zu konsolidieren. IBM hat diesen Trend gefördert und investiert daher fortwährend in die Weiterentwicklung der Plattform „System z“. DB2 for z/OS wurde und wird dabei ebenfalls permanent modernisiert 8 heute DB2 Server for VSE & VM [IBM11r] 25 3 Grundlagen und um neue Features, wie beispielsweise die native Speicherung und Verarbeitung von XMLDaten, erweitert. Diese bildet den Kern der hier erbrachten Ausarbeitung. Im weiteren Verlauf der Arbeit wird DB2 for z/OS verkürzt als DB2 bezeichnet. Verweise auf andere DB2Produktlinien sind dagegen explizit vermerkt. [Com07] Wie bereits in Abschnitt 2.4 erwähnt, wird DB2 innerhalb der DATEV momentan in Version 9.1 („new-function mode“) eingesetzt. Sofern nicht anders kenntlich gemacht, beziehen sich alle weiteren Erwähnungen stets auf diese DB2-Version. 3.2.2 Entwicklungsumgebung Im folgenden Abschnitt sind allgemeine Kennzahlen zu der DB2-Entwicklungsumgebung der DATEV zusammengetragen. Dieser sind die zwei Subsysteme Mem1 und Mem29 zugeordnet. Da die zu der vorliegenden Arbeit durchgeführten Messungen auf dem zuerst genannten System ausgeführt wurden, beziehen sich auch die in diesem Abschnitt aufgelisteten Kenndaten auf das System Mem1. Dabei wird einerseits auf allgemeine Informationen zur verwendeten zSeries, der darauf installierten Betriebssystemsversion und dem benutzten Storage-System eingegangen. Andererseits sollen hier aber auch die speziellen Strukturen beschrieben werden, die mit den einzelnen Messreihen verbunden sind. Dazu zählen die verschiedenen Tablespaces, die Bufferpools BP4 und BP16K1 und die für das Subsystem Mem1 definierten Parameter TBSBPXML, LOBVALA, LOBVALS. Da innerhalb der vorliegenden Arbeit zusätzliche Erklärungen zu den einzelnen Aspekten an passender Stelle gegeben werden, erfolgt die anschließende Präsentation der Kenndaten in stichpunktartiger Form. 9 Die Bezeichnung der DB2-Subsysteme wurde aus Datenschutzgründen verfremdet. 26 3 Grundlagen Allgemeine Informationen zSeries = z196 (neueste Generation) [IBM11y] Betriebssystemversion = z/OS 1.12 [IBM10b] Storage-System = Hitachi Data Systems (HDS) – Virtual Storage Platform (VSP) mit 12 Terabyte Speicherkapazität Verwendete Objekte (inklusive Parametrisierung) Tablespaces Tablespaces der Basistabellen STORAGEGROUP = STASPD01 LOCKSIZE = ANY BUFFERPOOL = BP4 LOCKMAX = SYSTEM CODED CHARACTER SET IDENTIFIER (CCSID) = EBCDIC beziehungsweise UNICODE (nur Abschnitt 6.1.3) LOB-Tablespaces DATA SET SIZE (DSSIZE) = 4G BUFFERPOOL = BP16K1 STORAGEGROUP = STASPD01 LOCKSIZE = ANY LOCKMAX = SYSTEM XML-Tablespaces STORAGEGROUP = STASPD01 LOCKSIZE = ANY BUFFERPOOL = BP4 LOCKMAX = SYSTEM CODED CHARACTER SET IDENTIFIER (CCSID) = UNICODE Bufferpools (Snapshot-Betrachtung bezüglich Nutzung) BP4 USE COUNT = 547 BUFFERPOOL SIZE = 6857 (4K Pages) BUFFERS AUTOSIZE = NO BUFFERS ACTIVE = 6857 ALLOCATED = 6857 PAGE STEALING METHOD = LRU VP SEQUENTIAL STEAL THRESHOLD (VPSEQT) = 80 DEFERRED WRITE THRESHOLD (DWQT) = 50 VERTICAL DEFERRED WRITE THRESHOLD (VDWQT) = 10, 0 BP16K1 USE COUNT = 11 BUFFERPOOL SIZE = 1000 (16K Pages) BUFFERS AUTOSIZE = NO BUFFERS ACTIVE = 1000 ALLOCATED = 1000 PAGE STEALING METHOD = LRU VP SEQUENTIAL STEAL THRESHOLD (VPSEQT) = 80 DEFERRED WRITE THRESHOLD (DWQT) = 50 VERTICAL DEFERRED WRITE THRESHOLD (VDWQT) = 10, 0 27 3 Grundlagen Subsystem-Parameter TBSBPXML = BP16K1 (siehe oben) LOBVALA = 40.960 Kilobyte LOBVALS = 6.144 Megabyte 3.3 Performance-Zeiten: Elapsed- und CPU-Zeit Bei der DB2-spezifischen Performance-Analyse wird auf oberster Ebene zwischen der Response-Zeit und den von DB2 erfassten Elapsed-Zeiten unterschieden. Die Response-Zeit ist die Zeit, die insgesamt von dem Initiieren einer gewissen Verarbeitung bis zur Präsentation des Ergebnisses beim Nutzer vergeht. Dementsprechend umfasst sie sämtliche Kosten (Zeitanteile), die sowohl innerhalb als auch außerhalb von DB2 entstehen. Dazu gehören insbesondere auch die Elapsed-Zeiten. Diese lassen sich in drei Klassen unterteilen, die nun näher beschrieben werden. [IBM00] Class 1 Elapsed-Zeit Die Class 1 Elapsed-Zeit, auch „Application Elapsed“-Zeit genannt, umfasst die Zeit, die innerhalb von DB2 und im Front-End zur Abarbeitung einer speziellen Aktion benötigt wird. Damit ist insbesondere die Class 2 Elapsed-Zeit ein Teil der Class 1 Elapsed-Zeit. Class 2 Elapsed-Zeit Die Class 2 Elapsed-Zeit setzt sich aus der DB2-CPU-Zeit und der Class 3 Elapsed-Zeit zusammen. Sie beschreibt die komplette Zeit, die für die DB2interne Abarbeitung einer Aktion gebraucht wird. Class 3 Elapsed-Zeit Die Class 3 Elapsed-Zeit ist ein Teil der Class 2 Elapsed-Zeit und setzt sich aus verschiedenen einzelnen Zeiten zusammen, zu denen unter anderem die Zeiten für I/O Suspension, Lock/Latch Suspension, Asynchronous Read, Service Task und Archive Log (Quiesce) gehören. 28 3 Grundlagen Die betrachteten Elapsed-Zeiten sind mit ihren Anteilen und Abhängigkeiten zueinander in Abbildung 5 veranschaulicht. In die Darstellung einbezogen ist ebenfalls die CPU-Zeit. Diese bezeichnet die reine Rechenzeit, die auf den CPUs der zSeries zur Abarbeitung einzelner Aktionen benötigt wird. Sie stellt die konstanteste und somit aussagekräftigste Maßzahl dar. Deshalb liegt der Fokus der in dieser Arbeit durchgeführten Performance-Analysen primär auf der Messdatenerhebung zur CPU-Zeit. Abbildung 5: Klassifizierung der Elapsed-Zeiten [IBM00] Während die Class 3 Elapsed-Zeit im Wesentlichen dazu dient, bei auftretenden PerformanceEngpässen gezielt deren Ursache ermitteln zu können, hat sich die Class 2 Elapsed-Zeit in der Praxis als eine geeignete Maßzahl zum Einstieg in die Performance-Analyse etabliert. Deshalb stützen sich die hier durchgeführten Untersuchungen neben der CPU-Zeit auch auf die Datenerhebung zur Class 2 Elapsed-Zeit, die weiterhin verkürzt nur als Elapsed-Zeit bezeichnet wird. 3.4 Toolumfeld Im Rahmen der hier durchgeführten Untersuchungen sind diverse Tools eingesetzt worden. Während sich für die meisten Tätigkeiten das IBM Data Studio [IBM11m] als geeignete (Tool-) Umgebung auszeichnete, erwies sich der CA Detector [CAT11] für den speziellen Kontext der Messdatenerfassung als das geeignete Werkzeug. Die genannten Tools sollen im weiteren Verlauf des Abschnitts näher beschrieben werden. Dabei wird insbesondere auf das bis zuletzt noch eigenständige Produkt Visual Explain [IBM11k] eingegangen, das es ermöglicht, Zugriffspläne zu persistieren und anschließend zu visualisieren. 29 3 Grundlagen 3.4.1 IBM Data Studio Das IBM Data Studio [IBM11m] ist ein von IBM entwickeltes und vertriebenes Datenbanktool, das auf der Eclipse-Plattform [Ecl11] aufbaut. Es soll Entwickler und Administratoren bei der Arbeit mit IBM-Datenbanksoftware wie beispielsweise DB2 unterstützen. Die Funktionalitäten des IBM Data Studios lassen sich in die folgenden vier Kernbereiche einteilen [IBM12a]. Design Entwicklung Administration Tuning Bislang wurden für diese Bereiche von IBM unter anderem die Tools DB2 Control Center [IBM11i], Optimization Service Center (OSC) [IBM11j] und Visual Explain [IBM11k] empfohlen. Mit der Einführung des IBM Data Studios galten diese als veraltet („deprecated“). Speziell die Funktionalitäten des bis dahin eigenständigen Produkts Visual Explain sind nun offiziell Bestandteil des IBM Data Studios. Ein großer Vorteil dieses Tools ist seine Eigenschaft, innerhalb einer Eclipse-basierten Umgebung gleichzeitig Werkzeuge zur Anwendungsentwicklung und zur Umsetzung von Datenbankprojekten zur Verfügung zu stellen. So lassen sich zum Beispiel Java-Applikationen parallel zu den darin eingebetteten SQL-Anfragen verwalten, entwickeln und testen. [IBM12a] Das IBM Data Studio gibt es in den zwei Versionen „Administration Client“ („Integrated Development Environment (IDE)“) und „Full Client“ („Stand Alone“) [IBM11n]. Beide sind in ihren Basisausführungen (ohne Upgrades10) kostenfrei verfügbar. Sie unterscheiden sich nur in dem Umfang der integrierten Datenmodellierungs- und Anwendungsentwicklungsmodule. Während die „Administration Client“-Version alle verfügbaren Basisfunktionalitäten umfasst, ist für die „Full Client“-Version gezielt auf einzelne Module verzichtet worden [IBM11l]. In der DATEV erfolgt momentan die Untersuchung der aktuellen „Full Client“-Version 3.1 des IBM Data Studios. Neben den verschiedenen Komponenten des Tools wird dabei auch betrachtet, für welche grundlegenden Aufgaben die Verwendung des IBM Data Studios denkbar wäre. Im Rahmen dieser Arbeit sind dabei unter anderem die folgenden Funktionalitäten betrachtet worden. 10 IBM Optim Query Tuner [IBM11f], Optim pureQuery Runtime [IBM10d], etc. 30 3 Grundlagen SQL-Skripte erstellen und ausführen Abfrage von Strukturen und Inhalten aus dem Datenbankkatalog „Data Definition Language (DDL)“-Generierung für Datenbankobjekte Verarbeitung clientseitiger XML-Dokumente Erstellung von SQL-Anfragen und -Zugriffsplänen Abfrage von Subsystem-Parametern Als eines der (noch) wenigen Tools ist das IBM Data Studio in der Lage, mit dem nativen XML-Datentyp in DB2 umzugehen und aus dessen Strukturen abgefragte Daten darzustellen. Diese Eigenschaft ist der Hauptgrund, weshalb das IBM Data Studio für die Untersuchungen, die im Rahmen der hier erbrachten Arbeit stattfanden, als Toolumgebung verwendet wurde. 3.4.2 Visual Explain IBM Visual Explain [IBM11k] ist ein kostenfreies Tool, dessen Kernfunktionalität in der Visualisierung von Zugriffsplänen besteht. Der Vorgang der Externalisierung von Zugriffsplaninformationen nennt sich in DB2 „Explain“. Dabei wird für ein bestimmtes SQL-Statement der dazu vom Optimizer berechnete Zugriffsplan in einer PLAN_TABLE persistiert. Visual Explain ist in der Lage, sowohl den Explain-Prozess anzustoßen als auch dessen Ergebnis aus der PLAN_TABLE als Baumdiagramm zu visualisieren. Ein Beispiel für einen auf diese Weise aufbereiteten Zugriffsplan findet sich mit zusätzlichen Informationen in Abschnitt 8.1.3. Weitere Abbildungen folgen im Anhang zu Kapitel 8. Neben der Fähigkeit, Zugriffpläne zu persistieren und zu visualisieren, bietet das Tool Visual Explain unter anderem noch folgende Funktionalitäten, auf die hier aber nicht näher eingegangen und auf [Bos06] verwiesen werden soll. Abfrage und Analyse des Dynamic Statement Cache Abfrage und Analyse von Zugriffsplänen in Packages [IBM09d] Abfrage von Subsystem-Parametern Import/Export von Zugriffsplänen Service SQL/Query Environment Capture 31 3 Grundlagen Seit der Einführung von DB2 Version 9 gilt das eigenständige Tool Visual Explain als „deprecated“. Dessen oben aufgeführte Funktionalitäten sind allerdings vollständig als „Visual Explain“-Modul in das IBM Data Studio und die darauf aufbauenden Produkte Optim Query Tuner for DB2 for z/OS und Optim Query Workload Tuner for DB2 for z/OS integriert worden. [IBM11k] 3.4.3 CA Detector Der CA Detector [CAT11] ist ein Tool zur Performance-Analyse für „DB2 for z/OS“Anwendungen. Mit seiner Hilfe ist es zum Beispiel möglich, die bei der Ausführung von beliebigen SQL-Statements und Programmen tatsächlich angefallenen Kosten der CPU- und Elapsed-Zeit (siehe Abschnitt 3.3) detailliert aufgeschlüsselt anzeigen zu lassen [CAT11]. Dabei kann der Aufwand speziell auf der Ebene von Nutzer, Member, Prozedur oder anderen zusammengefasst ausgewiesen werden. Diese Funktionalität wurde unter anderem für die Anfertigung der in der vorliegenden Arbeit durchgeführten Performance-Analysen verwendet. Näheres dazu findet sich in Abschnitt 5.3. Darüber hinaus führt der CA Detector auch Protokoll über die aufgetretenen SQLCODEs. Somit lässt sich mithilfe dieses Tools beispielsweise bei der Ausführung bestimmter Anwendungen/Programme nachträglich eine gezielte Fehleranalyse anschließen. Alle Informationen, die der CA Detector sowohl zur Performance- als auch zur Fehleranalyse sammelt, können mithilfe dazu vorgesehener Export-Mechanismen in spezielle DB2-Tabellen weggeschrieben werden. Für weitere Besonderheiten und Funktionalitäten des CA Detectors wird an dieser Stelle auf [CAT11] verwiesen. 32 4 Aktueller Kenntnisstand zu Performance-Kennzahlen 4 Aktueller Kenntnisstand zu Performance-Kennzahlen Eingangs dieser Arbeit ist bereits darauf eingegangen worden, dass auch IBM selbst diverse Performance-Messungen zur pureXML-Implementierung in DB2 durchgeführt und deren Ergebnisse veröffentlicht hat. Die wesentlichsten der dabei evaluierten Testszenarien werden in Abschnitt 4.1 in einem Überblick mit entsprechenden Literaturquellen dargestellt. Auf konkrete Resultate wird dabei aus Umfangsgründen verzichtet. Der Überblick beinhaltet auch „standardisierte“ Ergebnisse, die mithilfe des TPOX-Benchmarks [NGXS11] erhoben wurden. Dieser Benchmark wird in Abschnitt 4.2 näher betrachtet. 4.1 Veröffentlichte Messergebnisse Aktuell existieren verschiedene Performance-Analysen von IBM zu der Implementierung der pureXML-Technologie. Unter diesen befinden sich auch zahlreiche Untersuchungen, die sich speziell auf die native XML-Verarbeitung und -Speicherung in DB2 for z/OS Version 9 beziehen. Der folgende Abschnitt soll einen Überblick über die analysierten Szenarien geben und zur vertiefenden Auseinandersetzung auf die dazugehörigen Literaturquellen verweisen. Dabei ist anzumerken, dass die von IBM durchgeführten Untersuchungen in unterschiedlichem Umfang in diversen Publikationen veröffentlicht wurden. Die zwei umfangreichsten Quellen bilden [IBM07] und [IBM10c], aus denen die nun folgenden Auflistungen der einzelnen Performance-Analysen erstellt worden sind. Manipulationen von XML-Daten INSERT [IBM07, IBM10c] INSERT mit Indexen [IBM07, IBM10c] INSERT mit und INSERT ohne Schemavalidierung [IBM07] INSERT, INSERT mit Schemavalidierung, Dekomposition [IBM07, IBM10c] INSERT – XML, XML mit Index und CLOB [IBM10c] UPDATE, DELETE + INSERT [IBM07] LOAD [IBM10c] 33 4 Aktueller Kenntnisstand zu Performance-Kennzahlen Zugriff auf XML-Daten FETCH [IBM07, IBM10c] Verwendung von User-Defined-XML-Indexen [IBM07, IBM10c] User-Defined-XML-Index CREATE und REBUILD [IBM10c] Sonstiges Kompression (auf Tabellenebene) [IBM10c] Kompression (per STRIP WHITESPACE) [IBM07] TPOX-Benchmark [IBM10c] Unterstützung z/OS-Spezialprozessor (zAAP) [IBM10c] An dieser Stelle soll erläutert werden, weshalb trotz der zahlreichen veröffentlichten Messergebnisse im Rahmen dieser Arbeit noch weitere Performance-Analysen durchgeführt wurden. Generell begründet sich dies durch die (zu) allgemeinen Kontexte, auf die sich die Untersuchungen von IBM beschränken. Das heißt, detaillierte Performance-Betrachtungen wie beispielsweise zu den einzelnen, bei der DATEV-spezifischen Migration notwendigen Prozessen, zu dem von der indexierten Knotenanzahl abhängigen Indexpflegeaufwand zu unterschiedlichen Konzepten zur Schemavalidierung oder zu den Vorteilen der nativen XML-Verarbeitung hinsichtlich des Datenzugriffs sind nicht auf eine Art und Weise veröffentlicht worden, wie es die Analysen dieser Arbeit beabsichtigen. Ähnliches gilt auch für die hier ausführlich untersuchten Vergleichskriterien der Strukturiertheit und der Zusammensetzung von XML-Dokumenten. Zu diesen sind ebenfalls keine Performance-Analysen publiziert worden. 4.2 Der TPOX-Benchmark Der Benchmark Transaction Processing over XML (TPOX) [NGXS11] wurde ursprünglich von IBM entwickelt [Loe09]. Er zielt darauf ab, ein Instrument darzustellen, das zur PerformanceAnalyse der XML-Verarbeitung in Datenbankmanagementsystemen genutzt werden kann. Dabei orientiert sich der TPOX-Benchmark an einem einfachen Modell einer typischen Finanzanwendung und legt seinen Schwerpunkt auf die Aspekte XQuery, SQL/XML, XML-Speicherung, 34 4 Aktueller Kenntnisstand zu Performance-Kennzahlen XML-Indexierung, XML-Schema-Unterstützung, XML UPDATEs, Logging und Nebenläufigkeit. Zu dem Benchmark zählen die folgenden fünf Komponenten. [NGXS11] Tools zur effizienten Generierung von wohlgeformten XML-Testdokumenten mit dokumentübergreifender referentieller Integrität XML-Schemas zu allen Dokumenten Eine Sammlung von Transaktionen zu den Testdaten mit sowohl XQuery- und SQL/XML-Abfragen als auch INSERT-, UPDATE- und DELETE-Statements Einen Workload-Erzeuger, der in einzelnen Threads beliebig viele gleichzeitige Nutzer simuliert, die einen Transaktionsmix aus der obigen Sammlung ausführen Dokumentationen zu den einzelnen aufgeführten Bestandteilen Nähere Details zu dem TPOX-Benchmark finden sich in [NGXS11]. Wie in Abschnitt 4.1 erwähnt, sind für die XML-Unterstützung von DB2 for z/OS in Version 9 bereits Messdaten zum TPOX-Benchmark veröffentlicht worden [IBM10c]. Des Weiteren liefert ein solcher Benchmark ebenfalls „nur“ allgemeingültige Aussagen. Aus diesen Gründen erfolgte im Rahmen der vorliegenden Arbeit keine erneute Ausführung dieses Benchmarks innerhalb des DATEV-Entwicklungssystems. 35 5 Vorbetrachtungen zur Messdatenerhebung 5 Vorbetrachtungen zur Messdatenerhebung Die vorliegende Diplomarbeit betrachtet drei Themenschwerpunkte aus PerformancePerspektive: Migration und Parsen (siehe Kapitel 6), XML-Schema-Management (siehe Kapitel 7) und Query Performance (siehe Kapitel 8). Zu jedem der Bereiche sind verschiedene Messreihen durchgeführt worden, denen diverse grundlegende Vorüberlegungen gemeinsam sind. Diese sollen in dem folgenden Kapitel zentral gebündelt werden. Eingangs werden in Abschnitt 5.1 die ausgewählten Vergleichskriterien für die durchgeführten Messreihen beschrieben. Dabei handelt es sich um ein kombiniertes Kriterium der Größe und Anzahl, um das Kriterium der Strukturiertheit und um das Kriterium der Zusammensetzung von XML-Dokumenten. Von dieser Einteilung leitet sich auch die Auswahl der Testdaten ab, deren Beschreibung ebenfalls in diesem Abschnitt erfolgt. In Abschnitt 5.2 ist der Fokus auf die Einflussfaktoren gerichtet, die messreihenübergreifend wirken. Speziell die Themen Bufferpool-Management, Data Sharing, Zugriffsart und Transaktionslänge werden dabei näher betrachtet. Um Aussagen zu erhalten, die unabhängig von den Faktoren aus Abschnitt 5.2 sind, gilt es, deren Einflüsse auf die Messreihen zu beseitigen. Dahingehend stellt Abschnitt 5.3 eine Verfahrensweise zur Messdatenerhebung vor, mit der der Ausschluss dieser Faktoren möglich ist und welche dann auch für die durchgeführten Messungen genutzt wurde. Leider ist es nicht realisierbar, die Einflüsse sämtlicher Randbedingungen zu beseitigen beziehungsweise diese überhaupt zu erfassen. Aus diesem Grund wird in Abschnitt 5.4 auf bekannte Schwankungen und Diskrepanzen näher eingegangen. 36 5 Vorbetrachtungen zur Messdatenerhebung 5.1 Generelle Vergleichskriterien XML-Dokumente können sich in ihrem Aufbau voneinander in vielfältiger Weise unterscheiden. Im Wesentlichen lassen sich dabei Unterschiede in den Merkmalen Größe und Struktur feststellen, von denen sich auch die Vergleichskriterien für die in dieser Arbeit betrachteten Messreihen ableiten. Bei der Auswahl der Testdaten sind daher drei verschiedene Kriterien betrachtet worden. Größe und Anzahl Strukturiertheit Zusammensetzung Während das Kriterium der Größe und Anzahl auf eine mengenmäßige Betrachtung abzielt, steht bei der Strukturiertheit die inhaltliche Struktur im Vordergrund. Das Kriterium der Zusammensetzung beschreibt sich als eine Art Mischform aus den beiden erstgenannten Vergleichskriterien. Nähere Details finden sich jeweils in den weiteren Abschnitten. 5.1.1 Größe und Anzahl Die Idee des Kriteriums der Größe und Anzahl liegt darin begründet, festzustellen, ob bei gleichem Gesamtdatenvolumen die Größe der zu verarbeitenden Dokumente einen Einfluss auf die Performance der Verarbeitung hat. In diesem Zusammenhang sind die Faktoren Größe und Anzahl somit voneinander abhängig. Sie müssen stets so gewählt werden, dass ein einheitliches Gesamtdatenvolumen entsteht. Dies ist für die durchgeführten Messreihen auf 100M festgelegt worden. An dieser Stelle sei mit einem Einschub auf die in der vorliegenden Arbeit an die SQL-Syntax der SQL-Reference [IBM11a] angelehnte Schreibweise der Mengenbezeichnungen verwiesen. Entsprechend kürzen sich die einzelnen Mengenbezeichner wie folgt ab. „K“ bezeichnet Kilobyte. „M“ bezeichnet Megabyte und „G“ bezeichnet Gigabyte. Weiterhin gilt für die folgenden Betrachtungen zu dem Kriterium der Größe und Anzahl, dass sie die Verarbeitung von VARCHAR-, CLOB- und XML-Daten vergleichen. Die beiden 37 5 Vorbetrachtungen zur Messdatenerhebung erstgenannten Speicherformen resultieren aus den in der DATEV verwendeten und in [Koc11] beschriebenen Möglichkeiten der nicht-nativen XML-Speicherung. Ausgehend von dem definierten Gesamtdatenvolumen von 100M sind für die durchgeführten Messreihen die Merkmalsausprägungen 200B x 500.000, 1K x 100.000, 10K x 10.000, 100K x 1.000, 1M x 100 und 10M x 10 (jeweils in der Form Dokumentgröße x Dokumentanzahl) gewählt worden. Um bereits einen Eindruck zu bekommen, inwieweit sich diese Ausprägungen in den später folgenden Diagrammen wiederfinden und wie jene zu verstehen sind, zeigt Abbildung 6 ein zufällig gewähltes Beispieldiagramm. Hier wird der Einfluss der Größe und Anzahl auf die Performance des Parse-Prozesses beim INSERT gezeigt. Dabei erfolgte beispielsweise bei dem roten Punkt ganz links gemäß der horizontalen Achse der INSERT von insgesamt 500.000 je 200B großen XML-Dokumenten. Dieser Vorgang benötigte an CPU-Zeit in Summe 40 Sekunden. Die weiteren Punkte zu den Merkmalsausprägungen sind analog dazu zu verstehen. Mehr Details zu diesem Messergebnis folgen in Abschnitt 6.1.4. In Hinblick auf die weiteren Messreihen ist zu beachten, dass nicht immer Messwerte zu allen Merkmalsausprägungen ermittelt werden können. Beispielsweise existiert für den VARCHAR-Datentyp eine Längenbeschränkung von maximal 32K [Koc11], weshalb bei einer auf VARCHAR-Daten basierenden Messreihe nur Messungen bis zur Ausprägung 10K x 10.000 durchgeführt werden können. Auf weitere Einschränkungen dieser Art wird jeweils gesondert verwiesen. 140 120 Sekunden 100 80 60 ELAPSED 40 CPU 20 0 200B x 1K x 10K x 500.000 100.000 10.000 100K x 1.000 1M x 100 10M x 10 Größe und Anzahl Abbildung 6: Beispieldiagramm – Größe und Anzahl 38 5 Vorbetrachtungen zur Messdatenerhebung Bei der Auswahl der Testdatensätze zu den oben beschriebenen Merkmalsausprägungen konnten in allen Fällen Originaldaten11 aus der DATEV-Entwicklungsumgebung verwendet werden. Dabei handelt es sich um Datensätze des Projekts Belegwesen. Dort werden unter anderem Scans von Dokumenten verarbeitet, die zuvor per „Optical Character Recognition (OCR)“-Software zu XML-Daten aufbereitet wurden. Diese XML-Dokumente sind heute als CLOB-Daten nicht-nativ in DB2 abgespeichert. Größenmäßig betrachtet decken sie das gesamte benötigte Spektrum von 200B bis hin zu 10M ab und gehen teilweise sogar noch darüber hinaus. Hierbei ist allerdings zu erwähnen, dass sich unter diesen Daten keine Dokumente befinden, die exakt den gewünschten Merkmalsausprägungen entsprechen. Daher ist für die folgenden Tests zum Kriterium der Größe und Anzahl stets jeweils das Dokument gewählt worden, das am ehesten einer der Ausprägungen entsprach. Die tatsächliche Abweichung von den Richtwerten konnte dadurch in allen Fällen geringer als zwei Prozent gehalten werden, was für die Korrektheit der Messergebnisse aufgrund der in Abschnitt 5.4 dargelegten allgemeinen Schwankungen von fast zehn Prozent tolerierbar ist. Um mithilfe der einzelnen ausgewählten Dokumente den gesamten Testdatenbestand zu generieren, wurden diese bis zu der gewünschten Anzahl hin repliziert. Hinsichtlich der in Abschnitt 8.2 durchgeführten Messungen, bei der die Selektivität der Daten von großer Bedeutung ist, wurde pro Merkmalsausprägung jeweils ein Dokument leicht verändert. Die dabei vorgenommene Anpassung lässt sich zum Teil aus den Abfragen des Abschnitts 8.2 ableiten, ist aber für die weitere Arbeit nicht von Bedeutung. Wichtiger ist es, ein grobes Verständnis von dem Aufbau dieser Dokumente zu bekommen. Zur Einfachheit sei daher angenommen, dass sich die gescannten, teils mehrseitigen Dokumente aus einer Vielzahl von Textblöcken zusammensetzen. Die verwendete OCR-Software hat diese Blöcke erkannt und mit entsprechenden Zusatzinformationen wie beispielsweise ihrer Position, der Schriftart oder auch der Schriftgröße des Texts und anderen Eigenschaften verarbeitet. Weiterhin sei dabei vereinfacht angenommen, dass sich die zusätzlichen Informationen als Attribute über den Pfad „/seite/textblock@xyz“ von der Dokumentwurzel ausgehend erreichen lassen. Abbildung 7 visualisiert den auf diese Weise angenommenen Dokumentaufbau an einem Beispiel. Auch wenn die Struktur der Testdaten in Wirklichkeit komplexerer Art ist, genügt die hier betrachtete Vereinfachung der Nachvollziehbarkeit und Verständlichkeit der in dieser Arbeit vorgestellten Messreihen. 11 nach erfolgter Prüfung des Datenschutzes und Bewilligung durch die verantwortlichen Anwendungs- entwickler 39 5 Vorbetrachtungen zur Messdatenerhebung <?xml version="1.0" encoding="UTF-8"?> <seite id="seite1"> <textblock id="textblock1" posx="50" posy="50" schriftart="arial" schriftgroesse="14" ...> DATEV eG, Paumgartner Straße 6-14, 90329 Nürnberg </textblock> ... <textblock id="textblock10" posx="50" posy="800" schriftart="arial" schriftgroesse="12" ...> Mit freundlichen Grüßen </textblock> </seite> Abbildung 7: Beispieldokument – Größe und Anzahl 5.1.2 Strukturiertheit Das XML-Format ist ein hierarchisch strukturiertes Datenformat. Dementsprechend stellt jedes wohlgeformte XML-Dokument einen Baum mit diversen Knoten dar (siehe Abschnitt 3.1). Innerhalb von XML-Dokumenten findet die eigentliche Informationsspeicherung hauptsächlich in den Knotentypen Attribut, Element und Text statt. Aus dieser Tatsache und der hierarchischen Struktur der Knoten (tief, flach oder balanciert) resultieren diverse grobe Strukturmuster, denen ein XML-Dokument entsprechen kann. Ausgehend von diesen Überlegungen erfolgt die Generierung der Testdaten für die Messreihen zu dem Kriterium der Strukturiertheit der XML-Dokumente. Im Detail ergeben sich dabei 15 verschiedene Testdatenbestände, die analog zu den Bemerkungen aus Abschnitt 5.1.1 aus einem mehrfach replizierten Musterdokument bestehen. Genauere Details zur Struktur dieser Testdokumente werden später in diesem Abschnitt beschrieben. Hinter dem Vergleichskriterium der Strukturiertheit und dem dazugehörigen Testdatenbestand verbirgt sich die Idee, den Einfluss der Strukturiertheit auf die Performance der XMLVerarbeitung zu ermitteln. Aus den Resultaten der folgenden Messungen lassen sich anschließend teilweise Rückschlüsse und Empfehlungen für die Modellierung der Dokumente und der dazugehörigen Schemas ableiten. Hierbei ist jedoch anzumerken, dass für die 40 5 Vorbetrachtungen zur Messdatenerhebung XML-Modellierung bereits zahlreiche Richtlinien existieren [Ora11a, Aue10] und diese, wie auch im relationalen Kontext, nie primär an der Performance festgemacht werden sollten. Bereits weiter oben ist erwähnt worden, dass der Testdatenbestand auch für das hier betrachtete Vergleichskriterium jeweils aus einem mehrfach replizierten Dokument besteht. Für jedes von diesen ist eine Größe von stets 100K und für die Gesamtdatenmenge wiederum 100M gewählt worden. Das entspricht also einer Anzahl von insgesamt 1.000 Dokumenten. Die Dokumentgröße von 100K bietet den Vorteil, dass sie zum einen eine aussagekräftige Basis für die Strukturiertheit der Dokumente bildet. Zum anderen entspricht diese Größe gleichzeitig dem Median der Merkmalsausprägungen bei dem Kriterium der Größe und Anzahl (siehe Abschnitt 5.1.1). Auf der anderen Seite schränkt die Verwendung der Dokumentgröße von 100K aber auch die Wahl der für die Messungen betrachteten Datentypen ein. Da für den VARCHAR-Datentyp eine Längenbeschränkung von 32K gilt [Koc11], ist dieser von den Strukturiertheitsmessungen ausgeschlossen. Dementsprechend findet in den Messreihen der vorliegenden Arbeit lediglich ein Vergleich von Messungen mit den Datentypen CLOB und XML statt. Dies ist aber für die Ergebnissicherung nicht weiter hinderlich, da mit den betrachteten Datentypen bereits je ein Vertreter für die nicht-native und für die native XML-Speicherung in DB2 berücksichtigt ist. Die Unterschiede zwischen den Datentypen der nicht-nativen XML-Speicherung VARCHAR und CLOB liegen allenfalls in dem Kriterium der Größe und Anzahl. Dies beweist auch die in Abschnitt 6.1.1 durchgeführte Messreihe zur Strukturiertheit. Für eine zusätzliche Begründung wird daher auf diesen Abschnitt verwiesen. Da die verschiedenen Merkmalsausprägungen für das Kriterium der Strukturiertheit jeweils eine sehr spezielle Struktur der Testdaten voraussetzen, wurden für den Aufbau der hierzu nötigen Datenbestände künstliche Dokumente verwendet. Deren Erstellung erfolgte skriptbasiert mittels der Java-Umgebung des Tools IBM Data Studio, über das sie auch anschließend in DB2 in separate Tabellen (aufgrund der Merkmalsausprägungen 15 Stück) eingefügt wurden. Die detaillierte Struktur der einzelnen Dokumente ist in Abbildung 8 zu sehen. Dabei beschreibt „Titel“ die Bezeichnung der jeweiligen Testdatenstruktur, die sich später auch in den Diagrammen zur Messdatenauswertung wiederfindet. Die darunter abgebildete Grafik visualisiert das jeweilige Strukturmuster der XML-Testdaten. Die Inhalte unter dem Punkt „Knoten“ geben Aufschluss auf den konkreten Anteil an Element-, Attribut- und Textknoten im Dokument. Der Aspekt „Struktur“ beschreibt die hierarchische Struktur der Knoten bildlich gesprochen in der Form tief, flach oder balanciert. 41 5 Vorbetrachtungen zur Messdatenerhebung Dokumentwurzel Titel Elementknoten (E) Attributknoten (A) Textknoten (T) E (tief) E (flach) E (balanciert) T 1 Dokumentwurzel 1 Dokumentwurzel 1 Dokumentwurzel 1 Dokumentwurzel 4.096 Elementknoten 4.096 Elementknoten 4.096 Elementknoten 1 Textknoten tief flach balanciert - A A, T E, T (tief) E, T (flach) Grafik Knoten Struktur Titel Grafik Knoten Struktur Titel 1 Dokumentwurzel 4.096 Attributknoten 1 Dokumentwurzel 1 Dokumentwurzel 1 Dokumentwurzel 2.048 Attributknoten 2.048 Elementknoten 2.048 Elementknoten 1 Textknoten 2.048 Textknoten 2.048 Textknoten - - tief flach E, T (balanciert) A, E (tief) A, E (flach) A, E (balanciert) Grafik Knoten Struktur Titel 1 Dokumentwurzel 1 Dokumentwurzel 1 Dokumentwurzel 1 Dokumentwurzel 2.048 Elementknoten 2.048 Attributknoten 2.048 Attributknoten 2.048 Attributknoten 2.048 Textknoten 2.048 Elementknoten 2.048 Elementknoten 2.048 Elementknoten balanciert tief flach - A, E, T (tief) A, E, T (flach) A, E, T (balanciert) Grafik Knoten Struktur 1 Dokumentwurzel 1 Dokumentwurzel 1 Dokumentwurzel 1.366 Attributknoten 1.366 Attributknoten 1.366 Attributknoten 1.366 Elementknoten 1.366 Elementknoten 1.366 Elementknoten 1.366 Textknoten 1.366 Textknoten 1.366 Textknoten tief flach balanciert Abbildung 8: Merkmalsausprägungen des Kriteriums der Strukturiertheit 42 5 Vorbetrachtungen zur Messdatenerhebung Allgemein lassen sich noch folgende Anmerkungen zu den Merkmalsausprägungen beziehungsweise zu der obigen Abbildung formulieren. Wenn eine Testdatenstruktur mehrere Knotentypen kombiniert, dann ist die Informationsmenge stets so verteilt, dass diese pro Knotentyp gleich gewichtet ist. Beispielsweise enthält daher bei der Merkmalsausprägung „A, T“ der eine Textknoten genauso viele Informationen wie die Gesamtheit der 2.048 Attributknoten. Weiterhin ist zu erwähnen, dass die Daten der als „tief“ bezeichneten Merkmalsausprägung nicht exakt so gradlinig konstruiert sind, wie es die Grafik suggeriert. Da DB2 die Restriktion besitzt, dass ein XML-Dokument maximal eine Tiefe von 128 Level haben kann [IBM11a], ist es beispielsweise nicht möglich, im Fall der Ausprägung „E (tief)“ alle 1.024 Elemente wie dargestellt miteinander als lineare Liste zu verknüpfen. In einem solchen Fall ist die tatsächliche Form der Testdaten generell so gewählt, dass sie die maximal mögliche Tiefe auf balancierte Weise – also in Anlehnung an beispielsweise die Merkmalsausprägung „E (balanciert)“ – ausnutzen. Auf den ersten Blick scheint die Einteilung in fünfzehn verschiedene Testdatenbestände unvollständig, da für bestimmte Kombinationen die verschiedenen Strukturmöglichkeiten nicht betrachtet wurden. Da aber nur Elementknoten ineinander verschachtelt werden können, sind für die Merkmalsausprägungen „A“ (nur Attributknoten), „T“ (nur Textknoten) und „A, T“ (nur Attribut- und Textknoten) keine weiteren Variationen in der Struktur möglich. Aus der Tatsache, dass für die Testdaten zu dem Kriterium der Strukturiertheit künstliche Daten generiert wurden, ergibt sich eine unvermeidbare Einschränkung für die in Kapitel 8 betrachteten Szenarien. Dort wird in den Messreihen Selektiver Zugriff, Indexunterstützter Zugriff und Komplexe Prädikate versucht, die möglichen Effizienzgewinne der nativen XMLSpeicherung an realitätsnahen und XML-spezifischen Abfragen aufzuzeigen. Die für das Kriterium der Strukturiertheit generierten Testdaten sind jedoch künstlicher Art und eignen sich demzufolge für die erwähnten Szenarien nicht. Abgesehen davon weisen sie ihrem Zweck entsprechend große Strukturunterschiede auf, weshalb bereits dahingehend ein Vergleich mithilfe der in den Messreihen verwendeten einheitlichen XPath-Pfadausdrücken nicht möglich wäre. 43 5 Vorbetrachtungen zur Messdatenerhebung Im Rahmen der Messreihe „Komplettzugriff“ aus Kapitel 8 findet das Kriterium der Strukturiertheit dagegen Anwendung. Dementsprechend werden auch für den XMLSerialisierungsprozess von der Strukturiertheit abhängige Kennzahlen ermittelt. Nähere Details dazu finden sich in Abschnitt 8.2.1. Zusammensetzung 5.1.3 Das Kriterium der Zusammensetzung ist vereinfacht formuliert eine Art Mischkriterium aus dem Kriterium der Größe und Anzahl und dem der Strukturiertheit. Es dient prinzipiell dazu, zu ermitteln, ob es effizienter ist, mehrere Entitätsausprägungen innerhalb eines XML-Dokuments zu kumulieren oder jede Entitätsausprägung in einem einzelnen XML-Dokument zu führen. Die erste Merkmalsausprägung und gleichzeitig die Basis für den hierbei verwendeten Testdatenbestand bildet ein 1K großes Dokument, das fortan auch Basisdokument genannt wird. Dieses entspricht symbolisch einer Entitätsausprägung. Die nächste Ausprägung entspricht einem 10K großen Dokument, das durch das Kumulieren des Basisdokuments mit neun weiteren jeweils 1K großen XML-Dokumenten entsteht. Diese Dokumente müssen dabei ebenfalls eine Entitätsausprägung beschreiben, die von der gleichen Entität abgeleitet ist, wie auch das Basisdokument. Da aber davon auszugehen ist, dass zwischen zwei Ausprägungen einer Entität eine große Ähnlichkeit besteht, wird der Einfachheit halber das Basisdokument auch für die neun weiteren Dokumente verwendet. Die nächste Merkmalsausprägung bildet dann analog zu dem Messkriterium der Größe und Anzahl ein 100K großes Dokument, das sich dann aus insgesamt 100 Einzeldokumenten der Größe 1K zusammensetzt. Auf die gleiche Weise definieren sich auch die folgenden Ausprägungen in 10er-Potenzen bis zur Merkmalsausprägung von 10M (siehe Abbildung 9). 1K 1K 1K 1K 1K 1K 1K 1K 1K 1K 1K 1K 1K 1K 1K 1K 1K 1K 1K 1K 1K 1K 1K 1K 1K 1K 1K 1K 1K … 1K … 1K … 1K 1K 10 x 1K 10K 100 x 1K 100K 1.000 x 1K 1M Abbildung 9: Merkmalsausprägungen des Kriteriums der Zusammensetzung 44 10.000 x 1K 10M 5 Vorbetrachtungen zur Messdatenerhebung In weiterer Analogie zum Kriterium der Größe und Anzahl wurde auch das Gesamtdatenvolumen für die jeweiligen Merkmalsausprägungen stets auf 100M fixiert. Dementsprechend müssen für die weiteren Messreihen die einzelnen Dokumente abhängig von ihrer Größe so oft repliziert werden, bis die gesamte Datenmenge in jeder Ausprägung dem genannten Gesamtdatenvolumen entspricht. Bei dem Kriterium der Zusammensetzung handelt es sich, wie bereits eingangs dieses Abschnitts erwähnt, um eine Art Mischkriterium aus dem Kriterium der Größe und Anzahl und dem der Strukturiertheit. Die Parallelen zu dem Kriterium der Größe und Anzahl (siehe Abschnitt 5.1.1) sind bereits durch die weiter oben angefügten Bemerkungen aufgezeigt worden. Hierbei ist noch anzumerken, dass das gewählte Basisdokument demselben Dokument entspricht, das auch bei dem Kriterium der Größe und Anzahl für die Merkmalsausprägung 1K verwendet wurde. Somit handelt es sich bei dem für das Kriterium der Strukturiertheit verwendeten Testdatenbestand ebenfalls um realitätsnahe Daten aus der Entwicklungsumgebung. Weiterhin ist noch der Zusammenhang mit dem Kriterium der Strukturiertheit (siehe Abschnitt 5.1.2) zu erklären. Durch das wiederholte Kumulieren von einer wachsenden Anzahl von jeweils 1K großen Dokumenten entstehen neue XML-Dokumente, die im Wesentlichen in ihrer Baumstruktur nur in der Breite wachsen. Dies lässt sich auch anhand der in Abbildung 9 grafisch dargestellten Zusammensetzung der kumulierten Dokumente erkennen. Verglichen mit dem Basisdokument besitzen die kumulierten Dokumente (10K, 100K, 1M und 10M) in Relation zu ihrer Größe eine zunehmend flachere Struktur. Da eine detaillierte Untersuchung der verschiedensten Strukturmuster bereits mit dem Kriterium der Strukturiertheit erfolgt, zeigt sich durch diese Abflachung der Zusammenhang des Kriteriums der Zusammensetzung zu dem der Strukturiertheit. Im weiteren Verlauf der Arbeit wird sich die offensichtliche Annahme bestätigen (siehe Abschnitt 6.1.1), dass die Strukturiertheit von XML-Dokumenten keinen Einfluss auf die Performance der nicht-nativen Verarbeitung dieser Dokumente hat. Daher werden bezüglich des Kriteriums der Zusammensetzung nur Messreihen unter Berücksichtigung der nativen XML-Verarbeitung detailliert betrachtet. Darin eingeschlossen ist somit auch die Analyse der Performance des XML-Parse-Prozesses (siehe Abschnitt 6.1.4). 45 5 Vorbetrachtungen zur Messdatenerhebung 5.2 Einflussfaktoren Durch vielfältige Technologien und dazugehörige Mechanismen ist DB2 ein komplexes und zugleich mächtiges Datenbankmanagementsystem. Dem geschuldet ist jedoch beispielsweise auch eine erhöhte Sorgfalt, mit der unter anderem Messungen erhoben und ausgewertet werden müssen. Dies gilt auch für die in dieser Arbeit erbrachten Messreihen zum Aspekt Performance. Durch die Komplexität von DB2 ergeben sich verschiedene Einflussgrößen und Randbedingungen, die auf die Messungen einwirken. Dabei lassen sich im Wesentlichen die Faktoren Bufferpool-Management, Data Sharing, Zugriffsart und Transaktionslänge benennen, die in den weiteren Abschnitten näher beschrieben werden. 5.2.1 Bufferpool-Management Ein zentraler Einflussfaktor auf die Performance-Messungen resultiert aus dem BufferpoolManagement des DB2. Bei einem Bufferpool handelt es sich um einen Cache im Hauptspeicher des Systems. Dieser dient dazu, aufwändige Input/Output-Vorgänge (I/O-Vorgänge) möglichst zu vermeiden und so die große Differenz zwischen Prozessorgeschwindigkeit und langsamen Plattenzugriffen zu reduzieren. Standardmäßig besitzt DB2 mehrere Bufferpools und ermöglicht es dem Administrator, zusätzlich eigene Bufferpools zu definieren oder vorhandene zu modifizieren. Daten speichert DB2 aufgrund seiner Eigenschaft als relationales Datenbankmanagementsystem in Relationen (Tabellen). Physisch werden diese in Tablespaces abgelegt, wobei DB2 dabei zwischen verschiedenen Typen von Tablespaces unterscheidet, für die auf [Fav07] verwiesen wird. Zusätzlich gibt es noch Indexspaces, in denen jeweils genau ein Index physisch abgelegt ist. Als Synonym wird für beide Formen dieser Spaces auch der Begriff Pageset verwendet. Der Bezeichnung entsprechend enthält ein Pageset eine Menge von Pages. Bei diesen Pages handelt es sich um 4K bis 32K große Datenseiten, die wiederum physisch in so genannten Datasets (Dateien) gespeichert sind. Jedes dieser Datasets kann viele Pages enthalten. Abbildung 10 46 5 Vorbetrachtungen zur Messdatenerhebung veranschaulicht die beschriebenen, zueinander in Beziehung stehenden Datenbankobjekte. Der Übersichtlichkeit halber ist dabei auf die Illustration der Datasets verzichtet worden. [IBM09a] Datenbank Pagesets Tablespaces Indexspaces Tabellen (1 - n) Index (1) Pages Pages Abbildung 10: Beziehungen zwischen den Datenbankobjekten Die Zuordnung eines Bufferpools findet auf Pageset-Ebene statt. Ein Pageset kann stets genau einem Bufferpool zugeordnet werden. Umgekehrt können verschiedene Pagesets denselben Bufferpool verwenden. Als Granulat nutzt jeder Bufferpool in DB2 die Page, um Daten vom Sekundärspeicher im Primärspeicher zu cachen und dort für weitere Zugriffe bereitzustellen. Im Fall eines erfolglosen Getpage Requests (Cache Miss), das heißt wenn eine angeforderte Seite nicht im Bufferpool aufgefunden wird, führt DB2 einen oder mehrere I/O-Vorgänge aus und lädt dabei die gewünschten Daten aus dem Sekundärspeicher nach. Dabei werden aus Gründen der Performance in der Regel mehrere Pages gemeinsam nachgeladen. Auf diese Weise können durch gezieltes Prefetching zum Teil aufwändige zusätzliche I/O-Vorgänge vermieden werden. Das Bufferpool-Management ist aber noch komplexer als die hier beschriebenen Grundzüge. Auf nähere Details zu verschiedenen Ersetzungsstrategien, diversen Mechanismen oder zur Einteilung der möglichen Zugriffe (Lesen oder Schreiben, synchron oder asynchron) wird an dieser Stelle verzichtet und auf die Literatur [IBM09a] verwiesen. Teilweise werden aber auch in Abschnitt 5.2.4 noch zusätzliche Informationen gegeben. 47 5 Vorbetrachtungen zur Messdatenerhebung Auf den Aspekt der Performance-Messung bezogen, ergeben sich je nach aktuellem Inhalt der Bufferpools unterschiedliche Resultate. Sollten also vor dem Start eines Messlaufs bereits zu verarbeitende Daten im entsprechenden Bufferpool enthalten sein, dann ist zu erwarten, dass die Messreihe wesentlich schneller abläuft, als wenn keine dieser Daten im Bufferpool liegen. Leider ist es nur schwer bis gar nicht möglich, den aktuellen Inhalt des Bufferpools zu ermitteln beziehungsweise vorherzusagen. Aus diesem Grund sind die Messreihen dieser Arbeit stets so gestaltet, dass zuvor generell alle in den jeweiligen Messungen zu verarbeitenden Daten aus dem Bufferpool entfernt werden. Genaueres zu der dazu verwendeten Verfahrensweise findet sich in Abschnitt 5.2.4. Einen weiteren Einfluss auf die Messreihen hat auch das Verdrängen von zuvor geänderten Daten aus dem jeweils genutzten Bufferpool auf den Sekundärspeicher. Für die Entwicklungsumgebung ist davon auszugehen, dass die Bufferpools stets gefüllt sind. Daher entsteht in diesem Fall für das Verdrängen der geänderten Daten ein Zusatzaufwand, der kontinuierlich und quasi linear abläuft. Vor allem aber aufgrund der asynchronen Charakteristik des Verdrängungsprozesses – nähere Details dazu finden sich in Abschnitt 5.2.4 – ist dieser Aufwand für die weiteren Betrachtungen nicht von Bedeutung. Abschließend sei angefügt, dass die zu vergleichenden Messreihen auch jeweils mit demselben Bufferpool arbeiten sollten. Das heißt, dass beispielsweise der XML-Tablespace und der LOBTablespace einen gemeinsamen Bufferpool benutzen. Allgemein formuliert, ist für die in dieser Arbeit durchgeführten Messungen stets folgende Verwendung der in Abschnitt 3.2.2 beschriebenen Bufferpools vorgesehen worden. BP4 (Bufferpool mit Pagesize 4K) Tablespaces der Basistabellen BP16K1 (Bufferpool mit Pagesize 16K) LOB-Tablespaces XML-Tablespaces Die Zuordnung der Bufferpools wurde dabei bewusst getroffen. Dahingehend entspricht der Bufferpool BP4 dem in dem DATEV-Entwicklungssystem Mem1 standardmäßig verwendeten Bufferpool mit der Default Pagesize 4K. Die native XML-Speicherung ist in DB2 aber zwingend an die Pagesize 16K gebunden [Zha08]. Da die Erstellung der XML-Tablespaces stets implizit erfolgt, nutzt DB2 dazu den per Subsystem-Parameter TBSBPXML festgelegten 48 5 Vorbetrachtungen zur Messdatenerhebung 16K-Bufferpool [Zha08]. In dem DATEV-Entwicklungssystem Mem1 ist dazu der Bufferpool BP16K1 definiert. Um die Messreihen der LOB-Daten mit denen der XML-Daten vergleichbar zu machen, ist für die LOB-Tablespaces ebenfalls der 16K-Bufferpool BP16K1 verwendet worden. 5.2.2 Data Sharing Eine der wertvollsten Funktionen des DB2 besteht im Data Sharing. Dieses ist ausschließlich in der Produktlinie des DB2 for z/OS implementiert, besteht aber in ähnlicher Form als pureScaleTechnologie beispielsweise auch im DB2 for LUW. Die Bedeutung des Data Sharings leitet sich von den zahlreichen Vorteilen ab, die durch diese ermöglicht werden. Dazu zählen unter anderem höhere Datenverfügbarkeit, erweiterte Skalierbarkeit und auch erhöhte Datendurchsatzraten. Im Detail wird auf diese und weitere Vorteile in [IBM06a] eingegangen. Die für das Data Sharing benötigte Architektur setzt auf der „Parallel Sysplex“-Technologie [IBM11b] auf und basiert auf dem Ansatz Shared Data. Dabei handelt es sich um eine parallele Datenbankarchitektur. Alternativen dazu wären beispielsweise das „Shared Nothing“- oder auch das „Shared Disk“-Modell. Nähere Informationen zu diesen Ansätzen sind in [IBM06a] zu finden. Fortan soll lediglich die für das Data Sharing relevante Struktur des „Shared Data“Modells beschrieben werden. Der Name Shared Data lässt bereits darauf schließen, dass es sich bei diesem Modell um eine Architektur mit einem gemeinsam genutzten Datenbestand handelt. Wie in Abbildung 11 dargestellt, bilden die verschiedenen Datenquellen bei dem „Shared Data“-Modell einen gemeinsamen Datenpool. Auf diesen lässt sich von allen Knoten ausgehend zugreifen. Bei den Knoten handelt es sich um DB2-Subsysteme, die fortan als Member bezeichnet werden. Die Gesamtheit aller Member, die einen gemeinsamen Datenbestand teilen, bildet eine Data Sharing Group. Ein Member kann nur zu genau einer solchen Gruppe gehören. Innerhalb der Data Sharing Group werden von den einzelnen Membern neben dem gemeinsamen Datenpool auch der DB2-Datenbankkatalog und das DB2 Directory geteilt. [IBM06a] 49 5 Vorbetrachtungen zur Messdatenerhebung Abbildung 11: „Shared Data“-Architektur [IBM06a] Die Herausforderung bei der „Shared Data“-Architektur liegt in der Koordination der einzelnen Member. Hierzu wird eine so genannte Coupling Facility benutzt, die beispielsweise im „Shared Disk“-Ansatz nicht vorgesehen ist. Diese unterstützt bei der Kontrolle der Nebenläufigkeit und der Kohärenz. Dazu verwaltet sie an einer zentralen Stelle sowohl Sperr- als auch Cachestrukturen und ermöglicht auf diese Weise eine effiziente Datenverarbeitung im RechnerCluster. Für eine ausführlichere Abhandlung der Arbeitsweise der Coupling Facility wird auf [IBM06a] verwiesen. Fortan soll der Bezug des Data Sharings zu den in dieser Arbeit durchgeführten Messreihen hergestellt werden. [IBM06a] In der Entwicklungsumgebung der DATEV existiert eine Data Sharing Group, die wiederum zwei Member (Mem1 und Mem2) enthält. Innerhalb dieser Data Sharing Group ist das Data Sharing so konfiguriert, dass bei dem Verbindungsaufbau zu DB2 abhängig von der aktuellen Systemlast ein konkretes Member für die anschließende Verarbeitung ausgewählt wird12. Obwohl die Member in der Entwicklungsumgebung identisch konfiguriert sind, haben sich bei der Ausführung von gleichen Messreihen unterschiedliche Laufzeiten13 zwischen dem Mem1 und dem Mem2 gezeigt. Damit also die Messreihen der weiteren PerformanceMessungen miteinander vergleichbar sind, muss sichergestellt sein, dass sie stets auf demselben Member – quasi lokal – ausgeführt werden. Dazu ist ohne besonderen Hintergrund das Mem1 gewählt worden, dessen Kennzahlen in Abschnitt 3.2.2 ersichtlich sind. Da die einzelnen Member gegenüber externen Zugriffen auf das DB2 transparent sind, kann eine gezielte Memberauswahl auf einfache Weise nicht gewährleistet werden. Abschnitt 5.3 zeigt aber 12 Im Produktivsystem der DATEV erfolgt dagegen die Lastverteilung dynamisch zwischen den zwei dazugehörigen Membern. 13 besonders die Elapsed-Zeit betreffend 50 5 Vorbetrachtungen zur Messdatenerhebung zusammen mit der Verfahrenweise zur Messdatenerhebung eine Möglichkeit auf, wie dennoch eine Betrachtung auf Memberebene möglich ist. 5.2.3 Zugriffsart Bei der Ausführung von SQL-Statements ist in DB2 zwischen statischem SQL und dynamischem SQL zu entscheiden. Abhängig von der gewählten Methode ergibt sich eine unterschiedliche interne Statement-Ausführung, die sich auch auf deren Performance auswirkt. In dem folgenden Abschnitt sollen die Konzepte statisches SQL und dynamisches SQL primär anhand ihrer Besonderheiten beschrieben werden. Für ausführliche Details – beispielsweise zu dem Compile- oder Bind-Prozess – wird auf die Literatur [IBM11c] verwiesen. Die Verwendung von statischem SQL bedeutet, dass der Compile- und Bind-Prozess14 unabhängig und zeitlich vorgelagert zur Statementausführung „einmal“ stattfindet. Dies hat zwar den Nachteil, dass bei einer grundlegenden Änderung der Statistiken der innerhalb des Statements verwendeten Datenbankobjekte ein REBIND [IBM11g] angeraten ist. Auf der anderen Seite bringt es aber Performance-mäßig betrachtet auch den großen Vorteil, dass für die spätere, vielfache Ausführung der SQL-Statements die Kosten für das Kompilieren und Binden (inklusive der Optimierung) entfallen. Dafür müssen die auszuführenden Statements allerdings bereits zum Compile-Zeitpunkt vollständig fixiert sein. Das heißt, dass ein Zusammenbauen von Statements abhängig vom aktuellen Anwendungskontext für statisches SQL nicht möglich ist. Hier bleibt lediglich die Möglichkeit, Host-Variablen zu verwenden. Durch diese lässt sich ein Statement für verschiedene Werte wiederverwenden und muss infolgedessen nur einmal kompiliert und gebunden werden. Ein weiterer großer Vorteil von statischem SQL liegt in dem Aspekt der Rechtevergabe. Für ein statisch gebundenes Statement wird in DB2 ein Package erzeugt. Auf diesem lassen sich ähnlich wie auch auf anderen Objekten in der Datenbank gezielt Berechtigungen definieren. Dadurch ist es bei statischem SQL beispielsweise möglich, einzelne Nutzer zur Ausführung eines Statements zu berechtigen, obwohl diese unter Umständen keinerlei Rechte auf den darin verwendeten Tabellen besitzen. Ohne Packages, beispielsweise im Fall von dynamischem SQL, 14 Im Bind-Prozess erfolgen unter anderem die Zugriffsplanermittlung und die Validierung der Objekte [IBM09b]. 51 5 Vorbetrachtungen zur Messdatenerhebung ist ein ähnliches Vorgehen nur umständlich durch die Verwendung von Stored Procedures oder Funktionsusern [IBM11d] möglich. Bei dynamischem SQL erfolgt der Bind-Prozess – auch PREPARE [IBM11a] genannt – dynamisch zur Laufzeit. Dementsprechend werden stets die aktuellsten Statistiken genutzt. Zusätzlich ergibt sich durch den späten Zeitpunkt des Bindens die Möglichkeit, ein auszuführendes Statement erst während der Laufzeit aus einzelnen Zeichenketten zusammenzubauen. Trotz dieser vielen Vorzüge ist auch dynamisches SQL nicht frei von Nachteilen. Da der BindProzess stets direkt vor der Ausführung eines neuen Statements stattfindet, verlängert sich durch diesen Performance-mäßig betrachtet auch die Gesamtlaufzeit. Dem Effekt wird aber durch den Dynamic Statement Cache entgegengewirkt. Bei der erstmaligen Ausführung eines dynamischen Statements wird es, wie oben erklärt, gebunden und das Ergebnis dieses Prozesses im Dynamic Statement Cache verzeichnet. Erfolgt eine erneute Statementausführung, dann kann der „gecachte“ Zugriffsplan direkt ohne zusätzliches Binden wiederverwendet werden. Hierbei ist jedoch zu beachten, dass die Inhalte des Dynamic Statement Caches unter anderem abhängig von dessen Füllgrad auch wieder aus diesem verdrängt werden können. Verglichen mit den Host-Variablen bei statischem SQL gibt es bei dynamischem SQL Parametermarker, mit deren Hilfe sich ebenfalls die Wiederverwendbarkeit eines (gecachten) Zugriffsplans erhöhen lässt. Aufgrund der beschriebenen Unterschiede zwischen statischem SQL und dynamischen SQL ist auch deren Einfluss auf die Ergebnisse der Messreihen dieser Arbeit geprüft worden. Hierbei zeigten sich aber keine wesentlichen Differenzen. Dies resultiert aus der Tatsache, dass für die durchgeführten Messreihen stets jeweils ein Statement benutzt wird. Durch die Verwendung der Parametermarkertechnik ist dafür nur ein Bind- beziehungsweise PREPARE-Prozess notwendig. Dieser ist kostenmäßig betrachtet verschwindend gering im Vergleich zu den tatsächlichen Statementausführungen, weshalb auf eine separate Betrachtung der Zugriffsart in den weiteren Messreihen verzichtet wird Abbildung 12 zeigt zur besseren Nachvollziehbarkeit ein Beispiel aus Abschnitt 6.1.4. Hierbei werden aus einer Quelltabelle 100.000 1K große nicht-native XML-Dokumente ausgelesen (FETCH), die anschließend in einem zuvor PREPAREten INSERT-Statement (EXECUTE) konvertiert, geparst und in eine Zieltabelle eingefügt werden. Das Auslesen der Daten aus der Quelltabelle erfolgt über einen deklarierten Cursor, der eingangs geöffnet (OPEN) und am Ende der Verarbeitung wieder geschlossen (CLOSE) wird. Wichtig in diesem Zusammenhang sind die in Abbildung 12 aufgeführten Kosten der einzelnen Prozesse, anhand deren sich 52 5 Vorbetrachtungen zur Messdatenerhebung der Einfluss des einmalig (siehe SQL_COUNT) ausgeführten PREPARE-Statements ableiten lässt. Dieser ist wie bereits allgemein oben erwähnt verglichen mit dem wesentlichen Prozedurablauf äußerst geringfügig und daher vernachlässigbar. ELAPSED_TIME CPU_TIME (in Sekunden) (in Sekunden) 100.000 42,388315 10,700842 FETCH 100.000 62,131371 4,629180 PREPARE 1 0,001322 0,001016 OPEN 1 0,000116 0,000054 CLOSE 1 0,000002 0,000002 SQL_CALL SQL_COUNT EXECUTE Abbildung 12: Beispiel – Anteil des PREPARE-Prozesses 5.2.4 Transaktionslänge Die Ausführung von SQL-Statements wird in DB2, wie in fast allen Datenbankmanagementsystemen, über Transaktionen gesteuert. Dabei handelt es sich um Folgen von zusammengehörigen Operationen, die im Kontext der relationalen Datenbanken den SQL-Anweisungen entsprechen. Für die Ausführung von Transaktionen gelten besondere Regeln. Zu diesen zählen die Prinzipien Atomarität, Konsistenz, Isolation und Dauerhaftigkeit, die aufgrund ihrer englischsprachigen Bezeichnung auch als ACID-Regeln bezeichnet werden. Für nähere Informationen hierzu wird auf [HR01] verwiesen. Eine Transaktion beginnt in DB2 implizit und endet mit einem expliziten COMMIT-Befehl. Eine Besonderheit bildet hierbei der Autocommit-Modus. Ist dieser aktiviert, wird automatisch nach jedem ausgeführten SQL-Statement ein COMMIT durchgeführt. Der Anwender hat in diesem Fall keinen Einfluss auf die Länge einer Transaktion. Bei deaktiviertem AutocommitModus kann er durch die manuelle Ausführung des COMMIT-Befehls die in einer Transaktion zu bündelnden SQL-Anweisungen selbst bestimmen. Sollte eine Transaktion während ihres Ablaufs abgebrochen werden, ist dies per ROLLBACK-Befehl möglich. Aufgrund der erwähnten ACID-Eigenschaften werden sämtliche von einer Transaktion betroffenen Daten erst zu deren Ende, also bei erfolgreich durchgeführtem COMMIT-Befehl, in der Datenbank festgeschrieben. Zwischenzeitlich befinden sich diese Daten in der Regel zu 53 5 Vorbetrachtungen zur Messdatenerhebung großen Teilen im Bufferpool des DB2 (siehe Abschnitt 5.2.1). In diesem Kontext gilt es verschiedene Strategien zu unterscheiden. Steal oder No Steal [Stö01] Diese Strategiealternative regelt den Umgang mit im Bufferpool befindlichen veränderten Datenseiten während einer Transaktion. Diese können sich im Fall der Steal-Strategie aus dem Bufferpool in den Sekundärspeicher „wegstehlen“. No Steal bedeutet dementsprechend, dass geänderte Daten frühestens erst dann auf den Sekundärspeicher weggeschrieben werden dürfen, wenn eine Transaktion per COMMIT-Befehl abgeschlossen wird. Force oder No Force [Stö01] Mithilfe dieser Strategiealternative lässt sich der Umgang mit im Bufferpool befindlichen veränderten Datenseiten am Ende einer Transaktion regeln. Sofern Force definiert ist, müssen bei einem COMMIT alle veränderten Daten auf den Sekundärspeicher weggeschrieben werden. Im Fall von No Force kann diese Aktion auch zu einem späteren Zeitpunkt – quasi asynchron – durchgeführt werden. Aus Performance-Perspektive betrachtet bieten die jeweiligen Strategien Steal und No Force den größten Sparvorteil bezogen auf die Laufzeit eines SQL-Statements. Dies resultiert aus dem dabei vorgesehenen asynchronen Wegschreiben von Daten aus dem Bufferpool während und nach der Transaktion. Im Grunde sind also Schreiboperationen hier in ihren Durchführungszeitpunkten von Transaktionen „entkoppelt“ und können dadurch auf weniger ausgelastete Zeitslots verlagert werden. Bei den vorangehenden Überlegungen ist jedoch der Abbruch per ROLLBACK-Befehl außer Acht gelassen. Schließlich wäre beispielsweise das Zurücknehmen von bereits auf den Sekundärspeicher geschriebenen Änderungen aufwändiger, als das Zurücknehmen von geänderten Daten, die sich noch im Bufferpool befinden. Die zuletzt betrachtete Strategiekombination (Steal und No Force) nutzt zu großen Teilen auch DB2. Dahingehend verwendet es verschiedene pro Bufferpool definierbare Schwellwerte15, mit denen das Wegschreiben veränderter Daten aus dem Bufferpool in den Sekundärspeicher gesteuert wird. Zusätzlich gibt es hier noch Checkpoints, die ebenfalls dafür sorgen, dass alle 15 unter anderem VPSEQT, DWQT und VDWQT [IBM09a] 54 5 Vorbetrachtungen zur Messdatenerhebung geänderten Daten regelmäßig aus dem Bufferpool in den Sekundärspeicher weggeschrieben werden. Auf deren detaillierte Funktionsweise wird in dieser Arbeit nicht näher eingegangen und auf [IBM11d] verwiesen. Aus den Ausführungen folgt allerdings, dass der Zeitpunkt des COMMIT-Befehls in DB2 keine direkten Auswirkungen auf das Wegschreiben von Daten aus dem Bufferpool in den Sekundärspeicher hat. Die vorangehenden Betrachtungen machen deutlich, dass die Art und Weise der Transaktionsstruktur ein zu beachtender Einflussfaktor für die weiteren Performance-Messungen ist. Dies gilt speziell für die Messreihen aus Kapitel 6 und Kapitel 7, da diese jeweils Datenänderungen umfassen. Im Rahmen der vorliegenden Arbeit wurde anhand ausgewählter Messungen der Einfluss der Transaktionslänge auf die weiteren Performance-Betrachtungen ermittelt. Auf eine ausführliche Abhandlung dieser Untersuchungen wird allerdings aus Umfangsgründen verzichtet. Stattdessen sollen die dabei gewonnenen Erkenntnisse anhand der folgenden drei Szenarien zusammengefasst beschrieben werden. Einmalige COMMIT-Ausführung am Ende einer einzelnen Messung Blockweise COMMIT-Ausführung nach der Verarbeitung einer Datenmenge von 1M Autocommit-Modus Für die in dieser Arbeit durchgeführten datenverändernden Messreihen zeigte sich stets ein gemeinsames Muster. Die Ergebnisse unterschieden sich zwischen den mit einmaligem COMMIT und den mit blockweisem COMMIT durchgeführten Messreihen kaum. Die Laufzeiten der Messungen mit aktiviertem Autocommit-Modus waren stets die langsamsten, wobei hier eine größere Differenz zu den anderen betrachteten Szenarien festzustellen war. Diese Differenz resultiert wahrscheinlich aus dem Zusatzaufwand (Overhead), den eine einzelne Transaktion verursacht und der nicht zur direkten Abarbeitung des Statements beiträgt. Dazu zählt zum Beispiel das (synchrone) Schreiben von COMMIT-Log-Records. Auf diesen und weitere zum Overhead beitragende Prozesse soll nicht näher eingegangen werden. Wichtiger ist in dem Zusammenhang, dass der besagte Overhead im Autocommit-Fall aufgrund der großen Transaktionsanzahl besonders groß ist. Dementsprechend wirkt er sich auch relativ stark auf die Laufzeit aus. Daraus leitet sich für den Fall der blockweisen COMMIT-Ausführung ein ebenfalls vorhandener Overhead ab. Bedingt durch die wesentlich kleinere Transaktionsanzahl fällt dieser aber deutlich geringer aus und ist aufgrund der in Abschnitt 5.4 beschriebenen Schwankungen nicht messbar. 55 5 Vorbetrachtungen zur Messdatenerhebung Die performanteste Variante für die Messreihen der vorliegenden Arbeit stellt folglich die einmalige COMMIT-Ausführung am Ende jeder Messung dar. Deshalb ist diese Methode auch generell für alle weiteren Messreihen verwendet worden. Hier muss aber erwähnt werden, dass lange Transaktionen, allgemein gesprochen, auch Nachteile unter anderem hinsichtlich der Sperrverwaltung oder der Log-Bereiche besitzen. Derartige Negativeffekte treten jedoch aufgrund der geschilderten Konzeption des Testdatenbestands hier nicht auf. Verfahrensweise zur Messdatenerhebung 5.3 Anlehnend an die im vorangehenden Abschnitt 5.2 beschriebenen Einflussfaktoren ergibt sich eine fixe Verfahrensweise, die bei der weiteren Messdatenerhebung verwendet wurde. Diese schlüsselt sich in die folgenden Einzelschritte auf, die anschließend näher betrachtet werden. Vorbereitung Testdatenbestand (und Zielstrukturen) erzeugen Messprozeduren (und Trigger) anlegen Durchführung Member Mem1 „auswählen“ Bufferpool leeren Messprozeduren aufrufen Auswertung Vorbereitung Die Vorbereitung der Messreihen umfasst die Erzeugung des Testdatenbestands, der Messprozeduren und mit Ausnahme der Analyse der Query Performance auch das Anlegen der Zielstrukturen. Ersterer ist bereits in Abschnitt 5.1 ausführlich betrachtet worden. Hierzu ist eine ergänzende Anmerkung zu treffen. Sämtliche zu einer Merkmalsausprägung gehörenden Testdaten sind stets in einer eigenen Tabelle innerhalb eines eigenen Tablespaces bereitgestellt. Die jeweiligen Strukturen sind unfragmentiert. Außerdem liegen in DB2 aktuelle Statistiken (siehe Abschnitt 8.1.2) zu den Objekten vor. 56 5 Vorbetrachtungen zur Messdatenerhebung Weiterhin müssen, abgesehen von der Untersuchung der Query Performance in Kapitel 8, die Zielstrukturen angelegt werden. Dies geschieht auf ähnliche Weise wie bei den Testdaten. Pro Merkmalsausprägung wird eine einzelne Tabelle innerhalb eines eigenen Tablespaces erzeugt. Die Objekte sind, abgesehen von eventuellen messreihenbedingten Änderungen16, vollständig strukturgleich zu denen des Testdatenbestands. Der Einfachheit halber befinden sich alle erzeugten Strukturen in einer gemeinsamen Datenbank. Für die Analyse der Query Performance genügt das Auslesen (FETCH) der Daten in eine Host-Variable. Daher werden hier keine weiteren (Ziel-)Strukturen benötigt. Ebenfalls zur Vorbereitung zählt die bereits erwähnte Erstellung der Messprozeduren. Dabei handelt es sich um datenbankseitige Stored Procedures, die pro Merkmalsausprägung für jede Messreihe erstellt werden. Mit ihnen lassen sich einzelne Messreihen unabhängig von Kommunikationsaufwendungen direkt in DB2 serverseitig durchführen. Das bietet den Vorteil, dass die Ergebnisse von weiteren Einflüssen durch eine externe Umgebung, wie beispielsweise einem Java-Programm, isoliert betrachtet werden können. Die folgenden drei Abbildungen zeigen nacheinander jeweils eine Prozedur beziehungsweise einen Trigger aus den Themenschwerpunkten Migration und Parsen, XML-Schema-Management und Query Performance. Vorab ist jeweils eine kurze Beschreibung des Objekts beigefügt. Abbildung 13 zeigt ein Beispiel für eine Prozedur aus Abschnitt 6.1.4. Im Detail werden hier in Form einer FOR-Schleife alle Daten aus der zu der Merkmalsausprägung 100K gehörenden Tabelle „TCLOB_100K“ ausgelesen. Bei den Daten handelt es sich speziell um nicht-native, im EBCDIC-Zeichensatz kodierte und als CLOB gespeicherte XML-Dokumente. Für jedes auf diese Weise zugegriffene Dokument wird im Body der Schleife dann je ein INSERT mit integriertem XML-Parse-Prozess in die Tabelle „TXML_XMLPARSE_100K“ ausgeführt. Für diesen Parseprozess ist stets die standardmäßige Option des STRIP WHITESPACE verwendet worden, die das Entfernen von unnötigen Füllzeichen während des Parsens bewirkt. Damit sind beispielsweise Leerzeichen und Umbrüche bezeichnet, die zwar aus Formatierungsgründen zur besseren Lesbarkeit im Dokument enthalten sind, aber keine inhaltliche Bedeutung haben. Die Alternative zu dieser Option wäre PRESERVE WHITESPACE, bei der alle Füllzeichen unverändert übernommen werden. Am Ende der Prozedur findet abschließend noch ein COMMIT der Transaktion statt. 16 beispielsweise die Verwendung des XML-Datentyps anstatt des CLOB-Datentyps bei der Messung der XML-Parse-Performance in Abschnitt 6.1.4 57 5 Vorbetrachtungen zur Messdatenerhebung CREATE PROCEDURE T24431A.SP_XMLPARSE_100K() LANGUAGE SQL BEGIN FOR V AS C CURSOR FOR SELECT NNXML_DOC AS CUR_DOC FROM T24431A.TCLOB_100K DO INSERT INTO T24431A.TXML_XMLPARSE_100K(XML_DOC) VALUES(XMLPARSE(DOCUMENT CUR_DOC STRIP WHITESPACE)); END FOR; COMMIT; END Abbildung 13: Beispielprozedur – Migration und Parsen Die folgende Abbildung 14 stellt einen Trigger aus Abschnitt 7.3 dar, mit dem sich ein Automatismus zur Schemavalidierung erstellen lässt. In der Produktlinie z/OS von DB2 Version 9 wird der XML-Datentyp in Triggern nicht unterstützt [Zha09]. So ist es beispielsweise nicht möglich, im Trigger-Body (in einer Transition Variable [IBM11a]) den XML-Datentyp zu verwenden. Daher lässt sich ein Automatismus zur Schemavalidierung hier nur umständlich realisieren. DB2 for LUW beispielsweise besitzt die genannte Einschränkung für den speziellen Fall der Schemavalidierung nicht und kann diese auf einfache Weise als eine Art Vorverarbeitung in einem BEFORE-Trigger automatisieren [NK09]. Für DB2 for z/OS besteht lediglich die Möglichkeit eines „nachträglichen“, per AFTER-Trigger initiierten Validierungsautomatismus. Um die Validierungslogik nicht für jeden Trigger neu implementieren zu müssen, wurde sie in eine parametrisierte Stored Procedure „SP_SCHEMA_VALIDATION_AUTO“ ausgelagert. Diese wird mit den zutreffenden Parametern, wie in Abbildung 14 zu sehen, vom Trigger aufgerufen. Nähere Details zum Aufbau und zur Funktionsweise der Prozedur finden sich in Abschnitt 7.3. CREATE TRIGGER T24431A.TR_XML_1K AFTER INSERT ON T24431A.TXML_1K REFERENCING NEW AS NEW_ROW FOR EACH ROW MODE DB2SQL BEGIN ATOMIC CALL T24431A. SP_SCHEMA_VALIDATION_AUTO('T24431A', 'TXML_1K', 'XML_DOC', NEW_ROW.DB2_GENERATED_DOCID_FOR_XML, ‚MY_XML_SCHEMA'); END Abbildung 14: Beispiel-Trigger – XML-Schema-Management 58 5 Vorbetrachtungen zur Messdatenerhebung Abbildung 15 zeigt eine Prozedur aus Abschnitt 8.2.2. Vereinfacht formuliert handelt es sich dabei um die Deklaration eines Cursors. Dieser wird anschließend geöffnet, einmalig in eine zuvor deklarierte (temporäre) Variable ausgelesen und daraufhin wieder geschlossen. Die einmalige Ausführung des FETCH-Statements genügt zum vollständigen Zugriff auf die Ergebnismenge des SELECT-Statements, da in diesem die Funktion COUNT(*) verwendet wird. Sie liefert, sofern keine Gruppierung stattfindet, stets genau eine Ergebniszeile. Weiterhin umfasst das an den Cursor gebundene SELECT-Statement ein XMLEXISTS-Prädikat. Dieses schließt einen XPath-Pfadausdruck ein, für den in einem der Testszenarien ein User-DefinedXML-Index (siehe Abschnitt 8.1.1) auf der Tabelle „TXML_1K“ besteht. Dieser Index kann auch für das angeführte Statement abhängig von den vorliegenden Statistiken verwendet werden. CREATE PROCEDURE T24431A.SP_XML_INDEX_1K() LANGUAGE SQL BEGIN DECLARE TMP INTEGER; DECLARE C1 CURSOR FOR SELECT COUNT(*) FROM T24431A.TXML_1K WHERE XMLEXISTS('$x/seite/textblock[@id="muster_textblock1"]' PASSING XML_DOC AS "x"); OPEN C1; FETCH C1 INTO TMP; CLOSE C1; END Abbildung 15: Beispielprozedur – Query Performance Durchführung Zur Durchführung einer Messung sind abhängig von den in Abschnitt 5.2 beschriebenen Einflussfaktoren verschiedene Schritte nötig. Zuerst ist es wichtig, eine Verbindung zu dem gewählten Subsystem Mem1 herzustellen. Das IBM Data Studio erlaubt es nicht, dies auf einfache Art und Weise zu realisieren. Weil es aber eine einmal aufgebaute Verbindung für alle weiteren im Tool initiierten Prozesse wiederverwendet, genügt es, beim Verbinden zu DB2 durch Probieren das richtige Subsystem zu treffen. Ob dies der Fall ist, lässt sich über das in Abschnitt 3.4.3 vorgestellte Tool CA Detector prüfen. Eine einfachere Möglichkeit existiert hierfür leider nicht. 59 5 Vorbetrachtungen zur Messdatenerhebung Nachdem die Verbindung zum speziellen DB2-Subsystem aufgebaut ist, besteht der nächste Schritt gemäß den Ausführungen in Abschnitt 5.2.1 im Leeren des Bufferpools. Dies lässt sich unter anderem durch ein STOP- und ein anschließendes START-Kommando der Testdatenbank realisieren. Die Kommandos können beispielsweise über den DB2 Command Line Processor (CLP) ausgeführt werden. Über einen Umweg ist dies aber auch im Tool IBM Data Studio möglich. Dort lässt sich mithilfe des SQL-Editors ein Kommando durch den parametrisierten Aufruf (CALL) der Prozedur SYSPROC.ADMIN_COMMAND_DB2 ausführen. Detaillierte Informationen dazu sind in [IBM11d] zu finden. Sobald die Datenbank wieder gestartet ist, kann auf analoge Weise per CALL-Statement auch der Aufruf einer einzelnen Testprozedur erfolgen. Wichtig ist dabei, dass bevor eine weitere Testprozedur ausgeführt wird, zur Vergleichbarkeit stets der Bufferpool erneut geleert werden muss. Sofern exakt die gleiche Messprozedur erneut ausgeführt werden soll, sind zusätzlich auch die Zielstrukturen neu anzulegen, um wieder eine einheitlich bereinigte Ausgangssituation herzustellen. Auswertung Im Anschluss an die Durchführung der Messungen lassen sich über den CA Detector (siehe Abschnitt 3.4.3) die detaillierten Laufzeiten der einzelnen in den Messprozeduren enthaltenen Statements ermitteln. Dazu kann über das gewählte Subsystem Mem1 und anschließend den Nutzer T24431A Einsicht in die Laufzeiten der von ihm durchgeführten Prozeduren genommen werden. Abbildung 16 zeigt am Beispiel einer Prozedur aus Abschnitt 8.2.2, wie der CA Detector die davon eingeschlossenen Statements aufgliedert. Dabei zeigen INDB2_TIME und INDB2_CPU jeweils die zur gesamten Ausführung benötigte Elapsed-Zeit (Class 2) und CPU-Zeit (siehe Abschnitt 3.3). Diese Zeiten sind auch für die weiteren Betrachtungen der vorliegenden Arbeit herangezogen worden. Während OPEN und CLOSE die Kosten für das Öffnen und Schließen des Cursors ausweisen, gibt FETCH über die Laufzeit des SELECTStatements Aufschluss. 60 5 Vorbetrachtungen zur Messdatenerhebung SQL_CALL -------FETCH OPEN CLOSE INDB2_TIME -----------00:00.201656 00:00.000063 00:00.000008 INDB2_CPU -----------00:00.004255 00:00.000062 00:00.000008 Abbildung 16: Beispielausgabe des CA Detectors Eine Alternative zum CA Detector bei der Erfassung der Messdaten wäre der in Abschnitt 5.2.3 erwähnte Dynamic Statement Cache. Dieser listet zwar ebenfalls die Laufzeiten der einzelnen Statements ausführlich auf. Dabei ist er aber nur für dynamische Statements verwendbar und erreicht zudem nicht den Detailgrad des CA Detectors. Aus diesem Grund wurde ausschließlich letzterer für die Auswertung der Messreihen verwendet. 5.4 Schwankungen und Diskrepanzen In den vorangehenden Abschnitten wurden bereits grundlegende Einflussfaktoren beschrieben und Wege aufgezeigt, um deren Auswirkungen zu mindern beziehungsweise ganz zu vermeiden. Dennoch wirken auch weitere Randfaktoren auf die Messreihen ein. Diese lassen sich in die zwei Kategorien Schwankungen und Diskrepanzen (im mathematischen Sinn) einteilen. Dabei sind Schwankungen als sporadische Abweichungen und Diskrepanzen hingegen als konstante Abweichungen zu verstehen. Verantwortlich für die auftretenden Schwankungen der Elapsed- als auch der CPU-Zeit (geringeres Ausmaß) ist im Wesentlichen die Charakteristik der Entwicklungsumgebung. Sämtliche DB2-Anwender und DB2-Administratoren in der DATEV nutzen diese Umgebung zur Durchführung diverser Testszenarien. Darin eingeschlossen sind sowohl am Tage ablaufende Applikationstests also auch nächtliche Batchabläufe. Auf dem in der Entwicklungsumgebung befindlichen Entwicklungssystem Mem1 befindet sich demzufolge stets eine gewisse Workload, die im Verlauf eines Tages stark schwanken kann. Beobachtungen haben ergeben, dass diese Workload durchschnittlich am frühen Morgen und gegen den späten Nachmittag abflacht und um die Mittagszeit herum ihren Peak erreicht. Da die einzelnen Testszenarien dabei jedoch kontinuierlich wechseln, ist es nicht möglich, eine konkrete Aussage zu deren Einfluss auf die betrachteten Messreihen zu treffen. 61 5 Vorbetrachtungen zur Messdatenerhebung Der durch die erwähnten Testszenarien resultierende Einfluss lässt sich an verschiedenen Aspekten aufzeigen. Im Wesentlichen resultiert er aus der gemeinsamen Verwendung des Datenbankkatalogs, der Bufferpools (siehe Abschnitt 5.2.1) und aus anderen Mechanismen der Nebenläufigkeit, wie beispielsweise dem Locking. Die gemeinsame Verwendung des gleichen Datenbankkatalogs scheint auf den ersten Blick vielleicht etwas unschlüssig. Schließlich befinden sich der gesamte Testdatenbestand und auch die dazugehörigen Zielstrukturen innerhalb einer abgeschlossenen Datenbank. Da sich aber, anders als beispielsweise in der Produktlinie DB2 for LUW17, in DB2 for z/OS der Datenbankkatalog auf Subsystemebene befindet, nutzen alle Datenbanken eines Subsystems denselben Katalog (siehe Abschnitt 5.2.2). Im Gegensatz zum zuletzt betrachteten Aspekt wäre das Beseitigen des aus der gemeinsamen Bufferpool-Nutzung resultierenden Einflusses rein technisch betrachtet möglich gewesen. Dies hätte sich durch die Verwendung von zuvor neu zu erstellenden, dedizierten Bufferpools realisieren lassen. Da es sich aber bei dem Mem1, wie bereits erwähnt, um ein Entwicklungssystem für alle DATEV-DB2-Entwickler handelt, werden das System betreffende Änderungen als äußerst kritisch eingestuft. Im konkret betrachteten Fall hätte die Erstellung neuer Bufferpools eine veränderte Verteilung der in DB2 verfügbaren Ressourcen zur Folge. Somit wären auch bereits vorhandene Bufferpools indirekt betroffen, wodurch sich das gesamte Systemverhalten, wenn auch nur geringfügig, verändern würde. Auf die Beseitigung des hier betrachteten Einflusses wurde daher verzichtet. Die Gesamtheit an weiteren vorhandenen Einflüssen auf die Messreihen hat diverse Schwankungen bei den Ergebnissen zur Folge. Diese erstrecken sich bei der Elapsed-Zeit auf eine Spanne von teilweise bis zu ungefähr +-25 Prozent und bei der CPU-Zeit auf immerhin fast +-10 Prozent. Abbildung 17 stellt ein Beispieldiagramm mit prozentualen Differenzen zu den tatsächlich verwendeten Messergebnissen18 dar. Dieses zeigt exemplarisch die beobachteten maximalen Abweichungen bei der mehrmaligen Ausführung einer Messreihe zu unterschiedlichen Zeitpunkten. 17 in DB2 for LUW besitzt jede Datenbank ihren eigenen Katalog 18 das tatsächliche Ergebnis entspricht dem Median aus drei Einzelmessreihen (siehe nächste Seite) 62 5 Vorbetrachtungen zur Messdatenerhebung 30 Differenz (in Prozent) 20 10 0 ELAPSED -10 CPU -20 -30 200B x 1K x 500.000 100.000 10K x 10.000 100K x 1.000 1M x 100 10M x 10 Größe und Anzahl Abbildung 17: Beispieldiagramm – Prozentuale Schwankungen Während die erwähnten +-10 Prozent der CPU-Zeit noch tolerierbar sind, entsprechen die +-25 Prozent einer zu großen Abweichung, um fundierte Erkenntnisse aus den Messresultaten ableiten zu können. Für die Darstellung der Messergebnisse dieser Arbeit gilt daher: Die weiteren Schlussfolgerungen und Ausführungen beziehen sich ausschließlich auf die gemessenen CPU-Zeiten, sämtliche Betrachtungen zu den Elapsed-Zeiten sind im Anhang dieser Arbeit zu finden. Unabhängig von CPU- und Elapsed-Zeit liegt den Messauswertungen der statistische Lageparameter Median zugrunde. Dieser hat verglichen mit der einfachen Durchschnittsbildung den Vorteil, dass er robuster gegenüber Ausreißern ist. Auf die Auswertung der Messreihen bezogen bedeutet es, dass extreme Schwankungen, wie sie zuvor beispielhaft in Abbildung 17 gezeigt wurden, verhindert werden können. In diesem Zusammenhang erfolgte die Durchführung der einzelnen Messreihen stets dreimalig. Das tatsächliche Ergebnis ergibt sich daraufhin durch die Bildung des Medians dieser drei Werte. Neben den betrachteten Schwankungen lässt sich aber auch gemäß der obigen Kategorisierung eine Diskrepanz anführen. Hierbei ist beispielsweise die Größe der Testdaten zum Vergleichskriterium Größe und Anzahl und davon abgeleitet zum Kriterium der Zusammensetzung zu nennen. Wie bereits im Abschnitt 5.1.1 erwähnt, handelt es sich bei diesen Daten um eine gezielte Auswahl von bereits vorhandenen Dokumenten aus der Entwicklungsumgebung. Da die Dokumente nicht exakt den Größen der Merkmalsausprägungen entsprechen, sind gewisse Abweichungen vorhanden, die sich auch konstant geringfügig auf die Messergebnisse auswirken. 63 6 Migration und Parsen 6 Migration und Parsen Die mit DB2 Version 9 eingeführte pureXML-Technologie verspricht durch die native Speicherung von XML-Dokumenten viele Vorteile. Die wesentlichen Vorzüge liegen dabei in dem performanten Zugriff auf die Daten und den zusätzlichen XML-spezifischen Funktionalitäten. Dem gegenüber stehen jedoch auch neue Problematiken, die besonders unter dem Aspekt der Performance von Bedeutung sind. Einen zentralen Stellenwert nimmt dabei der Prozess des XML-Parsens ein. Damit die Vorzüge der nativen XML-Speicherung genutzt werden können, müssen nicht-native XML-Dokumente stets durch einen solchen Prozess in die native Ablageform überführt werden. Dies gilt insbesondere für neu in die Datenbank einzufügende Dokumente. DB2 besitzt hierzu die XMLPARSE-Funktion, welche das Parsen in den nativen XML-Datentyp ermöglicht. Die Untersuchungen aus der Studienarbeit [Koc11] haben gezeigt, dass die Migration von bestehenden nicht-nativen XML-Dokumenten in der Datenbank in den nativen XML-Datentyp komplexerer Natur ist. Das heißt, neben dem Parsen sind noch weitere Prozesse zur Überführung nötig, die entweder implizit stattfinden oder explizit ausgeführt werden müssen. Zusammen mit der Variante der Neueinfügung stellt Abbildung 18 eine – mit Verweisen auf die folgenden Abschnitte versehene – Übersicht über die Abläufe der verschiedenen Szenarien dar. Eine kurze Beschreibung der Prozesse folgt in Abschnitt 6.1 und Abschnitt 6.2, wobei der Fokus dabei stets auf den Performance-Aspekt gerichtet ist. Nähere Details zur Notwendigkeit und VARCHAR/ CLOB (6.1.2) Konkatenation (6.1.4) XML-Parsen Input UnicodeKonvertierung (6.1.3) INSERT Vorverarbeitung XML Abbildung 18: Überblick der betrachteten INSERT-Szenarien 64 Neueinfügung (6.2) Migration (6.1) Umsetzung einzelner Abläufe sind in [Koc11] zu finden. 6 Migration und Parsen An dieser Stelle sei darauf hingewiesen, dass die Vorverabeitungsprozesse19 in den folgenden Ausführungen außer Acht gelassen werden. Dies begründet sich durch ihre Position in der abgebildeten Prozesskette einer Migration. Da sich die Vorverabeitungsprozesse nicht auf dem kritischen Pfad befinden, können sie unabhängig von dem restlichen Migrationsvorhaben abgearbeitet werden. Dabei ist zusätzlich anzumerken, dass eine Vorverarbeitung auch nur in speziellen Fällen notwendig wird, weshalb ihr Einfluss auf die Migration insgesamt vernachlässigbar ist. Um XML-Daten in DB2 einzufügen, bietet das Datenbankmanagementsystem, ähnlich wie für LOB-Daten, sowohl die Möglichkeiten des direkten INSERTs [IBM11a] als auch den Utilitybasierten LOAD-Mechanismus [IBM08a]. Letzterer wird besonders in Migrationsszenarien verwendet, bei denen der Schwerpunkt auf zeitkritischer Massendatenverarbeitung liegt. Gegenüber der transaktionalen Einzelverarbeitung beim INSERT erreicht das LOAD-Utility seine Performance-Gewinne dadurch, dass es die zum Einfügen notwendigen Prozesse innerhalb dafür optimierter LOAD-Phasen20 gebündelt ausführt. Da zum aktuellen Zeitpunkt aber keine Anforderungen geplant sind, die das LOAD-Utility notwendig machen, konzentrieren sich die weiteren Untersuchungen dieser Arbeit auf die Verwendung von INSERT-Statements. Von großer Relevanz für die Performance ist das Thema „Indexe“. Dies gilt nicht nur für die im Kapitel 8 zu betrachtende Query Performance, sondern auch für die INSERT-Performance. Mit dem nativen XML-Datentyp wurden in DB2 gleichsam neue XML-spezifische Indexierungsmöglichkeiten implementiert. Eine Abhandlung zu deren Struktur und weiteren Besonderheiten ist in Abschnitt 8.1.1 zu finden. Für XML-Indexe ergeben sich aus Perspektive der INSERTPerformance zwei zentrale Fragestellungen. Zum einen ist es wichtig, Kennzahlen zu dem parallel beim INSERT stattfindenden Pflegeaufwand der Indexe zu ermitteln. Auf der anderen Seite muss auch betrachtet werden, ob eine Indexerstellung im Falle einer Migration erst nachträglich erfolgen sollte, um den parallelen Pflegeaufwand zu unterbinden. Eine ausführliche Betrachtung dieser Aspekte liefert Abschnitt 6.3. 19 beispielsweise die Bereinigung der nicht-nativen XML-Dokumente von ungültigen Zeichen [Koc11] 20 UTILINIT, RELAOD, SORT, BUILD, SORTBLD, INDEXVAL, ENFORCE, DISCARD, REPORT, UTILTERM [IBM08a] 65 6 Migration und Parsen Der Parseprozess ist nicht nur beim INSERT relevant, sondern auch ein wichtiger Teil des UPDATEs. Daher und aufgrund der Implementierung dieser Funktionalität für XML-Daten wird abschließend in diesem Kapitel in Abschnitt 6.4 noch ein kurzer Exkurs zum Thema UPDATE von XML-Dokumenten angefügt. Hierbei soll neben der Ist-Situation in DB2 Version 9 vor allem auch ein Ausblick auf die Möglichkeiten in der Nachfolgeversion 10 von DB2 gegeben werden. 6.1 Analyse der INSERT-Performance im Migrationsfall Analog zu den Ausführungen in Abschnitt 3.1.1 charakterisiert sich die Migration von nichtnativen XML-Dokumenten in den nativen XML-Datentyp mit fest vorgegebener UnicodeCodepage (UTF-8) aktuell in der DATEV durch folgende Besonderheiten. Den Ausgangspunkt bilden Quelldokumente, die als VARCHAR- oder CLOB-Dokument jeweils in der EBCDICCodepage und zum Teil über mehrere Tupel hinweg gesplittet datenbankseitig gespeichert sind. Diese Art der Verteilung ist für die CLOB-Ablage eher selten, bei der nicht-nativen VARCHAR-Speicherung hingegen sehr häufig anzutreffen. Grund dafür sind systemseitige Beschränkungen, auf die hier nur kurz eingegangen und für nähere Details auf [Koc11] verwiesen werden soll. Durch die angeführten Vorbemerkungen erklärt sich die Aufteilung der Migrationsprozesse in die Konkatenation der gesplittet gespeicherten Teilstücke, die Konvertierung der Dokumente von der EBCDIC- in die Unicode-Codepage und den anschließenden Parse-Prozess (siehe Abbildung 18). Das Ziel der Untersuchungen dieses Abschnitts ist die Erfassung der jeweiligen Kosten der einzelnen Prozesse in Anlehnung an die Vorbetrachtungen und Vergleichskriterien aus Kapitel 5. Weiterhin gilt es, die Anteile der Vorgänge an dem gesamten Migrationsvorgang zu ermitteln, sodass im Anschluss daran eine Einschätzung über besonders zeitkritische Prozesse abgegeben werden kann. Den anschließenden Messungen liegt folgende Idee zu Grunde. Durch sukzessive Erfassung der INSERT-Kosten von dem einfachen Kopieren von Dokumenten hin zur kompletten Migrationsfolge lassen sich schrittweise die Anteile der einzelnen Prozesse durch Differenzbildung ermitteln. Dabei sind die auf diese Weise berechneten Anteile jedoch nur als Abschätzungen zu verstehen, da sie zusätzliche Nebenbedingungen nicht einbeziehen. Eine Ausnahme bildet dabei 66 6 Migration und Parsen die Messreihe zum Konkatenationsprozess. Da dieser nicht unmittelbar innerhalb des INSERTStatements stattfindet, werden seine Kosten auf direktem Weg bestimmt. Abbildung 19 fasst zur Übersichtlichkeit die notwendigen Messreihen vorab tabellarisch zusammen. Dabei betitelt die Spalte „Messreihe“ die jeweils durchgeführte Messreihe. Unter „Differenz“ ist die Berechnungsvorschrift aufgeführt, die angewandt wird, um einen gewünschten Kostenanteil zu ermitteln. Dieser ist in der Spalte „Ergebnis“ beschrieben und wird in den angegebenen folgenden Abschnitten ausführlich diskutiert. Sofern sich kein Eintrag in der Spalte „Differenz“ befindet, kann aus der Messreihe direkt auf das abgezielte Messresultat in der Spalte „Ergebnis“ geschlossen werden. Messreihe Differenz Ergebnis (1) Einfaches Kopieren Kosten für das einfache Kopieren (6.1.1) (2) Konkatenation (optional) Kosten für die Konkatenation (6.1.2) (3) Unicode-Konvertierung (3) – (1) Kostenanteil der Konvertierung (6.1.3) (4) XML-Parsen (4) – (3) Kostenanteil des XML-Parsens (6.1.4) Abbildung 19: Messreihen zur INSERT-Performance im Migrationsfall 6.1.1 „Einfaches Kopieren“ Die erste Messreihe erfasst die Kosten für den INSERT von nicht-nativen XML-Dokumenten in eine Tabelle mit der Codepage EBCDIC. Dabei werden die Dokumente selbst zuvor aus einer strukturell identischen Tabelle gelesen, wodurch sich wesentliche Zwischenschritte ausschließen lassen. Der auf diese Weise realisierte Prozess lässt sich daher als „einfaches Kopieren“ der Dokumente bezeichnen. Er dient der Ermittlung einer Kosten-Baseline, die später herangezogen wird, um durch gezielte Differenzbildung die Kostenanteile der Folgeprozesse zu ermitteln. Abbildung 20 stellt den Ablauf der aktuellen Testreihe in der bereits bekannten Überblicksgrafik dar. 67 6 Migration und Parsen VARCHAR/ CLOB Konkatenation XML-Parsen Input UnicodeKonvertierung INSERT Vorverarbeitung VARCHAR/ CLOB (EBCDIC) XML Abbildung 20: Überblicksgrafik – „Einfaches Kopieren“ Zu dem hier betrachteten Prozess „Einfaches Kopieren“ sind folgende, den Vorbetrachtungen aus Kapitel 5 unterliegende Messungen und Variationen durchgeführt worden. Größe und Anzahl (CLOB und VARCHAR) Strukturiertheit (CLOB) Zusammensetzung (CLOB) In den nachstehenden Abschnitten werden die Ergebnisse analysiert. Zusätzliche Informationen zum konkreten Aufbau der Messprozedur, zu den einzelnen Ergebnistabellen und zu den Messwerten der Elapsed-Zeit sind dabei aus Umfangsgründen und gemäß den Bemerkungen aus Kapitel 5 in den Anhang dieser Arbeit ausgelagert. Größe und Anzahl (CLOB und VARCHAR) Der Kurvenverlauf (siehe Abbildung 21) zur Messung des INSERTs von als EBCDIC kodierten CLOB-Daten in eine Tabelle mit definierter EBCDIC-Codepage zeigt, dass die insgesamt benötigte CPU-Zeit bei zunehmender Dokumentgröße abnimmt. Das heißt, bei gleichem Gesamtdatenvolumen ist das Kopieren weniger großer Dokumente weitaus zeitgünstiger als das vieler kleiner Dokumente. Dieser Abfall flacht allerdings ab einer Dokumentgröße von 10K stark ab, sodass sich die CPU-Zeit von dort an nur minimal weiter verringert und folglich relativ gut skaliert. 68 6 Migration und Parsen 40 35 Sekunden 30 25 20 15 CPU - VARCHAR 10 CPU - CLOB 5 0 200B x 1K x 10K x 100K x 500.000 100.000 10.000 1.000 1M x 100 10M x 10 Größe und Anzahl Abbildung 21: Messergebnis – „Einfaches Kopieren“ – Größe und Anzahl – CPU-Zeit Übertragen auf den VARCHAR-Datentyp resultiert ein sehr ähnlicher Kurvenverlauf (siehe ebenfalls Abbildung 21). Hierbei lässt sich jedoch erkennen, dass die CPU-Zeit bei den Merkmalsausprägungen unter 10K wesentlich geringer ausfällt als bei der CLOB-Messung. Zu den weiteren Merkmalsausprägungen konnten aufgrund der Längenbeschränkung des VARCHAR-Datentyps keine Messungen durchgeführt werden (siehe Abschnitt 5.1.1). Anhand der betrachteten Messergebnisse lassen sich also insgesamt zwei wesentliche Besonderheiten aufzeigen. Zum einen erfolgt das mengenmäßig gleiche „Kopieren“ von wenigen großen im EBCDIC-Zeichensatz kodierten Dokumenten schneller als das von vielen kleinen Dokumenten. Zum anderen dauert die Verarbeitung von CLOB-Daten besonders für XMLDokumente, die kleiner als 10K sind, länger als die von VARCHAR-Daten, wobei diese Differenz aber mit zunehmender Dokumentgröße abnimmt. Die obigen Beobachtungen sind wahrscheinlich das Ergebnis mehrerer sich überlagernder Effekte. Dabei ist zum einen anzumerken, dass jedes Statement, egal ob es sich um statisches oder dynamisches SQL handelt, eine gewisse Zeit (Overhead) zur Befehlsverarbeitung benötigt, die noch nicht zur Abarbeitung beiträgt (siehe Abschnitt 5.2.3). Da in den hier verwendeten Messprozeduren pro Dokument stets ein INSERT ausgeführt wird, ist der gesamte Overhead für das Einfügen vieler kleiner Dokumente (100.000-mal 1K große Dokumente) erheblich größer, als der für das Einfügen weniger großer Dokumente (10-mal 10M große Dokumente). 69 6 Migration und Parsen Der zuletzt betrachtete Sachverhalt bietet jedoch keine Erklärung für den deutlichen Werteunterschied zwischen der CLOB- und der VARCHAR-Messung bis zur Merkmalsausprägung 10K. Hierfür ist vermutlich eine andere Tatsache verantwortlich. DB2 besitzt die Restriktion, dass es innerhalb einer Page nur maximal ein LOB-Objekt speichern kann [IBM06b]. Daraus ergibt sich aufgrund der definierten Pagesize von 16K für kleine Dokumentgrößen (bis 10K) ein sehr geringer Füllgrad für die Datenseiten. Dieser beträgt beispielsweise bei der Messung von 500.000-mal 200B großen Dokumenten in 16K-Seiten ungefähr ein Prozent, was für die Gesamtdatenmenge von 100M zu einer zumindest theoretisch unnötigen Allokation von fast 8G führt. Das Anfordern und Wegschreiben von Seiten verursacht stets I/O-Vorgänge und diese wiederum sowohl das Steigen der CPU- als auch das der Elapsed-Zeit. Damit lässt sich also eine Erklärung für den Werteunterschied zwischen der CLOB- und der VARCHAR-Messkurve geben. Zu einem wesentlichen Teil trägt aber auch die Art der internen Speicherung der Datentypen zu dem betrachteten Werteunterschied bei. Während es sich bei dem CLOB-Datentyp in DB2 ausschließlich um einen Outline-Datentyp handelt, ist der VARCHAR-Datentyp ein reiner Inline-Datentyp. Die genauen Bedeutungen dieser Begrifflichkeiten und die damit verbundenen Strukturen werden in [Koc11] ausführlich beschrieben. An dieser Stelle bleibt lediglich erwähnenswert, dass die Outline-Speicherung durch den notwendigen Umgang mit zusätzlichen Objekten stets etwas ineffizienter arbeitet als ihr Pendant die Inline-Speicherung. Unter anderem aus diesem Grund wurde in der Nachfolgeversion 10 des in dieser Arbeit betrachteten DB2 Version 9 auch das „inline LOB“-Feature implementiert. Dieses erlaubt zusätzlich zu dem bisherigen Outline-Datentyp LOB auch die Deklaration von LOB-Objekten als Inline-Datentyp. Näheres dazu findet sich in [IBM11v]. Strukturiertheit (CLOB) Die herkömmliche, auf Character-Strings basierende, nicht-native Speicherung von XMLDokumenten nutzt keine Semantik über deren Inhalt und behandelt sie als eine Art Black Box. Aus diesem Grund liegt bereits vor der Auswertung der strukturellen Messreihe die Vermutung nahe, dass die Strukturiertheit der XML-Dokumente keinen Einfluss auf die INSERTPerformance der nicht-nativen XML-Speicherung hat. Unter Berücksichtigung der in Abschnitt 5.4 näher beschriebenen Schwankungen bestätigt sich diese Annahme durch Abbildung 22. Somit lässt sich in allen untersuchten Testfällen bei der CPU-Zeit eine konstante Ausprägung 70 6 Migration und Parsen von ungefähr 0,2 Sekunden für das „einfache Kopieren“ der Gesamtdatenmenge von 100M erkennen. Da die Testdokumente für die strukturelle Messreihe stets 100K groß sind, entspricht diese Zeit gleichzeitig dem Wert der weiter oben durchgeführten Messung für 100K große Dokumente. Dementsprechend lässt sich formulieren, dass die Strukturiertheit, wie vermutet, keinen Einfluss auf die INSERT-Performance von nicht-nativen XML-Dokumenten als EBCDIC-Daten hat. 0,25 Sekunden 0,2 0,15 0,1 0,05 CPU 0 Strukturiertheit Abbildung 22: Messergebnis – „Einfaches Kopieren“ – Strukturiertheit – CPU-Zeit Zusammensetzung (CLOB) Aufgrund der im vorherigen Punkt ermittelten Ergebnisse ist für die Prozesskette „Einfaches Kopieren“ von der Präsentation weiterer Ergebnisse zum Einfluss der Zusammensetzung der Dokumente abgesehen worden. Die Erklärung dazu liefert die oben betrachtete Strukturiertheitsmessung. Da sich die Strukturiertheit der Dokumente nicht auf die INSERT-Performance innerhalb einer EBCDIC-Umgebung auswirkt, gilt dies folglich auch für die Zusammensetzung der Dokumente. Dahingehende Messungen würden somit lediglich die bereits zuvor betrachteten größenmäßigen Charakteristika aufzeigen und keine zusätzlichen Erkenntnisse liefern. Trotzdem lässt sich daraus folgern, dass das „einfache Kopieren“ für kumulierte XMLDokumente wesentlich schneller abläuft, als für über viele Dokumente verteilt gespeicherte Entitätsausprägungen. 71 6 Migration und Parsen 6.1.2 Konkatenation In DB2 werden zur nicht-nativen Speicherung von XML-Dokumenten vorwiegend die Datentypen VARCHAR und CLOB verwendet. Dabei sind auf diese Weise abgelegte Daten in der maximalen Zeichenlänge beschränkt. Abhängig von der verwendeten Pagesize kann ein als VARCHAR gespeichertes Dokument höchstens eine Länge von 32K (vielen Zeichen) besitzen. Für CLOB-Dokumente gilt eine Längenbeschränkung von maximal 2G. Hierbei ist aber zu beachten, dass durch die Subsystem-Parameter LOBVALA und LOBVALS noch weitere größenmäßige Restriktionen für CLOB-Daten existieren. [Koc11] Aufgrund der dargelegten Beschränkungen werden in der DATEV bisher XML-Dokumente zum Teil über mehrere Tupel hinweg gespeichert. Durch dieses Vorgehen lassen sich die oben beschriebenen Restriktionen/Längenbeschränkungen überwinden. Abbildung 23 zeigt das Prinzip der Aufteilung an einem Beispiel. Weitere Details hierzu finden sich in [Koc11]. nicht-natives XML („zerhackt“) <customerinfo id="1001"> <name> Mustermann </name> <phone type="work"> 408-555-1358 </phone> </customerinfo> Tupel 1 <customerinfo id="100 1"><name>Mustermann</ Tupel 2 name><phone type="wor k">408-555-1358</phon Tupel 3 e></customerinfo> Abbildung 23: Verteilung über mehrere Tupel [Koc11] Im Rahmen einer Migration der nicht-nativen XML-Dokumente in den nativen XML-Datentyp müssen die einzelnen Teile der Dokumente wieder zusammengefügt werden. Dies lässt sich mithilfe der CONCAT-Funktion [IBM11a] des DB2 realisieren. [Koc11] betrachtet dabei zwei verschiedene Szenarien – die Konkatenation mittels Stored Procedure und die Konkatenation per Recursive SQL [IBM04a]. Da der weitere Fokus auf der Performance des Konkatenationsprozesses liegt, soll für die den Varianten zugrunde liegenden Überlegungen auf [Koc11] verwiesen werden. 72 6 Migration und Parsen Die Konkatenation mittels Recursive SQL ist genau wie die Variante per Stored Procedure kostenmäßig betrachtet nicht unmittelbar der INSERT-Performance zuzuordnen. Vielmehr trägt der Prozess zum vorangehenden SELECT-basierten Zugriff auf die Daten bei, weshalb demzufolge keine Differenzbildung mit der in Abschnitt 6.1.1 erfassten Kosten-Baseline durchgeführt wird. Stattdessen werden die ermittelten Ergebnisse mit denen eines normalen SELECTs der Daten verglichen. Die diesem gegenüber entstehenden höheren Kosten sind als Zusatzaufwand zu verstehen, der resultiert, wenn die Konkatenation von verteilt („zerhackt“) abgelegten nicht-nativen XML-Dokumenten innerhalb des Migrationsablaufs notwendig ist. Das am Ende des Konkatenationsprozesses wieder vollständig zusammengefügte nicht-native XML-Dokument wird innerhalb einer CLOB-Variablen gespeichert. Der Grund dafür ist die, verglichen mit dem VARCHAR-Datentyp, größere maximale Länge des CLOB-Datentyps, die es erlaubt, nahezu beliebig große XML-Dokumente abbilden zu können. Bei der Messung der Zusatzkosten im Konkatenationsfall sind somit stets die Kosten für den SELECT von CLOBDaten als verrechnete Referenzwerte gewählt. Der Ablauf der durchgeführten Testreihe gestaltet sich wie im Überblick in Abbildung 24 dargestellt. VARCHAR/ CLOB Konkatenation XML-Parsen Input UnicodeKonvertierung INSERT Vorverarbeitung XML Abbildung 24: Überblicksgrafik – Konkatenation Zur Erfassung des aus der Konkatenation entstehenden Zusatzaufwands ist folgende Vorgehensweise verwendet worden. Den Ausgangspunkt bilden stets 100.000 1K große XMLDokumentteile. Diese werden entsprechend den Merkmalsausprägungen des Kriteriums der Größe und Anzahl blockweise konkateniert. Auf diese Weise erfolgt zum Beispiel zur Bestimmung der Messwerte für die Merkmalsausprägung „100K x 1.000“ die 1.000-fache Wiederholung der Konkatenation von jeweils 100 1K großen Dokumentteilen zu je einem 100K großen Gesamtdokument. In Anlehnung an die einzelnen Konkatenationsabläufe ist zur einfacheren Verständlichkeit die Bezeichnung der Merkmalsausprägungen erweitert worden. 73 6 Migration und Parsen Daher betitelt zum Beispiel fortan „100 x 1K x 1.000“ die zuvor betrachtete Ausprägung (siehe Abbildung 25). Die Herleitung der weiteren Bezeichnungen erfolgt in Analogie dazu. 100 x 1K x Zusammensetzung eines Ergebnisdokuments 1000 Anzahl an Ausführungen Abbildung 25: Beispiel für die Bezeichnung einer Merkmalsausprägung In dem Ablauf der hier beschriebenen Messreihe zeigen sich viele Parallelen zu den Ausführungen des Kriteriums der Zusammensetzung (Abschnitt 5.1.3). Vereinfacht gesprochen wurde der dazu verwendete Testdatenbestand ebenfalls durch die Konkatenation einer gewissen Anzahl von 1K großen Dokumenten erzeugt. Den für die Messreihe der Konkatenation verwendeten Messprozeduren liegt gemäß den obigen Ausführungen eine ähnliche Verfahrensweise zugrunde. Dementsprechend ließen sie sich durch geringfügige Modifizierungen auch für die Erzeugung des Testdatenbestands zum Kriterium der Zusammensetzung nutzen, was jedoch in dieser Arbeit nicht von weiterer Bedeutung sein wird. Zu dem hier betrachteten Prozess der Konkatenation sind folgende, den Vorbetrachtungen aus Kapitel 5 unterliegende Messungen und Variationen durchgeführt worden. Größe und Anzahl (CLOB und VARCHAR) Zusammensetzung (CLOB) In den nachstehenden Abschnitten werden die Ergebnisse analysiert. Zusätzliche Informationen zum konkreten Aufbau der Messprozedur, zu den einzelnen Ergebnistabellen und zu den Messwerten der Elapsed-Zeit sind dabei aus Umfangsgründen und gemäß den Bemerkungen aus Kapitel 5 in den Anhang dieser Arbeit ausgelagert. 74 6 Migration und Parsen Größe und Anzahl (CLOB und VARCHAR) Weiter oben ist bereits erwähnt worden, dass die folgenden Ausführungen der Ermittlung des Zusatzaufwands dienen, der durch die Konkatenation der einzelnen Dokumentteile entsteht. Zu dessen Bestimmung müssen den folgenden Messergebnissen als Referenzwerte die Kosten für den einfachen SELECT von CLOB-Dokumenten gegengerechnet werden. Aus Kompaktheitsgründen ist die Ermittlung dieser Differenz bereits direkt in die folgende Diagrammdarstellung integriert worden, sodass stets die Zusatzkosten abgebildet sind. Gemäß den Vorbemerkungen werden in den anschließenden Ausführungen die Varianten Konkatenation per Stored Procedure und Konkatenation mithilfe von Recursive SQL betrachtet. Für die zuletzt genannte Variante ergeben sich dabei abhängig vom verwendeten Datentyp Einschränkungen. Es ist nicht möglich, nicht-nativ als VARCHAR gespeicherte XMLDokumentteile rekursiv zu konkatenieren. Die Ursache dafür liegt in der bereits erwähnten Längenbeschränkung des VARCHAR-Datentyps. Eine ausführliche Begründung zu diesem Sachverhalt liefert [Koc11]. Die Konkatenation mittels Recursive SQL ist aber auch für die Verarbeitung von nicht-nativ als CLOB abgelegten XML-Dokumentteilen nicht uneingeschränkt realisierbar. Hier stößt DB2 ab der Merkmalsausprägung „1.000 x 1K x 100“ an die Grenze der gleichzeitig im virtuellen Speicher verarbeitbaren LOB-Datenmenge. Diese wird durch den Subsystem-Parameter LOBVALS spezifiziert, wobei der Parameter LOBVALA auf ähnliche Weise die LOB-Verarbeitung limitiert. Nähere Informationen dazu finden sich in [Koc11]. Abbildung 26 zeigt unter Berücksichtigung der zuvor erwähnten Einschränkungen das Ergebnis sämtlicher zur Konkatenation durchgeführter Messreihen. Dabei weicht die gewählte logarithmische21 Skalierung der Zeitachse bewusst von den bislang betrachteten Diagrammen ab. Dies begründet sich durch den zum Teil großen Werteunterschied zwischen den einzelnen Messergebnissen, auf die nun im Detail eingegangen werden soll. 21 Logarithmus zur Basis 10 75 6 Migration und Parsen 10000 Sekunden 1000 100 CPU - CLOB - SP 10 CPU - VARCHAR - SP CPU - CLOB - RSQL 1 Größe und Anzahl Abbildung 26: Messergebnis – Konkatenation – Größe und Anzahl – CPU-Zeit Bei der Auswertung der Messreihen kann zuerst einmal festgehalten werden, dass sich die Messergebnisse der Konkatenation per Stored Procedure (SP) für die unterschiedliche Ausgangsform der Teile eines XML-Dokuments (einerseits als VARCHAR- und andererseits als CLOB-Dokument) fast nicht unterscheiden. Dafür verantwortlich ist sehr wahrscheinlich die in beiden Fällen zur Speicherung des Zwischenergebnisses verwendete CLOB-Variable. Die Ausgangsform der Daten hat demnach kaum Einfluss auf den hier betrachteten Konkatenationsvorgang. Dementsprechend lässt sich für die Konkatenation per Stored Procedure generell feststellen, dass die CPU-Zeit von einer Merkmalsausprägung zu nächst größeren stets ungefähr um den Faktor zehn ansteigt. Dieses Kurvenwachstum ist in Analogie zu der gleichermaßen kontinuierlich zehnfach zunehmenden Dokumentgröße zu sehen, die als Ergebnis des jeweiligen Konkatenationsprozesses entsteht. Da aber die CONCAT-Funktion entsprechend der obigen Betrachtungen stets 100.000-fach ausgeführt wird, lässt sich formulieren, dass die „Stored Procedure“-basierte Konkatenation von großen Dokumenten wesentlich aufwändiger ist, als die von kleinen Dokumenten. Für die Konkatenation mittels Recursive SQL (RSQL) trifft die zuletzt angeführte Aussage nicht zu. Hier ist in der CPU-Zeit bei allen Merkmalsausprägungen ein nahezu konstanter Konkatenationsaufwand erkennbar, der weit über den Kosten der Konkatenation per Stored Procedure liegt. Die Ursache dafür lässt sich in der Art und Weise des rekursiven Vorgehens vermuten, das in [Koc11] näher beschrieben wird. Auf eine ausführliche Betrachtung dieses Zusammenhangs soll daher verzichtet werden. Wichtiger ist die Erkenntnis, dass die 76 6 Migration und Parsen Konkatenation von XML-Dokumentteilen per Recursive SQL wesentlich uneffizienter ist als die Variante mittels Stored Procedure. Letztere ist zudem auch uneingeschränkt22 einsetzbar, sodass sich eine klare Empfehlung hinsichtlich dieser Variante aussprechen lässt. Zusammensetzung (CLOB) (und Strukturiertheit (CLOB)) Die CONCAT-Funktion in DB2 ist eine Funktion zur Verknüpfung von Character-Strings. Diese bestehen jeweils aus einer beliebigen Folge von Zeichen, deren Aneinanderreihung aber keinen Einfluss auf ihre Verarbeitung hat. Die als Character-String in verteilter Form abgelegten nicht-nativen XML-Dokumente werden mithilfe der CONCAT-Funktion demnach ohne Betrachtung ihres Inhalts konkateniert. Für das Kriterium der Strukturiertheit ergeben sich daher keine neuen Erkenntnisse. Die Messreihe zur Zusammensetzung der Dokumente liefert erwartungsgemäß die gleichen Ergebnisse wie die Messreihe zum Kriterium der Größe und Anzahl, sodass die inhaltliche Zusammensetzung der Dokumente ebenfalls keinen Einfluss auf die Resultate hat. Für eine ausführlichere Begründung soll hier – wegen der bestehenden Analogie – auf Abschnitt 6.1.1 verwiesen werden. 6.1.3 Unicode-Konvertierung Der native XML-Datentyp ist in DB2 Version 9 ausschließlich als Outline-Datentyp realisiert [Koc11]. Dementsprechend nutzt DB2 für die Datenablage unter anderem zusätzliche XMLTablespaces und darin enthaltene XML-Auxiliary-Tabellen [Koc11]. Diese Strukturen werden stets implizit von DB2 angelegt, wobei als Codepage generell der Unicode-Zeichensatz definiert wird. Im Detail betrachtet handelt es sich bei der nativen Ablage von XML-Dokumenten um die Zeichenkodierung UTF-8. Somit ist in DB2 eine auf der EBCDIC-Codepage basierende Speicherung von XML-Dokumenten nicht möglich. Aus den obigen Sachverhalten ergibt sich, dass für die Migration von nicht-nativen XMLDokumenten in den nativen XML-Datentyp ein Konvertierungsprozess notwendig ist. Dieser muss, wie eingangs des Abschnitts 6.1 geschildert, die vorhandenen EBCDIC-Dokumente in die 22 für alle Datentypen und für alle Merkmalsausprägungen 77 6 Migration und Parsen Unicode-Codepage UTF-8 überführen. Damit die Kosten für diesen Schritt separat vom anschließenden XML-Parse-Prozess erfasst werden können, liegt der hierzu durchgeführten Messreihe die folgende Idee zugrunde. Wie in Abbildung 27 ersichtlich wird die Prozesskette der Migration dabei nur bis zum Schritt des XML-Parsens ausgeführt. Dies geschieht durch das Einfügen der Dokumente in eine CLOB- beziehungsweise VARCHAR-Spalte mit zugrunde liegender Unicode-Codepage UTF-8. Somit wird zwar der Prozess der Unicode-Konvertierung ausgeführt, jedoch nicht der des XML-Parsens. Durch die in Abschnitt 6.1 bereits beschriebene Differenzbildung mit der Kosten-Baseline aus Abschnitt 6.1.1 lässt sich eine Aufwandsabschätzung für den Performance-Anteil des Konvertierungsprozesses berechnen. VARCHAR/ CLOB Konkatenation XML-Parsen Input UnicodeKonvertierung INSERT Vorverarbeitung VARCHAR/ CLOB (Unicode) XML Abbildung 27: Überblicksgrafik – Unicode-Konvertierung Zu dem hier betrachteten Prozess der Unicode-Konvertierung sind folgende, den Vorbetrachtungen aus Kapitel 5 unterliegende Messungen und Variationen durchgeführt worden. Größe und Anzahl (CLOB und VARCHAR) Strukturiertheit (CLOB) Zusammensetzung (CLOB) In den nachstehenden Abschnitten werden die Ergebnisse analysiert. Zusätzliche Informationen zum konkreten Aufbau der Messprozedur, zu den einzelnen Ergebnistabellen und zu den Messwerten der Elapsed-Zeit sind dabei aus Umfangsgründen und gemäß den Bemerkungen aus Kapitel 5 in den Anhang dieser Arbeit ausgelagert. 78 6 Migration und Parsen Größe und Anzahl (CLOB und VARCHAR) In den Vorbetrachtungen dieses Abschnitts ist insbesondere auf die Differenzbildung mit der Kosten-Baseline aus Abschnitt 6.1.1 hingewiesen worden, die durchgeführt werden muss, um den konkreten (Zusatz-)Aufwand der Unicode-Konvertierung abschätzen zu können. Die dazu notwendige Berechnung ist aus Kompaktheitsgründen bereits direkt in die in Abbildung 28 dargestellten Messresultate einbezogen worden. Dementsprechend sind hier nur die Kosten abgebildet, die zusätzlich zu den Kosten für das „einfache Kopieren“ durch die UnicodeKonvertierung der Daten entstehen. 4,5 4 3,5 Sekunden 3 2,5 2 CPU - VARCHAR 1,5 CPU - CLOB 1 0,5 0 200B x 1K x 10K x 100K x 500.000 100.000 10.000 1.000 1M x 100 10M x 10 Größe und Anzahl Abbildung 28: Messergebnis – Unicode-Konvertierung – Größe und Anzahl – CPU-Zeit Bei der Betrachtung der Messergebnisse aus Abbildung 28 fällt auf, dass bei der Konvertierung von kleinen Dokumenten (bis zu 10K) ein relativ großer Unterschied zwischen der CLOB- und der VARCHAR-Messung besteht. So benötigt beispielsweise die Konvertierung von EBCDIC nach Unicode für 500.000 VARCHAR-Dokumente der Größe 200B ungefähr 0,4 Sekunden. Demgegenüber entsteht für die gleiche Konvertierung von CLOB-Dokumenten ungefähr der zehnfache Aufwand, sodass für die CPU-Zeit hier rund 4 Sekunden gemessen werden konnten. Während für die Konvertierung von nicht-nativen als VARCHAR gespeicherten XMLDokumenten in die Unicode-Codepage über alle betrachteten Merkmalsausprägungen hinweg ein konstanter Zusatzaufwand bezogen auf die CPU-Zeit besteht, ist dies für CLOB-Daten nicht 79 6 Migration und Parsen der Fall. Hier ist bis zu der Ausprägung „10K x 10.000“ eine abnehmende Kurve zu sehen, die sich mit zunehmender Dokumentgröße immer mehr der VARCHAR-Kurve annähert, bis sie sich letztendlich fast treffen. Ab der Ausprägung „10K x 10.000“ bleiben dann auch die Messwerte der CLOB-Messung relativ konstant. Eine Betrachtung zu diesen Merkmalsausprägungen für die Konvertierung von VARCHAR-Daten ist leider aus den in Abschnitt 5.1.1 genannten Gründen (Längenbeschränkung des VARCHAR-Datentyps) nicht möglich. Die Vermutung liegt aber nahe, dass sich die Werte ab der Ausprägung „10K x 10.000“ nahezu identisch verhalten würden. Der verglichen mit den anderen Ergebnissen erhöhte Zusatzaufwand für die Verarbeitung kleiner XML-Dokumente im CLOB-Fall ist bereits in Abschnitt 6.1.1 zu beobachten gewesen. In jenem Abschnitt ist davon ausgegangen worden, dass dieser Aufwand aus der Art und Weise resultiert, wie DB2 LOB-Objekte verarbeitet (speichert). Es ist lediglich zulässig, maximal ein LOB-Objekt in einer Page zu verwalten, was für beispielsweise 200B kleine LOB-Dokumente bei einer Pagesize von 16K einen sehr geringen Seitenfüllgrad (ungefähr ein Prozent der Bruttodaten) bedeutet. Aus diesem Grund werden in den Messungen bei den Merkmalsausprägungen bis einschließlich „10K x 10.000“ weitaus mehr Seiten verarbeitet als in den verbleibenden Fällen, woraus demzufolge auch ein erhöhter Aufwand resultiert. Dies trifft gleichermaßen auch auf den in diesem Abschnitt betrachteten Zusatzaufwand der UnicodeKonvertierung zu. Schließlich befinden sich die zu konvertierenden Daten unabhängig von ihrer Größe ebenfalls in 16K großen Seiten und werden anschließend auch wieder in diese zurückgeschrieben. Für detailliertere Ausführungen dazu wird auf Abschnitt 6.1.1 verwiesen. Strukturiertheit (CLOB) und Zusammensetzung (CLOB) Die Konvertierung von EBCDIC-Dokumenten in die Unicode-Codepage ist genau wie auch die in den vorangehenden Abschnitt 6.1.2 betrachtete CONCAT-Funktion unabhängig von deren Inhalt. Demzufolge ergeben sich bei der Messreihe zum Kriterium der Strukturiertheit über alle Merkmalsausprägungen hinweg auch hier konstante CPU-Zeiten. Die Messreihe zum Kriterium der Zusammensetzung liefert ebenfalls keine neuen Erkenntnisse und zeigt demnach das gleiche Resultat wie auch die Untersuchung zum Kriterium der Größe und Anzahl. Demnach macht es aber für die Unicode-Konvertierung kaum einen Unterschied, ob die Dokumente in zusammengesetzter Form oder einzeln verarbeitet werden. Eine (erneute) Begründung der Ergebnisse soll 80 6 Migration und Parsen an dieser Stelle nicht erfolgen. Dazu wird wegen der bestehenden Analogie auf die Ausführungen der vorangehenden Abschnitte verwiesen. 6.1.4 XML-Parsen der Dokumente Das XML-Parsen der nicht-nativen XML-Dokumente in den nativen XML-Datentyp ist der letzte wesentliche Schritt der Migration. Hier wird die Transformation der Dokumente in eine native binäre Ablageform durchgeführt, in der die Daten letztendlich auch physisch in DB2 abgelegt werden. Ausführliche Informationen zum Prozess des XML-Parsens finden sich in Abschnitt 3.1.2. Den hier nun komplett betrachteten Ablauf einer Migration stellt Abbildung 29 dar. VARCHAR/ CLOB Konkatenation XML-Parsen Input UnicodeKonvertierung INSERT Vorverarbeitung XML Abbildung 29: Überblicksgrafik – XML-Parsen der Dokumente Ähnlich zu der Vorgehensweise bei der Ermittlung des Aufwands für die UnicodeKonvertierung ist auch zur Abschätzung des reinen Parse-Aufwands eine Differenzbildung nötig. Wie bereits in Abschnitt 6.1 beschrieben und in Abbildung 19 gezeigt, müssen dazu die Gesamtkosten des vorangehenden Ablaufs bis einschließlich zur Konvertierung von den hier ermittelten Messergebnissen subtrahiert werden. Diese Differenzbildung wird aus Kompaktheitsgründen direkt in die weiteren Diagrammdarstellungen dieses Abschnitts einbezogen. Dementsprechend verstehen sich die aufgeführten Ergebnisse als zusätzlicher Zeitaufwand, der für das Parsen von nicht-nativen XML-Dokumenten in den nativen XML-Datentyp resultiert. Zu dem hier betrachteten Prozess des XML-Parsens sind folgende, den Vorbetrachtungen aus Kapitel 5 unterliegende Messungen und Variationen durchgeführt worden. 81 6 Migration und Parsen Größe und Anzahl (CLOB und VARCHAR) Strukturiertheit (CLOB) Zusammensetzung (CLOB) In den nachstehenden Abschnitten werden die Ergebnisse analysiert. Zusätzliche Informationen zum konkreten Aufbau der Messprozedur, zu den einzelnen Ergebnistabellen und zu den Messwerten der Elapsed-Zeit sind dabei aus Umfangsgründen und gemäß den Bemerkungen aus Kapitel 5 in den Anhang dieser Arbeit ausgelagert. Größe und Anzahl (CLOB und VARCHAR) Bei den durch Differenzbildung errechneten Kosten für den XML-Parse-Prozess zeigt sich hinsichtlich des Kriteriums der Größe und Anzahl anders als bei den zuvor betrachteten Messergebnissen diesmal für die VARCHAR-Messung ein erhöhter Aufwand bei der Verarbeitung kleiner XML-Dokumente (siehe Abbildung 30). Demgegenüber ist bei der Messreihe, die nicht-native als CLOB gespeicherte XML-Dokumente in das native XML-Format parst, eine bis zur Merkmalsausprägung „10K x 10.000“ steigende Kurve der CPU-Zeit zu beobachten, die ab diesem Punkt jedoch konstant bleibt. Gemäß den einführenden Anmerkungen aus Abschnitt 6.1 dürfen die hier beschriebenen Resultate nicht eins-zu-eins als Kosten für den XML-Parse-Prozess interpretiert werden. Vielmehr stellen sie die Zusatzkosten dar, die bei der in Abbildung 19 aufgezeigten Differenzbildung für den Parse-Prozess entstehen. 14 12 Sekunden 10 8 6 CPU - VARCHAR 4 CPU - CLOB 2 0 200B x 1K x 10K x 100K x 500.000 100.000 10.000 1.000 1M x 100 10M x 10 Größe und Anzahl Abbildung 30: Messergebnis – XML-Parsen – Größe und Anzahl – CPU-Zeit 82 6 Migration und Parsen Bei den hier durchgeführten Messreihen besteht erstmalig ein wesentlicher struktureller Unterschied zwischen Ausgangs- (VARCHAR beziehungsweise CLOB) und Zieldatentyp (XML). Dabei sind alle der drei genannten Datentypen VARCHAR, CLOB und XML in DB2 unterschiedlich implementiert. Eine ausführliche Betrachtung ihrer zugehörigen Strukturen findet sich in [Koc11]. An dieser Stelle ist lediglich die Bemerkung wichtig, dass sich anhand der Umsetzung der Datentypen unterschiedliche Vor- und Nachteile ergeben und diese unter anderem auch Einfluss auf die Performance der jeweils zu verarbeitenden Daten haben. Ein wesentlichster Unterschied zwischen den drei hier betrachteten Datentypen ist die Art und Weise, wie effizient sie sich in Datenbankseiten verwalten lassen. Hier zeigt sich bei der Verarbeitung von LOB-Daten ein erhebliches Defizit, das weder für den VARCHAR-, noch für den XML-Datentyp besteht. Wie oben erwähnt, ist es lediglich möglich, pro Page ein LOBObjekt zu verwalten – egal wie klein dieses ist. Da bei den hier durchgeführten Messreihen die Seitengröße für den LOB-Tablespace auf 16K festgelegt wurde, ergibt sich für die nicht-native CLOB-Verarbeitung von kleinen XML-Dokumenten ein entsprechend kleiner Füllgrad der Seiten (siehe Abschnitt 6.1.1). Dieses „Problem“ ergibt sich für den ansonsten in DB2 ähnlich zu den LOB-Datentypen implementierten nativen XML-Datentyp nicht. Verglichen mit diesem Datentyp ist dementsprechend die Verarbeitung von kleinen, im CLOB-Datentyp vorliegenden XML-Dokumenten aufwändiger. In Anlehnung an den dargestellten Sachverhalt wird also in der obigen Messauswertung der CLOB-Kurve der für kleine Dokumente aufwändige CLOB-INSERT von dem in Relation dazu günstigeren XML-INSERT mit darin eingeschlossenem Parse-Aufwand subtrahiert23. Das Ergebnis dieser Differenz entspricht somit nicht den gewünschten „reinen“ Kosten des XMLParse-Prozesses. Stattdessen zeigt das Resultat der CLOB-Messreihe den Parse-Aufwand vermindert um die Einsparung durch die Verwendung des XML-Datentyps. Das zuletzt betrachtete „Seitenfüllgradproblem“ äußert sich nur bei dem CLOB-Datentyp, bei den beiden anderen hier betrachteten Datentypen XML und VARCHAR nicht. Demnach kann die ermittelte Kurve der CPU-Zeit bezogen auf die VARCHAR-Messung als eine geeignetere Abschätzung für den Aufwand des XML-Parse-Prozesses angesehen werden. Die bereits oben 23 In beiden Betrachtungen sind zusätzlich auch die Kosten für die Unicode-Konvertierung enthalten, die sich aber durch die Differenzbildung aufheben. 83 6 Migration und Parsen angesprochene bis zur Merkmalsausprägung „10K x 10.000“ abnehmende CPU-Zeit bei der VARCHAR-Messreihe resultiert vermutlich in Analogie zu Abschnitt 6.1.1 durch eine gewisse Art an Overhead bei der Statement-Verarbeitung. Dieser fällt entsprechend für die vielfache Initiierung des XML-Parse-Prozesses in den z/OS XML System Services [IBM12b] bei vielen kleinen zu parsenden Dokumenten stärker ins Gewicht, als für die wenigen Parse-Prozesse bei einer geringen Anzahl großer Dokumente. Da der als „Seitenfüllgradproblem“ betitelte Effekt ab einer Dokumentgröße von 10K entfällt, kann davon ausgegangen werden, dass die ab diesem Punkt abgebildeten Resultate der CLOB-Messung wieder als Kennwerte zur Abschätzung des Parse-Aufwands geeignet sind. Dies begründet sich auch durch die Wertegleichheit der beiden Messreihen VARCHAR und CLOB in der Merkmalsausprägung „10K x 10.000“. Strukturiertheit (CLOB) Entgegen den vorangehenden Messungen zum Kriterium der Strukturiertheit zeigen sich bei der Untersuchung der Performance des XML-Parse-Prozesses erhebliche, in diesem Ausmaß nicht erwartete Unterschiede in den einzelnen Merkmalsausprägungen. Abbildung 31 veranschaulicht die Resultate der durchgeführten Messreihe, wobei auch hier die eingangs von Abschnitt 6.1 beschriebene Differenzbildung bereits in die einzelnen Ergebniswerte eingerechnet wurde. Anhand der dargestellten Resultate lassen sich zwei generelle Tendenzen ableiten. Einerseits ist der Parse-Aufwand von flachen XML-Dokumenten größer als von tiefen und nochmals größer als von balancierten Dokumenten. Zum anderen besteht auch ein Unterschied in der Effizienz, mit der einzelne Knoten eines XML-Dokuments geparst werden. So hat sich im Wesentlichen herausgestellt, dass das Parsen von Attributknoten am meisten Zeit in Anspruch nimmt. Darauf folgt die Verarbeitung von Elementknoten. Textknoten wiederum lassen sich am schnellsten parsen. Die Ursache der beschriebenen Effekte liegt in der Art und Weise begründet, wie der Parse-Prozess für XML-Dokumente durch die z/OS XML System Services durchgeführt wird. Genaue Details zu deren Implementierung sind allerdings nicht veröffentlicht worden. 84 6 Migration und Parsen 140 Sekunden 120 100 80 60 40 20 CPU 0 Strukturiertheit Abbildung 31: Messergebnis – XML-Parsen – Strukturiertheit – CPU-Zeit Aus den ermittelten Resultaten können hinsichtlich der Parse-Performance folgende Richtlinien/Empfehlungen zur Modellierung von XML-Dokumenten abgeleitet werden. Elementknoten sollten der Verwendung von Attributknoten vorgezogen werden. An geeigneter Stelle macht es auch Sinn, Attributknoten durch Textknoten zu ersetzen. Diese haben jedoch den Nachteil, dass sie unstrukturiert sind und ein Elementknoten nur maximal einen Textknoten enthalten kann. Bezogen auf die Hierarchie von XML-Dokumenten empfiehlt es sich, diese möglichst tief – im Idealfall allerdings balanciert – zu modellieren. Es sei aber hier nochmals auf die Aussage aus Abschnitt 5.1.2 verwiesen, die besagt, dass die Modellierung von XMLDokumenten nie primär an deren Performance festgemacht werden sollte. Zudem ist der Prozess des Parsens nicht „alles“, weshalb an dieser Stelle auch der Hinweis auf die PerformanceErgebnisse zum Kriterium der Strukturiertheit aus Abschnitt 8.2.1 anzuführen ist. Zusammensetzung (CLOB) Bei der Untersuchung der XML-Parse-Performance zeigt sich für das Kriterium der Zusammensetzung ein Kurvenlauf, der diesmal nicht nur von der Größe der XML-Dokumente (siehe oben) abhängt. Demzufolge lässt sich in Abbildung 32 ab der Merkmalsausprägung „10K x 10.000“ eine kontinuierliche Abnahme des Parse-Aufwands in der CPU-Zeit erkennen. Die erste Ausprägung „1K x 100.000“ weicht dabei von dem restlichen Kurvenverlauf ab. Unter Einbeziehung der bereits oben zum Kriterium der Größe und Anzahl erwähnten Überlegungen zum „Seitenfüllgradproblem“ ist diese Abweichung aber auf die unterschiedliche Verarbeitungsform der hier involvierten Datentypen CLOB und XML zurückführbar. Eine ausführliche 85 6 Migration und Parsen Begründung dazu ist bereits geliefert worden. Dabei sei besonders auf die bei dem Kriterium der Größe und Anzahl „realistischere“ Kurve der VARCHAR-Messreihe hingewiesen, die einen erheblichen Abfall zeigt. Dieser lässt sich in analoger Begründung auf die in Abbildung 32 dargestellten Ergebnisse übertragen, sodass auch hier von einem insgesamt abfallenden Aufwand – die CPU-Zeit betreffend – die Rede sein kann. 4 3,5 Sekunden 3 2,5 2 1,5 CPU 1 0,5 0 1K 10K (x 100.000) (x 10.000) 100K (x 1.000) 1M (x 100) 10M (x 10) Zusammensetzung (und Anzahl) Abbildung 32: Messergebnis – XML-Parsen – Zusammensetzung – CPU-Zeit Obwohl die Betrachtung zur Strukturiertheit gezeigt hat, dass das Parsen von flacheren XMLDokumenten mehr Zeit in Anspruch nimmt, als das von Dokumenten mit tieferer Struktur, kann hier trotzdem die Aussage getroffen werden, dass kumulierte und somit in Relation zu ihrer Größe flachere XML-Dokumente sich generell schneller parsen lassen als einzelne Dokumente. Das bedeutet, dass aus Sicht der Parse-Performance für die Modellierung von XMLDokumenten die Empfehlung gegeben werden kann, mehrere Entitätsausprägungen innerhalb eines einzigen Dokuments zu beschreiben. Hier muss jedoch wiederholt angemerkt werden, dass die Modellierung von XML-Dokumenten nicht primär von der (Parse-)Performance abhängig gemacht werden sollte. 86 6 Migration und Parsen 6.1.5 Zusammenfassung und Verteilung der Kosten Nachdem in den vorangehenden Abschnitten die Performance der einzelnen Prozesse betrachtet wurde, die für eine Migration von nicht-nativen XML-Daten in die native Speicherform notwendig sind, sollen die dabei gewonnenen Ergebnisse in diesem Abschnitt zusammengefasst werden. Zusätzlich erfolgt hier auch die Betrachtung der Kostenanteile, die jeder Prozess am Gesamtaufwand einer Migration hat. Dabei stützen sich die weiteren Ausführungen primär auf die Ergebnisse zum Kriterium der Größe und Anzahl. Anhand dieser Resultate lassen sich anschließend auch Aussagen zur Kostenverteilung bei den ebenfalls untersuchten Kriterien Strukturiertheit und Zusammensetzung treffen. Größe und Anzahl Bei der Untersuchung des Kriteriums der Größe und Anzahl zeigt sich für die Prozesskette vom „einfachen Kopieren“ über die Unicode-Konvertierung bis hin zum XML-Parsen die in Abbildung 33 veranschaulichte Kostenverteilung. Die Betrachtung des Kostenanteils der Konkatenation erfolgt separat weiter unten. Unter Einbeziehung der Überlegungen zum „Seitenfüllgradproblem“ aus dem vorangehenden Abschnitt lässt sich in Abbildung 33 erkennen, dass das Parsen der XML-Dokumente unter den hier betrachteten Prozessen der aufwändigste ist. 45 40 CLOB-INSERT 35 30 Sekunden VARCHAR-INSERT 25 CLOB-INSERT (inklusive Unicode-Konvertierung) 20 15 VARCHAR-INSERT (inklusive Unicode-Konvertierung) 10 XML-INSERT (inklusive Unicode-Konvertierung und XML-Parsen) 5 0 200B x 500.000 1K x 100.000 10K x 10.000 100K x 1.000 1M x 100 10M x 10 Größe und Anzahl Abbildung 33: Gegenüberstellung der Prozessketten zur Migrationsuntersuchung 87 6 Migration und Parsen Der bezogen auf die gemessenen CPU-Zeiten kostenmäßig betrachtete Unterschied verschärft sich in Abbildung 33 zudem weiterhin bei wachsender Dokumentgröße und gleich bleibendem Gesamtdatenvolumen. Allerdings sinken mit zunehmender Dokumentgröße die Gesamtkosten der Migration drastisch. Die „übrig bleibenden“ (geringen) Kosten sind dann weitgehend jene Parse-Kosten. Abbildung 33 zeigt aber auch, dass gerade wegen des „Seitenfüllgradproblems“ – also der Einschränkung, dass DB2 in einer Page nur maximal ein LOB-Objekt verwalten kann – besonders bei kleiner Dokumentgröße die gesamte Migration von nicht-nativen XMLDokumenten nicht merklich mehr Zeit in Anspruch nimmt als das „einfache Kopieren“ von CLOB-Daten. Die Verarbeitung von VARCHAR-Dokumenten ist hier allerdings um ein Vielfaches schneller. Die Gründe hierfür sind bereits in den vorangehenden Abschnitten ausführlich diskutiert worden. Für die Performance des Prozesses der Unicode-Konvertierung zeigen sich in Abbildung 33 keine besonderen Ergebnisse24. Wie bereits in Abschnitt 6.1.3 veranschaulicht wurde, besteht abgesehen von dem „Seitenfüllgradproblem“ durch die Unicode-Konvertierung ein in allen Merkmalsausprägungen nahezu konstanter Zusatzaufwand, der bezogen auf die obige Darstellung in Relation zu den Gesamtkosten der Migration gering ist. Auf zusätzliche Schlussfolgerungen, die sich aus Abbildung 33 ziehen lassen würden, soll aus Umfangsgründen weiterhin nicht eingegangen werden. Insgesamt lässt sich für die hier diskutierte Kostenverteilung formulieren, dass es speziell in Anbetracht der Performance der VARCHARMessungen wünschenswert wäre, den XML-Parse-Prozess weiter zu optimieren. Gemäß der obigen Anmerkung soll nun noch der Anteil betrachtet werden, den der Prozess der Konkatenation von nicht-nativen XML-Dokumentteilen einnehmen würde, sofern dieser im Migrationskontext notwendig ist. Die dazu folgenden Betrachtungen orientieren sich ausschließlich an der in Abschnitt 6.1.2 empfohlenen Variante der Konkatenation per Stored Procedure25. Um deren Kostenanteil geeignet darstellen zu können, veranschaulicht Abbildung 34 die Gesamtkosten für eine Migration mit auf diese Weise eingeschlossener Konkatenation in 24 da fixer Aufwand pro Konvertierung eines Characters 25 Die Unterscheidung zwischen den Ausgangsdatentypen VARCHAR und CLOB ist entsprechend der nahezu identischen Ergebnisse aus Abschnitt 6.1.2 hier nicht notwendig. 88 6 Migration und Parsen jeder Merkmalsausprägung mit je 100 Prozent. Dabei ist der Anteil, den der Prozess des Zusammenfügens einnimmt, separat (rot) ausgewiesen. 100% Sekunden (in Prozent) 90% 80% 70% Zusatzkosten für Konkatenation (per Stored Procedure) 60% 50% 40% 30% XML-INSERT (inklusive UnicodeKonvertierung und XML-Parsen) 20% 10% 0% 1K x 10K x 100.000 10.000 100K x 1.000 1M x 100 10M x 10 Größe und Anzahl Abbildung 34: Kostenanteil der Konkatenation an einer XML-Migration Anhand Abbildung 34 lässt sich erkennen, dass der Konkatenationsprozess äußerst aufwändig ist. Bereits ab der Merkmalsausprägung „100K x 1.000“ benötigt er im Rahmen einer Migration den Hauptanteil an CPU-Zeit für sich. Dahingehend muss aber erwähnt sein, dass nicht-native XML-Dokumente in der DATEV zum aktuellen Zeitpunkt stets auf weniger als 100 Teile beziehungsweise Tupel verteilt in DB2 gespeichert sind. Die extremen Kostenanteile der Konkatenation bei den Merkmalsausprägungen rechts von „100K x 1.000“ finden sich somit nach momentanem Kenntnisstand (glücklicherweise) nur in den hier durchgeführten künstlichen Messreihen wieder. Für die zur Konkatenation in DB2 verwendete CONCAT-Funktion besteht aber dennoch entsprechend der diskutierten Ergebnisse Verbesserungsbedarf. In diesem Zusammenhang ist bei IBM ein Marketing Request (MR0727113519) eröffnet worden. Strukturiertheit und Zusammensetzung Bei der Untersuchung der Kriterien Strukturiertheit und Zusammensetzung zeigten sich erst bei der Messreihe zur XML-Parse-Performance neue Erkenntnisse. Dementsprechend gelten für deren Kostenanteile mit wenigen Anmerkungen ebenfalls die oben diskutierten Ergebnisse. 89 6 Migration und Parsen Diese sollen hier nicht nochmals ausführlich beschrieben werden, sodass im Folgenden lediglich auf deren Abweichungen eingegangen wird. Für das Kriterium der Zusammensetzung sind die zuvor erwähnten und in Abbildung 33 dargestellten Resultate prinzipiell als identisch anzusehen. Hier zeigt sich lediglich eine Abweichung in der Messreihe zum XML-INSERT. Die dazu abgebildeten CPU-Zeiten flachen bei der Untersuchung zum Kriterium der Zusammensetzung bei zunehmender Dokumentgröße weiter ab. Diese Unterschiede sind aber so minimal, dass sie sich nicht sichtbar auf das Ergebnis von Abbildung 34 auswirken. Auch bei der Betrachtung der Kostenanteile der einzelnen Prozesse beim Kriterium der Strukturiertheit ergeben sich die zuletzt erwähnten Analogien. Hier zeigen sich ausschließlich die bereits in Abschnitt 6.1.4 beschriebenen Unterschiede abhängig von der Strukturiertheit der XML-Dokumente. Daher ist auch hier insgesamt ein hoher Anteil für den Aufwand des XMLParse-Prozesses festzustellen. Ebenfalls stark ins Gewicht fällt in dem Zusammenhang ähnlich zu Abbildung 33 auch der Konkatenationsprozess. 6.2 Analyse der INSERT-Performance bei Neueinfügungen Das Einfügen neuer Dokumente in den nativen XML-Datentyp ist dem Migrationsfall sehr ähnlich. Beide Prozessketten haben, wie in Abbildung 35 dargestellt, den abschließenden Schritt des XML-Parsens gemeinsam. Bei der Neueinfügung („rechte Seite“ der Prozessgrafik) ergibt sich jedoch abhängig von der Beschaffenheit der einzufügenden Dokumente ein Unterschied bei der vorangehenden Konvertierung. Je nachdem in welchem Zeichensatz die neuen Daten anwendungsseitig vorliegen, müssen diese analog zu den Bemerkungen aus Abschnitt 6.1.3 in die Unicode-Codepage UTF-8 konvertiert werden. Dabei ist es aber (auch in der DATEV) nicht unwahrscheinlich, dass die einzufügenden Dokumente bereits als UTF-8 kodiert sind. In diesem Fall ist eine weitere Konvertierung unnötig und wird von DB2 nicht durchgeführt. Daher ist auf die Angabe des Zwischenschritts der Konvertierung in der Übersicht in Abbildung 35 verzichtet worden. Der Prozess der Konkatenation findet naheliegenderweise für Neueinfügungen generell nicht statt, da die Dokumente als Ganzes „angeliefert“ werden. 90 6 Migration und Parsen VARCHAR/ CLOB Konkatenation XML-Parsen Input UnicodeKonvertierung INSERT Vorverarbeitung XML Abbildung 35: Überblicksgrafik – Neueinfügungen Für die Version 10 des DB2 ist in diesem Zusammenhang eine zusätzliche Anmerkung zu treffen. Dort ist es mit der „Binary XML“-Technologie [IBM10a] möglich, XML-Dokumente beispielsweise per JDBC-Treiber in binär geparster Form zwischen Anwendung und Datenbank zu kommunizieren. Sollte also ein neu einzufügendes XML-Dokument anwendungsseitig bereits in geparster Form vorliegen, kann es demnach auch ohne einen vollumfänglichen datenbankseitigen (erneuten) Parse-Prozess in DB2 eingefügt werden. Bei der in dieser Arbeit betrachteten Version 9 des DB2 gibt es diese Möglichkeit nicht. Aus der weiter oben angesprochenen strukturellen Ähnlichkeit zum Migrationsablauf resultieren auch enge Parallelen, was die Performance-Messungen betrifft. Abhängig von dem Zeichensatz in dem die neu einzufügenden Dokumente anwendungsseitig vorliegen, müssen entsprechende Konvertierungsschritte durchgeführt werden. Für den Fall, dass es sich dabei um eine Konvertierung von EBCDIC nach Unicode handelt, können für eine Neueinfügung die gleichen Gesamtkosten wie für den INSERT während der Migration von nicht-nativen XMLDokumenten ohne vorangehende Konkatenation angenommen werden. Hierzu wird auf die Ausführungen in Abschnitt 6.1 verwiesen. Die Betrachtung anderer möglicher UnicodeKonvertierungen (beispielsweise UTF-16 nach UTF-8, CP1252 nach UTF-8 und weitere) wird aus Umfangsgründen hier nicht durchgeführt. Sollten die neu einzufügenden Dokumente anwendungsseitig bereits im Zeichensatz UTF-8 vorliegen, dann entfällt der Konvertierungsaufwand komplett. Folglich ergeben sich für die INSERT-Performance dann ebenfalls die für den gesamten in Abschnitt 6.1 betrachteten Migrationsablauf aufgeführten Kosten vermindert um den Konvertierungsanteil aus Abschnitt 6.1.3. 91 6 Migration und Parsen Da sich die Ergebnisse für die betrachteten Fälle der Neueinfügungen komplett aus den Resultaten der vorherigen Abschnitte ableiten lassen, würden sich durch die Präsentation weiterer Messreihen keine neuen Erkenntnisse ergeben. Daher wird an dieser Stelle auf zusätzliche Messergebnisse und dazugehörige Diagramme verzichtet. 6.3 Pflege von User-Defined-XML-Indexen Das zentrale Instrument zum Tuning von selektiven SQL-Abfragen sind ganz generell Indexe. Diese erlauben es, durch eine Art Verzeigerung über separate Strukturen effizient auf zuvor indexierte Datensätze zuzugreifen. Neben „herkömmlichen“ Indexen bietet DB2 auch für XMLDaten spezielle Indexierungsmöglichkeiten. Dabei verwendet es verschiedene Indextypen, zu denen auch die vom Nutzer selbst definierbaren User-Defined-XML-Indexe zählen. Während eine detaillierte Betrachtung des XML-Indexierungskonzepts von DB2 später in Abschnitt 8.1.1 erfolgt, soll an dieser Stelle bereits ein anderer, daran angelehnter Sachverhalt diskutiert werden. Neben den erwähnten Effizienzgewinnen verursacht die Indexverwendung stets aber auch Defizite. Getreu dem Motto „nichts ist für umsonst“ ist mit jedem Index auch ein erhöhter Pflegeaufwand verbunden, sobald Manipulationen (beispielsweise INSERT, UPDATE oder DELETE) an indexierten Daten erfolgen. Sollte ein Index also keine Effizienzgewinne im Rahmen des kontextspezifischen Datenzugriffs (der anliegenden Workload also) bedingen, so ist er für die Gesamt-Performance eines Systems nur hinderlich. Die Erstellung von Indexen muss demzufolge gut überlegt sein. Die weitere Zielstellung im vorliegenden Abschnitt besteht darin, den angesprochenen Pflegeaufwand bei der Erstellung und Wartung von User-Defined-XML-Indexen im Rahmen des INSERTs von XML-Dokumenten zu quantifizieren. Dazu wird zwischen zwei Vorgehensweisen unterschieden. Die zuerst betrachtete Variante besteht in der automatisch parallel zur Datenmanipulation stattfindenden Indexpflege. Diese ist immer dann anzutreffen, wenn ein User-Defined-XML-Index bereits vor der erwähnten Manipulation besteht. Beispielsweise im Rahmen einer Migration oder bei einer anderen Form des MassendatenINSERTs macht aber auch die Betrachtung der nachträglichen Indexerstellung Sinn. Diese 92 6 Migration und Parsen zweite Variante dient der Ermittlung von Kennzahlen, die Aussage darüber geben, wie aufwändig es ist, eine Indexerstellung erst nachträglich auszuführen, um somit zum Beispiel während der angesprochenen Migration den parallelen Zusatzaufwand der Indexpflege einzusparen. Vorab ist allerdings bereits anzumerken, dass die nachträgliche Indexerstellung generell nur dann Sinn macht, wenn ein zu erstellender Index in größerem Umfang noch nicht zuvor besteht26. Damit ist gemeint, dass ein vorhandener User-Defined-XML-Index vor einer Massendatenverarbeitung nicht extra entfernt werden sollte, wenn er bereits eine größere Menge an Daten indexiert hat. Schließlich müssten diese am Ende unnötig neu indexiert werden, was ebenfalls einen hohen Aufwand nach sich ziehen würde. Die zu den verschiedenen Varianten untersuchten Tests sind stets mithilfe der Testdaten des Kriteriums der Größe und Anzahl (siehe Abschnitt 5.1.1) durchgeführt worden. Dies begründet sich zum einen durch ihren realitätsnahen und produktionsähnlichen Charakter. Zum anderen ermöglicht es die Verwendung dieser Daten auch, eine Aussage darüber zu gewinnen, inwieweit die Anzahl zu indexierender Knoten sich auf die Gesamt-Performance des Pflegeaufwands eines User-Defined-XML-Indexes niederschlägt. Schließlich unterliegen die Daten der einzelnen Merkmalsausprägungen hier einem gemeinsamen Schema (siehe Abschnitt 7.3.2), weshalb sich die verwendeten User-Defined-XML-Indexe für alle Ausprägungen auf die gleiche Weise definieren lassen. Zur Untersuchung des Pflegeaufwands von User-Defined-XML-Indexen sind für die weiter unten analysierten Messreihen insgesamt drei Indexe benutzt worden. Diese indexieren, bezogen auf das vereinfachte Modell der Daten aus Abschnitt 5.1.1 und Abbildung 7, jeweils die Werte der Attribute „id“, „posx“ und „posy“ der „textblock“-Elemente. Gemäß den obigen Bemerkungen zur Anzahl indexierter Knoten zeigt Abbildung 36, wie viele Knoten pro Merkmalsausprägung von jedem Index jeweils pro Dokument und insgesamt indexiert wurden beziehungsweise zu indexieren sind. Dabei lässt sich speziell bei der Merkmalsausprägung „200B x 500.000“ erkennen, dass hier für jeden Index stets null Knoten indexiert sind beziehungsweise indexiert werden müssen. Der Grund dafür liegt in der äußerst geringen Größe und dem damit verbundenen kaum vorhandenen Inhalt der zu jener Ausprägung gehörenden Testdaten. Diese enthalten bezogen auf das vereinfachte Datenmodell aus Abschnitt 5.1.1 keine „textblock“-Elemente und demnach auch keine zu indexierenden Knoten. 26 primär für den in Abschnitt 6.2 betrachteten Fall der Neueinfügung relevant 93 6 Migration und Parsen Index_id Merkmalsausprägung Index_posx Index_posy pro Dokument insgesamt pro Dokument insgesamt pro Dokument insgesamt 200B x 500.000 0 0 0 0 0 0 1K x 100.000 3 300.000 3 300.000 3 300.000 10K x 10.000 86 860.000 86 860.000 86 860.000 100K x 1.000 880 880.000 880 880.000 880 880.000 1M x 100 9.079 907.900 9.079 907.900 9.079 907.900 10M x 10 94.149 941.490 94.149 941.490 94.149 941.490 Abbildung 36: Anzahl indexierter Knoten je Index Damit die Ergebnisse der fortan betrachteten Messreihe mit denen des INSERTs ohne parallelen Aufwand zur Indexpflege verglichen werden können, orientiert sich der Ablauf zur Messdatenerhebung an dem aus Abschnitt 6.1.4 bekannten Vorgehen. Demzufolge kann auch die dort genutzte Messprozedur für die Messreihe zur automatischen Indexpflege wiederverwendet werden. Zuvor müssen lediglich die Indexe für jede, zu einer Merkmalsausprägung gehörende Tabelle erstellt worden sein. Abbildung 37 veranschaulicht27 die dazu nötigen Statements beispielhaft anhand der Ausprägung 100K. Nähere Details zur Syntax dieser SQL-Statements finden sich in Abschnitt 8.1.1. CREATE INDEX T24431A.IDX_ID_TXML_100K ON T24431A.TXML_100K(XML_DOC) GENERATE KEY USING XMLPATTERN '/seite/textblock/@id' AS SQL VARCHAR(20); CREATE INDEX T24431A.IDX_POSX_TXML_100K ON T24431A.TXML_100K(XML_DOC) GENERATE KEY USING XMLPATTERN '/seite/textblock/@posx' AS SQL DECFLOAT; CREATE INDEX T24431A.IDX_POSY_TXML_100K ON T24431A.TXML_100K(XML_DOC) GENERATE KEY USING XMLPATTERN '/seite/textblock/@posy' AS SQL DECFLOAT; Abbildung 37: Beispiel-Statements zur Indexerstellung 27 Die veranschaulichte Indexerstellung orientiert sich dabei ebenfalls an dem vereinfachten Datenmodell aus Abschnitt 5.1.1 und Abbildung 7. 94 6 Migration und Parsen Die Betrachtung der nachträglichen Indexerstellung orientiert sich dagegen direkt an der Laufzeit, die für die Statements zur Indexerstellung resultiert, wenn sie erst nach der angesprochenen Messprozedur ausgeführt werden. In Abhängigkeit zu den geschilderten Vorbetrachtungen erfolgt nun die Auswertung der einzelnen Messreihen. Die dazu benutzte Darstellungsform wurde so gewählt, dass sie die Kosten der Indexerstellung anhand ihres prozentualen Anteils gegenüber dem INSERT ohne sofortige Indexpflege ausweist. Letztere werden demnach als 100 Prozent angesehen. Abbildung 38 veranschaulicht die auf diese Weise berechneten Ergebnisse. Dabei beziehen sich alle Messreihen mit Ausnahme der letzten (hellblauen) Messreihe auf die Pflege von User-DefinedXML-Indexen während des INSERTs. Die letzte Messreihe stellt den Gesamtaufwand einer nachträglichen Erstellung aller drei Indexe dar. 800% Sekunden (in Prozent) 700% INSERT (bei 0 Indexen) 600% 500% INSERT (bei 1 Index) 400% INSERT (bei 2 Indexen) 300% 200% INSERT (bei 3 Indexen) 100% 0% 200B x 500.000 1K x 100.000 10K x 10.000 100K x 1.000 1M x 100 10M x 10 nachträgliche Erstellung aller 3 Indexe + Kosten für INSERT (bei 0 Indexen) Größe und Anzahl Abbildung 38: Messergebnis – Pflege von User-Defined-XML-Indexen – CPU-Zeit Anhand der Ergebnisse aus Abbildung 38 lassen sich mehrere Aussagen für den Pflegeaufwand von User-Defined-XML-Indexen ableiten. Zum einen fällt auf, dass die Dokumentgröße nur indirekt, bezogen auf die Anzahl an zu indexierenden Knoten, Einfluss auf die Performance der Indexpflege hat. Dahingehend bleibt die CPU-Zeit für die Merkmalsausprägungen „10K x 10.000“ bis „10M x 10“ genau wie auch die dazugehörige Anzahl an zu indexierenden Knoten (siehe Abbildung 36) nahezu konstant. Ebenso fällt der Aufwand für die Indexerstellung bei den Merkmalsausprägungen links von „10K x 10.000“ auch entsprechend der hier weniger zu indexierenden Knoten geringer aus. Weiterhin lässt sich anhand der Messergebnisse auch erkennen, dass die CPU-Zeit erwartungsgemäß hinsichtlich der Anzahl an zu pflegenden User-Defined-XML-Indexen skaliert und pro 95 6 Migration und Parsen Index ungefähr gleichermaßen zunimmt. Hier ist aber anzufügen, dass die automatische Indexpflege im XML-Kontext insgesamt sehr aufwändig ist. Schließlich entsteht beispielsweise bei den hier durchgeführten Messreihen ein Zusatzaufwand von 600 Prozent. In diesem Zusammenhang soll deshalb nochmals auf die weiter oben erwähnten Anmerkungen verwiesen werden, dass ein Index nur dann erstellt und gepflegt werden sollte, wenn er auch PerformanceVorteile bezüglich des Datenzugriffs mit sich bringt. Zuletzt soll noch auf den Vergleich der beiden untersuchten Varianten zur Indexpflege eingegangen werden. Hier stellt sich die nachträgliche Indexerstellung eindeutig als effizienter heraus. In Relation zu der parallelen Indexpflege beim INSERT ist diese Variante fast drei mal schneller. Sofern also gemäß der weiter oben angefügten Bemerkung sinnvollerweise die Möglichkeit besteht, einen Index erst nachträglich zu erstellen, ist es aus PerformancePerspektive ratsam, diese Variante der parallelen Indexpflege beim INSERT vorzuziehen. Aufgrund der im nächsten Abschnitt aufgezeigten Analogie des INSERTs zum UPDATE lässt sich selbige Aussage auch auf diese Form der Datenmanipulation übertragen. 6.4 Exkurs: UPDATE von XML-Dokumenten Neben dem zuvor betrachteten INSERT von XML-Daten bildet der Prozess des XML-Parsens ebenfalls einen zentralen Teil bei dem UPDATE der Daten. In diesem Zusammenhang ermöglicht es DB2, XML-Daten auf die gleiche Weise abzuändern wie auch beispielsweise LOB-Daten. Das heißt, sobald ein UPDATE erfolgt, wird der alte Wert eines Tupels vollständig durch den geänderten neuen Wert, wie eine Art DELETE mit anschließendem INSERT, überschrieben28. Für die Verarbeitung von XML-Dokumenten ergeben sich aber aufgrund ihres (semi-)strukturierten Aufbaus Anforderungen, die über diesen Mechanismus hinausgehen. Demnach sollte es möglich sein, einzelne Teile eines XML-Dokuments gezielt ändern zu können, ohne dazu das gesamte Dokument überschreiben zu müssen. Diese Forderung wird nachfolgend „in-document“-UPDATE genannt und soll weiterhin anhand eines einfachen Beispiels begründet werden. 28 Genau genommen schreibt DB2 den neuen Wert eines LOB-Dokuments in einen anderen Speicherbe- reich, sodass der Bereich des alten Werts zum Zeitpunkt des UPDATEs „nur“ deallokiert wird. 96 6 Migration und Parsen Dazu sei angenommen, dass die in Abschnitt 5.1.1 beschriebenen Datensätze einen Fehler enthalten. Beispielweise möge die OCR-Software bei der Erkennung der einzelnen Dokumente fälschlicherweise dem letzten Textblock ein falsches „id“-Attribut zugeordnet haben. Eine nachträgliche Prüfung deckt diesen Fehler auf und leitet dessen Behebung ein. Dazu verwendet es die oben beschriebene herkömmliche UPDATE-Funktionalität. Alle Dokumente, die von dem Fehler betroffen sind, müssen also geeignet korrigiert und anschließend komplett überschrieben werden. Der daraus resultierende Aufwand steht besonders für die großen Dokumente (1M oder 10M) in einem unangemessenen Verhältnis zur durchgeführten Änderung des „kleinen“ Attributwerts. Unter Umständen wäre hier anstatt des kompletten Ersetzens eine Änderung im Promillebereich ausreichend. Obwohl sich der Fehler pro Dokument nur bei einem einzigen Attribut zeigte, müsste stets der mit hohem Aufwand verbundene UPDATE des gesamten Dokuments29 ausgeführt werden. Nun sei weiterhin angenommen, dass datenbankseitig eine Funktionalität, wie sie zuvor als „in-document“-UPDATE bezeichnet wurde, vorhanden ist. Mit deren Hilfe wäre es in dem beschriebenen Beispielfall möglich, die fehlerhaften Attributwerte gezielt zu korrigieren, ohne dass dazu jeweils die kompletten XML-Dokumente überschrieben werden müssen. Der Aufwand der aus diesem Vorgehen resultiert, wäre, verglichen mit der oben beschriebenen Verfahrensweise, verschwindend gering. Abbildung 39 stellt die geschilderten Abläufe grafisch gegenüber. „in-document“UPDATE UPDATE XMLDokument (fehlerhaft) XML Korrektur (UPDATE) XML XMLDokument (korrigiert) XML XMLDokument (fehlerhaft) Korrektur („in-document“UPDATE) XML 1 Attributwert XMLDokument (korrigiert) XML Abbildung 39: Beispiel zum Vergleich von UPDATE und „in-document“-UPDATE 29 Davon wären eventuell vorhandene User-Defined-XML-Indexe ebenfalls betroffen. 97 6 Migration und Parsen Zu dem diskutierten Beispiel soll noch angemerkt sein, dass ein „in-document“-UPDATE von XML-Dokumenten nicht nur im Rahmen von Fehlerbehandlungen Sinn macht. Änderungen zählen in XML-Dokumenten genauso zum Tagesgeschäft, wie dies auch in der herkömmlichen relationalen Welt der Fall ist. Unter anderem ändern Personen ihre Anschrift oder die DATEV die Gehälter ihrer Mitarbeiter. Sollten diese Daten in Form von XML-Dokumenten gespeichert sein, besteht beispielsweise konkreter Bedarf nach einer Funktionalität des „in-document“UPDATEs. DB2 Version 9 bietet zur Umsetzung der zuletzt genannten Funktionalität leider keine Unterstützung, dafür allerdings dessen Nachfolgeversion 10. Hier existiert eine skalare Funktion namens XMLMODIFY [IBM11s], mit der es möglich ist, gezielte Änderungen innerhalb von XML-Dokumenten durchzuführen. Auf nähere Details zu dieser Funktion soll, da sie wie erwähnt erst in Version 10 von DB2 verfügbar ist, an dieser Stelle verzichtet werden. Hierzu finden sich in [IBM11s] weiterführende Informationen. Zuletzt sei noch auf die bereits in Abschnitt 4.1 erwähnten Messergebnisse von IBM zum UPDATE von XML-Dokumenten [IBM07] in DB2 Version 9 hingewiesen. Dort zeigt sich entgegen der oben geführten kritischen Betrachtung, dass der UPDATE von XML-Dokumenten dennoch etwas effizienter ist, als die gemeinsame Ausführung eines DELETEs mit anschließendem INSERT der gleichen Daten. 98 7 XML-Schema-Management 7 XML-Schema-Management Genau wie im relationalen Kontext ist die Datenmodellierung auch eine wesentliche Aufgabe im Umgang mit XML-Daten. Hierzu haben sich im Laufe der Zeit verschiedene Möglichkeiten entwickelt, von denen bereits die DTD [W3C06b, W3C08] und das XML-Schema [W3C04a, W3C04b, W3C04c] in Abschnitt 3.1 Erwähnung fanden. Darüber hinaus existieren noch weitere so genannte Schemasprachen wie beispielsweise RELAX NG [Van03] oder auch Schematron [ISO06]. Vom W3C-Consortium empfohlen und am weitesten verbreitet von den genannten Schemasprachen ist das XML-Schema. Dieses lässt sich anhand der folgenden Eigenschaften [NK09] charakterisieren. Variabel (bezogen auf den Grad der Modellierung) Zwar unterliegt der Aufbau eines XML-Schemas verschiedenen Regeln [W3C04a], diese erlauben es aber, unterschiedlich „harte“ XML-Schemas zu definieren. Daher kann ein XML-Schema zum einen so gestaltet sein, dass es sehr flexible Dokumente erlaubt. Auf der anderen Seite ist es aber auch möglich, diese Flexibilität beliebig weit einzuschränken. Jene Eigenschaft wird im Rahmen der XML-Spezifikation auch als Semi-Strukturiertheit bezeichnet. Optional Zu einem XML-Dokument muss kein XML-Schema vorhanden sein. Dementsprechend kann ein solches Dokument auch ohne die Definition eines zugehörigen Schemas gültig sein. In Abschnitt 3.1 ist bereits darauf verwiesen worden, dass in jenem Fall ein wohlgeformtes XML-Dokument automatisch auch gültig ist. Dokument-intern Ein XML-Schema ist stets auf die interne Beschreibung von Dokumenten ausgerichtet. Mithilfe dieses Konzepts lassen sich daher keine Dokumentübergreifenden Integritäten definieren. 99 7 XML-Schema-Management Das Management von XML-Schemas bildet zusammen mit dem dazugehörigen Prozess der Schemavalidierung den Kern der in diesem Kapitel folgenden Ausführungen. Dabei ist es nicht die Zielstellung, das Konzept selbst ausführlich zu beschreiben. Vielmehr sollen dessen Möglichkeiten anhand der sicherzustellenden Integrität der Daten aufgezeigt werden (siehe Abschnitt 7.1). Nach diesen Ausführungen folgt in Abschnitt 7.2 eine Auflistung von Anforderungen, die an das XML-Schema-Management und speziell an den Aspekt der XML-Schemavalidierung gestellt sind. Diese werden in Abschnitt 7.3 aufgegriffen und im speziellen Kontext von DB2 betrachtet. Hier soll vor allem im Vordergrund stehen, in welchem Ausmaß und in welcher Qualität die Anforderungen in DB2 bereits umgesetzt beziehungsweise noch umzusetzen sind. Abschließend werden in Abschnitt 7.4 die weiteren eingangs erwähnten Konzepte DTD, Schematron und Relax NG beschrieben, wobei die Betrachtung speziell auf deren Besonderheiten gegenüber dem XML-Schema-Konzept ausgerichtet ist. 7.1 Integrität der Daten Unter der Integrität von Daten versteht sich deren semantische Korrektheit. Sofern diese gegeben ist, werden Daten auch als konsistent bezeichnet. Die Begrifflichkeiten Integrität und Konsistenz stehen somit eng zueinander in Beziehung. Um die Integrität von Daten zu gewährleisten, lassen sich in Datenbankmanagementsystemen Integritätsbedingungen definieren. Je nach System ist es möglich, mit deren Hilfe einheitliche Wertebereiche, Eindeutigkeiten oder auch Fremdschlüsselbeziehungen und „mehr“ festzulegen. In Bezug auf die Integrität von XMLDokumenten ist noch die Sicherstellung einer einheitlichen Dokumentstruktur anzufügen. Während die einzelnen Integritätsbedingungen im relationalen Kontext im Wesentlichen durch Constraints [IBM11a] hergestellt werden, lässt sich dies für XML-Dokumente mithilfe der XML-Schemas realisieren. Deren Möglichkeiten sollen in den weiteren Abschnitten anhand der genannten Integritäten aufgezeigt werden. [HR01] 100 7 XML-Schema-Management 7.1.1 Dokumentstruktur Jedes XML-Dokument setzt sich aus verschiedenen, hierarchisch miteinander verknüpften Knoten zusammen (siehe Abschnitt 3.1). Dabei bestehen vielfältigste Möglichkeiten hinsichtlich der Anordnung oder auch Benennung der einzelnen Knoten. Diese Flexibilität kann mithilfe von XML-Schemas bewusst eingeschränkt und eine einheitliche Dokumentstruktur sichergestellt werden. Dahingehend lassen sich beispielsweise die folgenden Vorgaben definieren [NK09]. Zulässige Elemente und Attribute (sowie deren Verknüpfung miteinander) Zwingendes oder optionales Vorhandensein von Elementen und Attributen Minimales und maximales Vorkommen von Elementen und Attributen Exklusive Auswahl aus verschiedenen Elementen Ein XML-Schema-Dokument ist selbst stets auch ein wohlgeformtes XML-Dokument. Demzufolge lässt sich anhand des Schemas bereits auf einfache Art und Weise die Struktur der zugeordneten Dokumente erkennen beziehungsweise auf umgekehrte Weise anhand der Dokumente ein gemeinsames XML-Schema ableiten. Hierbei ist jedoch zu beachten, dass es verschiedene Strukturmuster gibt, an die der Aufbau eines XML-Schemas angelehnt sein kann. Dazu zählen beispielsweise der „Russian Doll“- oder der „Salami Slice“-Stil. Für nähere Details dazu und weitere Muster wird auf [HS04] verwiesen. An dieser Stelle sollen anhand eines beispielhaften XML-Schemas einzelne, die Dokumentstruktur bestimmende Bestandteile des Schema-Konzepts aufgezeigt werden. Dazu zeigt Abbildung 40 ein XML-Schema für das Beispieldokument aus Abbildung 7. 101 7 XML-Schema-Management <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="seite"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="textblock"> <xs:complexType> <xs:attribute name="id" type="xs:string" /> <xs:attribute name="posx" type="xs:int" /> <xs:attribute name="posy" type="xs:int" /> <xs:attribute name="schriftart" type="xs:string" /> <xs:attribute name="schriftgroesse" type="xs:int" /> ... </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="id" type="xs:string" /> </xs:complexType> </xs:element> </xs:schema> Abbildung 40: Beispiel für ein XML-Schema Abgesehen von der optionalen XML-Deklaration in der ersten Zeile werden sämtliche Deklarationen eines XML-Schemas innerhalb eines gleichnamigen „schema“-Elements beschrieben. Dieses kann verschiedene Attribute besitzen, die allgemeine Informationen zum XML-Schema in sich tragen. In dem obigen Beispiel ist nur die zwingend notwendige Angabe des XMLSchema-Namespaces angeführt. Erst durch deren Verwendung lässt sich ein XML-Schema von einem „normalen“ XML-Dokument unterscheiden. Innerhalb des „schema“-Elements findet die eigentliche Beschreibung des XML-Schemas ihren Platz. Das oben dargestellte Beispiel enthält dabei die im Folgenden beschriebenen Elemente. „complexType“ (<xs:complexType>) Mithilfe eines „complexType“-Elements lässt sich ein neuer komplexer Datentyp deklarieren. Dieser ergibt sich durch die Verknüpfung von weiteren Knotentypen – beispielsweise Elementen oder Attributen. Soll ein solcher Datentyp mehrfach in einem Schema-Dokument30 verwendet werden, macht es Sinn, diesen separat im Dokument mit einem Namensattribut zu deklarieren. Über 30 Schema-Dokument-übergreifende Wiederverwendung ist durch Einbinden (include [W3C04a]) oder Importieren (import [W3C04a]) von XML-Schemas ebenfalls möglich 102 7 XML-Schema-Management den Namen lässt er sich dann anschließend wie ein herkömmlicher Datentyp einem beliebigen Element zuordnen. „sequence“ (<xs:sequence>) Ein „sequence“-Element leitet eine Sequenz von mehrfach aufeinander folgenden Elementen ein. Dabei lässt sich deren minimales beziehungsweise maximales Vorhandensein im XML-Dokument mittels der Attribute „minOccurs“ und „maxOccurs“ festlegen. Dies ist beispielsweise für das im nächsten Punkt betrachtete „element“-Element der Fall. „element“ (<xs:element maxOccurs="unbounded" name="textblock">) Die Angabe eines „element“-Elements setzt für die dem Schema zugeordneten XML-Dokumente voraus, dass diese an der jeweiligen Stelle ein Element mit dem entsprechenden Namen – in unserem Fall „textblock“ – besitzen. Das hier zusätzlich definierte Attribut „maxOccurs“ bezieht sich auf die oben beschriebene Sequenz und regelt das maximale Vorhandensein des Elements im XML-Dokument. „attribute“ (<xs:attribute name="id" type="xs:string" />) Ähnlich zu dem „element“-Element beschreibt ein „attribut“-Element das notwendige Vorhandensein eines Attributs an einer bestimmten Stelle in den XML-Dokumenten, die dem XML-Schema zugeordnet sind. Dieses Attribut definiert sich anhand des Namensattributs – in unserem Fall „id“. Die „type“Angabe legt den Datentyp fest, dem das Attribut entsprechen muss (siehe Abschnitt 7.1.2). Weitere Elemente des XML-Schema-Konzepts werden anhand der anderen Integritäten in den nachfolgenden Abschnitten beschrieben. 7.1.2 Werteintegrität Als Werteintegrität wird die Einhaltung von definierten Wertebereichen verstanden. Sie lässt sich bei dem XML-Schema-Konzept durch die Verwendung verschiedenster Datentypen gewährleisten. Diese können sowohl zur Definition von Attributwerten als auch für die 103 7 XML-Schema-Management Festlegung von Werten einfacher Elemente31 genutzt werden. Im Detail wird dabei zwischen insgesamt 44 verschiedenen vordefinierten Datentypen unterschieden (siehe Abbildung 41), von denen wiederum 19 als primitive Typen bezeichnet werden. Letztere sind Datentypen, die nicht aus anderen Typen definiert werden. Die restlichen Datentypen (abgeleiteter und komplexer Datentyp) ergeben sich demzufolge aus den bereits bestehenden Typen. Abbildung 41: Vordefinierte Datentypen bei dem XML-Schema-Konzept [W3C04c] 31 Einfache Elemente sind Elemente, die lediglich einen Textknoten enthalten [W3S11a]. 104 7 XML-Schema-Management Die Bildung der abgeleiteten Datentypen basiert auf dem gleichen Prinzip, wie auch vom Modellierer selbst simple Datentypen definiert werden können. Hierzu sieht die XML-SchemaSpezifikation die Möglichkeiten der Einschränkung (mittels des Elements „restriction“) und die der Auflistung (mittels des Elements „list“ oder „union“) bereits bestehender Datentypen vor. Nähere Informationen dazu finden sich in [W3C04c] oder in zusammengefasster Form in [WK03]. Weiterhin lassen sich aber auch komplexe Datentypen definieren, die sich als eine Art Objekt aus verschiedenen anderen Knotenstrukturen zusammensetzen. Dazu findet sich in Abschnitt 7.1.1 ein Beispiel. Für detailliertere Ausführungen wird erneut auf [W3C04c] und [WK03] verwiesen. 7.1.3 Entitätsintegrität Im Relationenmodell werden Constraints (UNIQUE- oder Primärschlüssel-Constraints) zur Sicherstellung der Eindeutigkeit jeder Zeile verwendet. Übertragen auf den XML-Kontext und speziell auf das Konzept der XML-Schemas existieren auch hier Mechanismen zur Definition von Eindeutigkeiten und Primärschlüsseln. Dazu stehen die speziellen Elemente „unique“ (Eindeutigkeit) und „key“ (Primärschlüssel) zur Verfügung, die im Folgenden näher beschrieben werden. Auf das ebenfalls zu diesen Mechanismen in Verbindung stehende Element „keyref“ (Fremdschlüsselverweis) wird in Abschnitt 7.1.4 näher eingegangen. Mithilfe des „unique“-Elements lässt sich die Eindeutigkeit – Duplikatfreiheit – von Daten in XML-Dokumenten gewährleisten. Dabei bietet es den Vorteil, sowohl kontextsensitive als auch kombinierte Eindeutigkeiten definieren zu können. Zu deren Spezifikation werden die (Kind-) Elemente „selector“ und „field“ verwendet, welche per XPath-Pfadausdruck (siehe Abschnitt 3.1.3) zu speziellen Dokumentteilen hinführen. Auf diese Weise bestimmt das Element „selector“ den Kontext, in dem die Eindeutigkeit zu gewährleisten ist. Gleichsam spezifiziert auch das Element „field“, welche Attribute oder Kindelemente innerhalb des Kontext-Elements eindeutig sein sollen. [Pag04b] Abbildung 42 zeigt ein Beispiel für die Verwendung des „unique“-Elements. Hier wird unter dem Namen „Textblock-ID“ die Eindeutigkeit der „id“ für alle „textblock“-Elemente innerhalb 105 7 XML-Schema-Management eines gemeinsamen Elternknotens sichergestellt. Dabei bezieht sich der dargestellte SchemaAusschnitt auf das in Abbildung 7 gezeigte Beispieldokument zum Kriterium der Größe und Anzahl. <xs:unique name="Textblock-ID"> <xs:selector xpath=".//textblock"/> <xs:field xpath="@id"/> </xs:unique> Abbildung 42: Anwendungsbeispiel für das „unique“-Element An dieser Stelle soll noch auf zwei weitere Aspekte hingewiesen werden. Einerseits ist jedes „unique“-Element mit einem eindeutigen Namensattribut zu versehen. Zum anderen muss sich die Angabe des „unique“-Elements stets am Ende desjenigen Elements befinden, in dessen „complexType“-Deklaration auch die weiteren als eindeutig zu definierenden Elemente enthalten sind. Diese beiden Bemerkungen gelten auch für die nachfolgend betrachtete Schlüsseldefinition per „key“-Element. Das „key“-Element, das zur eindeutigen Identifizierung von Elementen dient, ähnelt dem „unique“-Element aber nicht nur in den zuletzt betrachteten Aspekten. Prinzipiell ist die Konzeption beider Elemente nahezu identisch. Dementsprechend sieht auch das „key“-Element die mit der gleichen Bedeutung verbundene Definition der (Kind-)Elemente „selector“ und „field“ vor. Der einzige Unterschied zwischen den Elementen „key“ und „unique“ liegt in deren Verarbeitung durch den XML-Parser. Im Fall eines „unique“-Elements prüft er lediglich die Eindeutigkeit der auf diese Weise deklarierten Daten. Bei der Verwendung des „key“-Elements behält sich der Parser noch zusätzliche Information vor, die er für einen späteren Abgleich mit den „keyref“-Elementen benötigt (siehe Abschnitt 7.1.4). Demzufolge zeigt sich für die beispielhafte Schlüsseldeklaration in Abbildung 43 kaum ein Unterschied zu der Eindeutigkeitsdeklaration in Abbildung 42. <xs:key name="Textblock-ID"> <xs:selector xpath=".//textblock"/> <xs:field xpath="@id"/> </xs:key> Abbildung 43: Anwendungsbeispiel für das „key“-Element 106 7 XML-Schema-Management 7.1.4 Referentielle Integrität Eine weitere Integrität ist die Referentielle Integrität. Diese dient der Gewährleistung der datenbankseitigen Abbildung von zueinander in Beziehung stehenden Entitäten. Ähnlich wie zur Sicherung der Entitätsintegrität (siehe Abschnitt 7.1.3) werden dazu im relationalen Kontext (Fremdschlüssel-)Constraints verwendet. Diese ermöglichen es, tabelleninterne oder tabellenübergreifende Beziehungen zwischen einzelnen Spalten zu definieren. Übertragen auf die Verarbeitung von XML-Dokumenten ist dies mithilfe des XML-Schema-Konzepts nur in eingeschränkter Form möglich. Hier ist die Verwendung des bereits in Abschnitt 7.1.3 erwähnten „keyref“-Elements vorgesehen, das im Folgenden näher beschrieben wird. Auf die angesprochene Beschränkung wird weiter unten eingegangen. Das „keyref“-Element besitzt eine große Ähnlichkeit mit den in Abschnitt 7.1.3 beschriebenen „unique“- und „key“-Elementen. So umfasst es ebenfalls ein Namensattribut und die (Kind-) Elemente „selector“ und „field“. Letztere bestimmen zum einen den Kontext und zum anderen die Kombination der mit dem referenzierten Schlüssel abzugleichenden Daten. Der Unterschied zu den beiden zuvor betrachteten Elementen liegt daher ausschließlich in dem zusätzlichen Attribut „refer“ des „keyref“-Elements. Dieses verweist auf den Namen des referenzierten, per „key“-Element definierten Schlüssels. Abbildung 44 zeigt die Deklaration eines „keyref“-Elements in Anlehnung an die Darstellungen aus Abschnitt 7.1.3. In diesem Zusammenhang wäre es beispielsweise denkbar, dass ein Textblock, wie eventuell eine Kopfzeile, auf allen Seiten identisch ist. So könnte sich auf den Folgeseiten an Stelle des mehrmaligen vollständigen Kopfzeilen-Textblocks auch ein Verweis auf den entsprechenden Block der ersten Seite finden. <xs:key name="Textblock-REFID" refer="Textblock-ID"> <xs:selector xpath=".//textblock_wiederholung"/> <xs:field xpath="@id"/> </xs:key> Abbildung 44: Anwendungsbeispiel für das „keyref“-Element Obwohl es den Anschein erweckt, dass das „keyref“-Element des XML-Schema-Konzepts eine ähnliche Mächtigkeit besitzt, wie die Fremdschlüssel-Constraints im relationalen Kontext, ist dies nicht zutreffend. Wie bereits eingangs in Kapitel 7 erwähnt, lassen sich aufgrund der 107 7 XML-Schema-Management Charakteristika des XML-Schema-Konzepts keine dokumentübergreifenden Integritäten definieren. Demzufolge können auch mithilfe der hier beschriebenen „keyref“-Elemente nur Verweise innerhalb eines XML-Dokuments hergestellt werden. Sämtliche Daten in einem XML-Dokument zu speichern ist aber aus praktischer Sicht undenkbar. Daher eignet sich das Konzept der XML-Schemas nur ansatzweise zur Modellierung von Beziehungen zwischen den Daten. An dieser Stelle sei aber darauf hingewiesen, dass das XML-Format ursprünglich „nur“ als Datenaustauschformat und demnach nicht zur Umsetzung von datenbankseitigen Spezifika konzipiert wurde. Aufgrund der beschriebenen Einschränkung für die XML-Schema-basierte Sicherstellung der Referentiellen Integrität haben sich im Laufe der Zeit verschiedene andere „Verlinkungstechniken“ entwickelt. Dazu zählen beispielsweise die Konzepte XLink [W3C10], XInclude [W3C06a] oder XPointer [W3C02], die anhand ihrer Besonderheiten in [Joc06] zusammengefasst sind. Da DB2 über die Möglichkeiten des XML-Schema-Konzepts hinaus keine Unterstützung bezüglich Referentieller Integrität bietet, sollen die zuvor genannten Konzepte in dieser Arbeit nicht näher vorgestellt werden. Es bleibt aber anzumerken, dass IBM die Herausforderung einer umfangreichen Unterstützung der Referentiellen Integrität für XML-Daten erkannt hat und diese in zukünftigen Versionen von DB2 weiter ausbauen will. 7.2 Anforderungen an das XML-Schema-Management Das XML-Schema-Konzept ist so gestaltet, dass es die im vorangehenden Abschnitt beschriebenen Datenintegritäten durch die Validierung von XML-Dokumenten gegen bestimmte XML-Schemas gewährleistet. Aus dieser Tatsache heraus ergeben sich bestimmte Anforderungen, die an das XML-Schema-Management und speziell an den Aspekt der Schemavalidierung gestellt und in den weiteren Abschnitten näher beschrieben werden. 108 7 XML-Schema-Management 7.2.1 Verknüpfung von XML-Dokument und XML-Schema In der rein relationalen Welt wird pro Tabelle stets ein eigenes Tabellenschema definiert32. Übertragen auf die Verarbeitung von XML-Dokumenten gestaltet sich die Zuordnung ähnlich. Hier wird ein XML-Schema für eine gemeinsame Art von XML-Dokumenten festgelegt. Dementsprechend sind alle einem Schema zugeordneten Dokumente erst dann gültig, wenn sie sich erfolgreich gegen dieses validieren lassen. Dabei wäre es aber auch denkbar, Dokumente gegen verschiedene XML-Schemas auf Gültigkeit zu prüfen33. Dieser Fall wird für die weiteren Betrachtungen allerdings außer Acht gelassen. Im Folgenden wird daher von einer (0,1 : 0,n)Beziehung zwischen XML-Schema und XML-Dokument ausgegangen, die sich auch aufgrund der Optionalität der XML-Schemas ergibt. Eine Anforderung an das XML-Schema-Management ist es daher, die oben beschriebene Zuordnung von XML-Dokumenten zu ihrem XML-Schema datenbankseitig zu erfassen. Dabei ist es im Kontext der weiteren Betrachtungen eher unwichtig, ermitteln zu können, welche XML-Dokumente zu einem gemeinsamen XML-Schema gehören. Vielmehr muss es auf diesem Weg möglich sein, Auskunft darüber zu erhalten, zu welchem XML-Schema ein bestimmtes XML-Dokument gehört beziehungsweise gegen welches Schema ein XML-Dokument validiert wurde oder validiert werden soll. Abbildung 45 visualisiert durch gerichtete Kanten, wie diese Verknüpfung datenbankseitig zu realisieren ist. XMLDokumente XMLSchemas Abbildung 45: Verknüpfung von XML-Dokument und XML-Schema 32 33 In objektrelationalen Systemen wird durch entsprechende Erweiterungen zum Teil davon abgewichen. verschiedene Szenarien denkbar: beispielsweise XML-Dokument genügt mindestens einem XML- Schema oder gleichzeitig mehreren XML-Schemas 109 7 XML-Schema-Management 7.2.2 Transparenz zur Anwendung Um die Integrität der Daten im Datenbankmanagementsystem zu gewährleisten, ist die Validierung der XML-Dokumente gegen zuvor definierte XML-Schemas unabdingbar. Dabei ist es jedoch wichtig, dass diese möglichst transparent zur Anwendung stattfindet. Dementsprechend muss zum einen die Verknüpfung von XML-Dokumenten und XML-Schemas datenbankseitig vermerkt sein (siehe Abschnitt 7.2.1). Zum anderen sind aber auch Automatismen nötig, die parallel zu einem herkömmlichen INSERT beziehungsweise UPDATE von XML-Dokumenten automatisch deren Validierung anstoßen, ohne dass damit eine Änderung in der Anwendung verbunden ist. Infolgedessen muss mithilfe datenbankseitiger Mechanismen sichergestellt werden, dass beispielsweise während des INSERTs von XML-Dokumenten transparent deren Gültigkeit bezogen auf ein XML-Schema validiert wird (siehe Abbildung 46). INSERT XMLDokument Validierung XMLSchema Tabelle Abbildung 46: Transparente Schemavalidierung In Zusammenhang mit der oben beschriebenen Transparenz ist aber zu vermerken, dass eine automatische Schemavalidierung immer zusätzliche Kosten bezogen auf die Laufzeit verursachen wird. Dies ist zwar nicht außergewöhnlich, da bereits im relationalen Kontext jede Integritätssicherung mit einem erhöhten Prüfaufwand verbunden ist. Für die Schemavalidierung von XML-Dokumenten ist dieser Aufwand verglichen mit der „nicht-validierenden“ Verarbeitung allerdings verhältnismäßig hoch (siehe Abschnitt 7.3.2). Dementsprechend muss auch eine Möglichkeit vorgesehen sein, die vorhandenen Automatismen bei Performance-Engpässen wieder deaktivieren zu können. 110 7 XML-Schema-Management 7.2.3 Umgang mit ungültigen XML-Dokumenten Eine wichtige Fragestellung besteht darin zu klären, wie mit ungültigen XML-Dokumenten umzugehen ist. Damit sind Dokumente gemeint, die sich nicht erfolgreich gegen das ihnen zugeordnete XML-Schema validieren lassen. Eine Lösung wäre natürlich, ungültige Dokumente im Rahmen einer Datenmodifikation (INSERT oder UPDATE) einfach mit einem Fehler (negativer SQLCODE) zurückzuweisen (siehe Abbildung 47 – linker Teil). Hier lässt sich aber keine generelle Vorgehensweise fixieren. Schließlich hat es unter Umständen durchaus Vorteile, auch ungültige XML-Dokumente mit einem speziellen Vermerk (siehe Abbildung 47 – rechter Teil) datenbankseitig zu speichern. Auf diese Weise könnten nachträglich noch die „Fehler“ innerhalb der XML-Dokumente analysiert und korrigiert werden, sodass die darin gespeicherten Informationen nicht durch das weiter oben beschriebene Abweisen der Dokumente (vorerst) verloren gehen. Eventuell liegt der Fehler ja auch im zu restriktiven XML-Schema und nicht in den Dokumenten. Gemäß diesen Überlegungen muss das Datenbankmanagementsystem in der Lage sein, verschiedene Verfahrensweisen anzubieten, die den Umgang mit ungültigen XMLDokumenten regeln. Abbildung 47 veranschaulicht die diskutierten Varianten am Beispiel eines INSERTs. Dokument mit Vermerk versehen Dokument zurückweisen INSERT XMLDokument INSERT XMLDokument SQLCODE Validierung (nicht erfolgreich) XMLSchema Validierung (nicht erfolgreich) XMLSchema XML Tabelle Tabelle SQLCODE ≙ Fehler ≙ spezieller „Ungültigkeitsvermerk“ Abbildung 47: Alternativer Umgang mit ungültigen XML-Dokumenten 111 7 XML-Schema-Management 7.2.4 Auskunft über Gültigkeit von XML-Dokumenten Unter Einbeziehung der Überlegungen aus dem vorangehenden Abschnitt 7.2.3 ergeben sich insgesamt die drei Zustände gültig, ungültig und nicht validiert, in denen sich ein XML-Dokument (datenbankseitig) befinden kann. Von diesen ist bislang nur der Zustand „nicht validiert“ noch nicht näher betrachtet worden. In ihm befinden sich alle XML-Dokumente, die noch nicht gegen ein XML-Schema validiert worden sind. Dies kann verschiedene Gründe haben. Entweder die XML-Dokumente besitzen kein ihnen zugeordnetes XML-Schema oder es handelt sich um jene Dokumente, die ohne die (automatische) Validierung gegen das ihnen zugeordnete Schema in die Datenbank eingefügt worden sind. Unabhängig von dem jeweiligen Zustand eines XML-Dokuments muss es möglich sein, diesen auf einfache Weise von dem Datenbankmanagementsystem zu erfahren. Die Gründe dafür sind vielfältig. Besonders wichtig ist es in diesem Zusammenhang, sicherstellen zu können, dass alle XML-Dokumente erfolgreich gegen das ihnen zugeordnete Schema validiert worden sind und sich keine Dokumente mehr im Zustand „nicht validiert“ befinden. Sofern ungültige Dokumente mit in der Datenbank gespeichert sind, müssen auch diese zwingend in irgendeiner Art kenntlich gemacht werden, da sie sonst nicht von den anderen Dokumenten zu unterscheiden wären. Abbildung 48 zeigt beispielhaft eine solche Klassifikation von XML-Dokumenten. ✓ ✓ ✓ XML XML XML ✓ XML ✓ gültig ungültig XML XML XML ✓ ✓ XML ✓ XML XML nicht validiert ✓ XML XML XML ✓ XML XML Abbildung 48: Auskunft über Gültigkeit von XML-Dokumente 112 7 XML-Schema-Management 7.2.5 Nachträgliche Schemavalidierung Aus dem betrachteten Zustand „nicht validiert“ lässt sich bereits schließen, dass es datenbankseitig eine Möglichkeit geben muss, XML-Dokumente nachträglich gegen ein XML-Schema zu validieren. Die Gründe dafür sind bereits in den vorangehenden Abschnitten aufgezeigt worden. Der noch folgende Abschnitt 7.2.6 wird eine weitere Notwendigkeit für die Möglichkeit zur nachträglichen Validierung liefern. An dieser Stelle sollen sich die Ausführungen daher auf die folgende zusammenfassende Auflistung der angesprochenen Gründe beschränken. Performance-Engpässe bei einer automatischen Schemavalidierung Ungültige XML-Dokumente müssen (nach Änderung) erneut validiert werden Notwendige Validierung von bislang noch nicht validierten XML-Dokumenten Schemaevolution34 benötigt eine Möglichkeit zum „Nachvalidieren“ 7.2.6 Unterstützung bei Schemaevolution und nachträgliche Validierung Genau wie im relationalen Kontext nachträgliche Änderungen am Tabellenschema zum Tagesgeschäft gehören, lassen sich auch XML-Schemas auf einfache Art und Weise an ein geändertes Datenmodell anpassen. Dahingehende Möglichkeiten zur Modifizierung von bestehenden XML-Schemas sollen in dieser Arbeit nicht näher betrachtet werden. Problematischer ist hier die Frage, wie mit XML-Dokumenten umgegangen werden soll, die bereits gegen das Original eines abzuändernden XML-Schemas validiert worden sind. Das sofortige „Nachvalidieren“ dieser Dokumente gegen das modifizierte XML-Schema ist allein schon aus PerformancePerspektive betrachtet viel zu aufwändig. Schließlich könnten davon Millionen und noch mehr XML-Dokumente betroffen sein. Realistischer erscheint es, diese Dokumente über einen längeren Zeitraum sukzessive gegen das veränderte XML-Schema gemäß der Anforderung aus Abschnitt 7.2.5 nachzuvalidieren oder unter Umständen auf diesen Prozess gänzlich zu verzichten. Im Rahmen der obigen Betrachtung wäre die einfache Veränderung eines Schemas aber noch mit einem anderen Problem verbunden. Sobald das originale XML-Schema verändert wird, muss auf irgendeine Art sichergestellt werden, dass die noch gegen das Original validierten 34 ist die Änderung eines bereits bestehenden XML-Schemas 113 7 XML-Schema-Management XML-Dokumente für das neue Schema den Zustand „nicht validiert“ einnehmen (siehe Abschnitt 7.2.4). Auch hierfür müssten unter Umständen die Zustände für eine erhebliche Anzahl von Dokumenten aktualisiert werden, was gemäß der obigen Ausführung nicht beziehungsweise nur mit immensem Aufwand zu realisieren ist. Demzufolge macht hier ein anderes Konzept Sinn, nämlich die Versionierung von XMLSchemas. Auf diese Weise werden alte, noch verwendete XML-Schemas bei einer Schemaevolution nicht gelöscht, sondern veränderte Schemas parallel zu diesen als so gesehen „neue Version“ in dem Datenbankmanagementsystem hinterlegt. Dies hat den Effekt, dass sämtliche „alten“ gespeicherten XML-Dokumente weiterhin korrekt sind – hinsichtlich jener Schemaversion, unter der sie eingefügt wurden. Die Dokumente können dann nach und nach gegen das neue XML-Schema validiert werden, bis keines mehr das Originalschema verwendet. Erst dann kann dieses aus dem Datenbankmanagementsystem entfernt werden. Abbildung 49 visualisiert die Abfolge einer solchen Vorgehensweise, für die keine spezielle Unterstützung durch das Datenbankmanagementsystem notwendig ist. Hier sei aber nochmals darauf hingewiesen, dass es praktisch durchaus denkbar wäre, gänzlich von einem „Nachvalidieren“ der XMLDokumente abzusehen. (1) Neue Version des XML-Schemas registriert XMLDokumente XML-Schema (Original) XML-Schema (neue Version) (2) Sukzessives „Nachvalidieren“ XMLDokumente XML-Schema (Original) XML-Schema (neue Version) 114 7 XML-Schema-Management (3) „Nachvalidieren“ vollständig abgeschlossen XMLDokumente XML-Schema (Original) XML-Schema (neue (Original) Version) XMLDokumente X (4) Original des XML-Schemas entfernen XML-Schema (Original) XML-Schema (neue (Original) Version) Abbildung 49: Vorgehensweise bei Schemaevolution 7.3 XML-Schema-Management in DB2 Zusammen mit der Einführung der pureXML-Technologie ist in DB2 auch das XML-SchemaKonzept implementiert worden. Neben den anderen zu Beginn dieses Kapitels genannten Alternativen zu diesem Konzept ist XML-Schema die einzige Schemasprache, die von DB2 unterstützt wird. Inwieweit diese Unterstützung hinsichtlich der Anforderungen aus Abschnitt 7.2 und speziell auch hinsichtlich des Preformance-Aspekts realisiert wurde, soll im weiteren Verlauf dieses Abschnitts aufgezeigt werden. Da sich XML-Schemas, wie oben erwähnt, durch spezielle XML-Dokumente beschreiben, müssen diese, bevor sie später zur Validierung benutzt werden können, zuerst einmal im Datenbankmanagementsystem hinterlegt werden. DB2 nutzt hierzu ein so genanntes XML Schema Repository (XSR), das sich aus mehreren Tabellen des Datenbankkatalogs zusammensetzt. In diesem werden XML-Schemas in binär geparster Form zusammen mit einer automatisch generierten Schema-ID abgespeichert [NK09]. Für die Registrierung eines neuen Schemas im 115 7 XML-Schema-Management XSR – damit ist der Vorgang des Einfügens bezeichnet – stehen verschiedene Wege zur Verfügung. Registrierung von XML-Schemas mithilfe des DB2 Command Line Processors „Stored Procedure“-basierte Registrierung von XML-Schemas Registrierung von XML-Schemas per Java-Applikation (über JDBC-Treiber) Auf nähere Details zu dem Registrierungsprozess und den damit verbundenen Varianten soll in dieser Arbeit nicht eingegangen werden. Dies gilt auch für Einzelheiten zur internen Ablage von XML-Schemas in DB2. In beiden Fällen liefert die Literatur [NK09] umfassende Informationen. Der weitere Fokus dieses Abschnitts richtet sich primär auf das Thema der Schemavalidierung. Dazu existiert in DB2 die Funktion DSN_XMLVALIDATE [IBM11a], die sich allerdings nicht wie eine gewöhnliche Funktion gebrauchen lässt. Diesbezüglich ist sie nur als Argument der in Abschnitt 3.1.2 betrachteten XMLPARSE-Funktion [IBM11a] verwendbar, was wiederum bedeutet, dass eine Schemavalidierung von XML-Dokumenten in DB2 nur zusammen mit dem gleichzeitigen Parsen35 dieser Dokumente möglich ist [NK09]. Näheres dazu findet sich aber in Abschnitt 7.3.1. Syntaktisch besitzt die Funktion DSN_XMLVALIDATE zwei beziehungsweise drei Argumente (siehe Abbildung 50). Das erste Argument dient der Übergabe des zu validierenden XML-Dokuments. Es erwartet als Input einen Character-String oder einen Binary-String36, in dem das (folglich) nicht-native XML-Dokument enthalten ist. Die Übergabe eines nativen XML-Dokuments ist nicht möglich, woraus sich ein Nachteil für die nachträgliche Schemavalidierung ergibt, auf den in Abschnitt 7.3.1 näher eingegangen wird. Abbildung 50: Syntaxdiagramm der Funktion DSN_XMLVALIDATE [IBM11a] 35 Auch wenn die Dokumente bereits in geparster Form vorliegen, müssen sie zur Schemavalidierung trotzdem ein weiteres Mal geparst werden. 36 Ein Graphic-String [IBM11a] wäre ebenfalls zulässig, wird aber bei der DATEV nicht verwendet. 116 7 XML-Schema-Management Das zweite (und dritte) Argument, das der Funktion DSN_XMLVALIDATE übergeben werden muss, dient der Identifikation eines XML-Schemas, gegen das das Dokument validiert werden soll. Dieses Schema lässt sich auf zwei Arten referenzieren. Zum einen ist die Angabe des Schemanamens möglich, unter dem es im XSR hinterlegt wurde. Die andere Variante, das Schema anzugeben, benötigt zwei Argumente, weshalb die Funktion DSN_XMLVALIDATE eingangs auch mit „zwei beziehungsweise drei Argumenten“ beschrieben wurde. Bei diesen zwei Argumenten handelt es sich um die Attribute „targetNamespace“ und „schemaLocation“ eines XML-Schemas, Details dazu finden sich in [IBM11a]. Über die zuletzt betrachtete Variante lässt sich ein XML-Schema allerdings nur dann referenzieren, wenn die Kombination der genannten Attribute innerhalb des XSR eindeutig ist. In der z/OS-Produktlinie von DB2 ist es leider nicht möglich, anhand der Attribute „targetNamespace“ und „schemaLocation“ eines XML-Dokuments direkt auf das ihm zugehörige XML-Schema zu schließen37. Aus diesem Grund wird in den weiteren Betrachtungen dieses Abschnitts stets mit der Variante gearbeitet, ein XML-Schema anhand seines im XSR hinterlegten Namens zu referenzieren. Verglichen mit den vorangehenden Betrachtungen zu DB2 Version 9 sind die oben beschriebenen Möglichkeiten zur Schemavalidierung in DB2 Version 10 wesentlich erweitert worden. Hier ist es zum einen realisierbar, auch native Dokumente mithilfe der DSN_XMLVALIDATE-Funktion gegen ein XML-Schema zu validieren. Zum anderen wird aber die Verwendung dieser Funktion nahezu unnötig, da in DB2 Version 10 einer Spalte vom XML-Datentyp direkt per XML-type-modifer ein XML-Schema zugeordnet ist. Sämtliche Dokumente, die dort in eine XML-Spalte eingefügt oder darin verändert werden sollen, werden dann beim INSERT, UPDATE oder LOAD automatisch gegen das angegebene Schema validiert. [Nic10] 7.3.1 Umsetzung der Anforderungen In Anlehnung an die Ausführungen in Abschnitt 7.2 ergeben sich zwei verschiedene Wege, auf denen eine Validierung von XML-Dokumenten gegen ein XML-Schema durchführbar sein muss. Zum einen ist es aufgrund der Transparenz (siehe Abschnitt 7.2.2) zur Anwendung wichtig, die Validierung möglichst automatisch während der jeweiligen Datenmanipulation – also im Datenbankmanagementsystem – durchzuführen. Auf der anderen Seite muss es aber vor allem 37 In DB2 for LUW ist eine Referenzierung des XML-Schemas auf die genannte Weise möglich [NK09]. 117 7 XML-Schema-Management gemäß den Ausführungen in Abschnitt 7.2.5 auch die Möglichkeit einer nachträglichen Validierung geben. Unabhängig von diesen beiden Varianten sind noch die Anforderungen Verknüpfung von XML-Dokument und XML-Schema Umgang mit ungültigen XML-Dokumenten Auskunft über Gültigkeit von XML-Dokumenten von DB2 zu erfüllen. Die Unterstützung von Schemaevolutionen braucht in diesem Kontext nicht weiter untersucht zu werden, da die in Abschnitt 7.2.6 betrachtete, ideale Vorgehensweise ohne zusätzliche spezielle datenbankseitige Mechanismen realisierbar ist. Leider bietet DB2 Version 9 über die manuelle Anwendung der bereits betrachteten Funktion DSN_XMLVALIDATE hinaus keinerlei Unterstützung hinsichtlich der genannten Anforderungen. Dennoch ist es mit deren Hilfe und anderen datenbankseitigen Mechanismen möglich, sämtliche fehlende Funktionalitäten „nachzubauen“. Auf welche Weise dies realisierbar ist, soll nun genauer betrachtet werden. In Abschnitt 7.3.2 folgt anschließend eine Untersuchung, wie effizient diese Workarounds arbeiten. Zur Realisierung der beschriebenen Anforderungen ist in dieser Arbeit ein generisches Konzept gewählt worden. Das heißt, sowohl für den Fall der automatisierten als auch für den der nachträglichen Schemavalidierung ist im Wesentlichen jeweils eine parametrisierte Stored Procedure verantwortlich. Diese zwei Prozeduren können durch entsprechende Parameterübergabe zur Validierung beliebiger XML-Dokumente gegen ein beliebiges XML-Schema genutzt werden. Auf Details zu den benötigten Parametern soll hier nicht näher eingegangen werden. Wichtig ist nur, dass sie sowohl die zu validierenden Daten als auch das zur Validierung zu verwendende XML-Schema identifizieren. Da sich eine Stored Procedure nicht von selbst, etwa Event-gesteuert, aufrufen kann, werden für den Automatismus zur Schemavalidierung noch Trigger benötigt. Diese übernehmen, wie bereits in Abbildung 14 beispielhaft zu sehen war, den Aufruf der Validierungsprozedur SP_SCHEMA_VALIDATION_AUTO bei einem INSERT oder UPDATE von XML-Dokumenten. Dazu muss für jede zu validierende XML-Spalte ein Trigger auf der ihr zugehörigen Tabelle erstellt werden. Dies hat den Vorteil, dass es möglich ist, einzelne Trigger wieder gezielt zu entfernen, sofern die automatische Validierung gemäß der Anforderung aus Abschnitt 7.2.2 nicht mehr gewünscht ist. Auf der anderen Seite hat diese Vorgehensweise aber auch einen bereits in Abschnitt 5.3 erwähnten großen Nachteil. Da DB2 es nicht zulässt, (native) 118 7 XML-Schema-Management XML-Daten im Trigger-Body zu verarbeiten, kann eine Schemavalidierung von XMLDokumenten nicht vorangestellt innerhalb eines BEFORE-Triggers, wie beispielsweise in DB2 for LUW [NK09], durchgeführt werden. Stattdessen ist es lediglich möglich, die Schemavalidierung der Dokumente mittels eines AFTER-Triggers nachträglich zu initiieren. Aus dem zuletzt erwähnten Aspekt und der Konzeption der Funktion DSN_XMLVALIDATE in DB2 ergibt sich aber noch ein weiteres Defizit. Diese Funktion lässt, wie bereits erwähnt, als Input-Parameter nur nicht-native XML-Dokumente zu. Daher müssen die zum Zeitpunkt der Ausführung des AFTER-Triggers bereits eingefügten und somit in die native Form überführten XML-Dokumente vor der Validierung wieder serialisiert werden. Diese Verfahrensweise ist nicht nur umständlich, sondern verursacht auch erhöhte (eigentlich unnötige) Laufzeitkosten. Abbildung 51 visualisiert den diskutierten Ablauf am Beispiel eines INSERT-Statements und stellt dabei zudem einen Vergleich zur möglichen Vorgehensweise in der Produktlinie DB2 for LUW dar. Eine Alternative zu dem beschriebenen Verfahren, die gemäß der Anforderung aus Abschnitt 7.2.2 ebenfalls transparent zur Anwendung hin ist, existiert für die automatische Schemavalidierung in DB2 Version 9 nicht. Der hier angesprochene Nachteil ergibt sich im Übrigen auch für die nachträgliche Validierung von XML-Dokumenten. Da sich diese ebenfalls bereits nativ gespeichert in DB2 befinden, müssen auch sie zum Zweck der Schemavalidierung (unnötig) serialisiert werden. DB2 for LUW DB2 for z/OS INSERT INSERT XMLDokument XMLDokument Validierung und Parsen Validierung und Parsen (Before-Trigger) XMLSchema (After Trigger) XML? XMLParsen Tabelle XML Serialisieren Tabelle ? ? ≙ Schemainformationen Abbildung 51: Vorgehensweise zur automatisierten Schemavalidierung in DB2 119 XMLSchema 7 XML-Schema-Management Der Aufbau der beiden zuvor genannten Validierungsprozeduren für den Automatismus zur Schemavalidierung (SP_SCHEMA_VALIDATION_AUTO) und für die nachträgliche Schemavalidierung (SP_SCHEMA_VALIDATION_AFTER) ist sehr ähnlich. Der Hauptunterschied besteht in der Anzahl an zu verarbeitenden Daten. Während die Prozedur SP_SCHEMA_VALIDATION_AUTO stets nur ein Dokument38 validiert, wird in der Prozedur SP_SCHEMA_VALIDATION_AFTER die Validierung für eine beliebige Menge von Dokumenten durchgeführt. Auch wenn es gemäß den Betrachtungen aus Abschnitt 7.2 aus Aufwandsgründen in produktiven Kontexten unrealistisch ist, wird für die in Abschnitt 7.3.2 durchgeführten Performance-Untersuchungen folgende Vereinfachung angenommen. Die zuletzt genannte Prozedur SP_SCHEMA_VALIDATION_AFTER validiert stets den kompletten XML-Datenbestand einer Spalte gegen ein XML-Schema. Auf eine Berücksichtigung der bereits im Voraus gegen ein XML-Schema auf Gültigkeit geprüften XML-Dokumente wird demnach ebenfalls verzichtet. Diese zwei Aspekte sind bei einer späteren Verwendung der Prozeduren in produktiven Kontexten zu beachten, da sie dort durchaus Einfluss auf die Performance der Schemavalidierung haben können. Für die in Abschnitt 7.3.2 vorgestellten Messungen sind sie allerdings irrelevant. Weiterhin soll der Fokus auf die in den Prozeduren befindliche Logik zur Umsetzung der verbleibenden Anforderungen gerichtet sein. Dabei wird zuerst die Art und Weise geklärt, wie die Verknüpfung von XML-Dokument und XML-Schema sichergestellt werden kann. Das in dieser Arbeit vorgestellte Verfahren greift dazu die Idee von [NK09] auf und arbeitet mit einer zusätzlichen Spalte (XML_SCHEMA_INFO) vom Datentyp BIGINT [IBM11a]. Die (Zusatz-)Spalte muss einer Tabelle pro XML-Spalte hinzugefügt werden. Bei dem INSERT oder UPDATE von XML-Dokumenten kann dann automatisiert in die zusätzlich mitgeführte Spalte, in unserem Fall XML_SCHEMA_INFO, die ID des XML-Schemas eingefügt werden, gegen das das Dokument während der Datenmanipulation validiert wurde. Mithilfe der oben angesprochenen Zusatzspalte XML_SCHEMA_INFO lassen sich gleichermaßen auch die Anforderungen nach Auskunft auf Gültigkeit von XML-Dokumenten und Umgang mit ungültigen XML-Dokumenten umsetzen. Sollte sich ein XML-Dokument bezogen auf das ihm zugeordnete XML-Schema als ungültig erweisen, so wäre es denkbar, statt 38 Damit ist das Dokument gemeint, für dessen Änderung der jeweilige Trigger aktiv wurde und die Prozedur aufgerufen hat. 120 7 XML-Schema-Management der ID des Schemas dessen Negation, also beispielsweise „-1000“ statt „1000“ in die Spalte XML_SCHEMA_INFO einzufügen. Ist die Schemavalidierung eines XML-Dokuments noch nicht durchgeführt worden, so bliebe dieser Eintrag einfach NULL. Auf diese Weise könnte jederzeit nachvollzogen werden, in welchem Zustand sich ein XML-Dokument hinsichtlich seiner Schemavalidierung befindet. Die andere Möglichkeit bestünde natürlich wie in Abschnitt 7.2.3 beschrieben darin, ungültige XML-Dokumente einfach zurückzuweisen. Ungeklärt ist zu diesem Zeitpunkt noch, wie die Sonderbehandlung von ungültigen XMLDokumenten innerhalb einer Stored Procedure realisiert werden kann. Sollte sich ein Dokument im Rahmen eines XML-Parse-Prozesses mit eingeschlossener Schemavalidierung als ungültig erweisen, so wird es mit dem SQLSTATE 2201R („The XML document is not valid.“) [IBM08c] abgewiesen. Stored Procedures erlauben allerdings über Conditions [IBM08b] eine interne Fehlerbehandlung. Mit deren Hilfe lässt sich dann gezielt für den genannten SQLSTATE die negierte ID des XML-Schemas in die Zusatzspalte einfügen. Somit könnte der Inhalt einer Tabelle mit enthaltener XML-Spalte dann wie in Abbildung 52 dargestellt aussehen. ID XML SCHEMA_INFO 1 XML 1000 2 XML -1000 3 XML 1000 4 ✓ XML 1000 5 XML NULL ✓ ✓ Abbildung 52: Beispielinhalt einer Tabelle mit Zusatzspalte zur Gültigkeitsauskunft 7.3.2 Performance der Schemavalidierung Nachdem im vorangehenden Abschnitt zwei Verfahrensweisen zur Schemavalidierung herausgearbeitet wurden, sollen diese nun hinsichtlich ihrer Effizienz untersucht werden. Dazu sind die zuvor erläuterten Konzepte im Rahmen dieser Arbeit implementiert und an einem der in Abschnitt 5.1 vorgestellten Testdatensätze getestet worden. Hierbei ist die Wahl auf die 121 7 XML-Schema-Management Testdaten39 des Kriteriums der Größe und Anzahl (siehe Abschnitt 5.1.1) gefallen. Diese haben zum einen den Vorteil, dass es sich dabei um realitätsnahe, produktionsähnliche XMLDokumente handelt. Andererseits existiert zu diesen Daten bereits ein vorgefertigtes XMLSchema, was die Aussagekraft der weiter unten aufgeführten Messergebnisse nochmals bekräftigt. An dieser Stelle sei noch angefügt, dass in den weiteren Tests die Messausprägungen „200B x 500.000“ und „10M x 10“ nicht betrachtet wurden. Der Grund dafür liegt in den dazugehörigen XML-Dokumenten. Diese sind im Fall der Messausprägung „200B x 500.000“ zu minimalistisch hinsichtlich ihres Umfangs, da sie neben der XML-Deklaration (siehe Abschnitt 3.1) kaum zusätzlichen Inhalt umfassen. Demnach eignen sich die Dokumente nicht dafür, verwertbare Aussagen zur Performance der Schemavalidierung gewinnen zu können. Im Fall der Merkmalsausprägung „10M x 10“ ist die Größe der XML-Dokumente in anderer Hinsicht problematisch. Bereits in Abschnitt 6.1.2 ist erwähnt worden, dass es für die Verarbeitung von LOB-Daten in DB2 neben dem allgemein gültigen Limit von 2G noch weitere Beschränkungen gibt. Diese definieren sich durch die Subsystem-Parameter LOBVALA und LOBVALS, welche unter anderem die maximale Menge an LOB-Daten festlegen, die gleichzeitig im virtuellen Speicher verarbeitet werden darf. Die aktuelle Konfiguration der genannten Parameter im Entwicklungssystem Mem1 lässt es nicht zu, 10M große Dokumente mit den vorliegenden Konzepten zur Validierung zu verarbeiten. Da eine Anpassung dieser Parameter aber nicht aufwandsgemäß ist, wird für die weiteren Ausführungen auch auf die Betrachtung der Merkmalsausprägung „10M x 10“ verzichtet. In Abschnitt 6.4 ist aufgezeigt worden, dass sich die Verarbeitung des UPDATEs von XML-Dokumenten in DB2 nur kaum von der des INSERTs unterscheidet. Infolgedessen und hinsichtlich späterer Vergleiche zu den Laufzeiten des „nicht-validierenden“ INSERTs beschränken sich die Ausführungen zum Konzept der automatisierten Schemavalidierung auf die Betrachtung des INSERTs von XML-Dokumenten. Für das Verfahren der nachträglichen Schemavalidierung sei an dieser Stelle nochmals auf eine Anmerkung aus Abschnitt 7.3.1 hingewiesen. Die zur Performance-Messung genutzte 39 CLOB-Variante dieser Daten, um Merkmalsausprägungen bis unter anderem auch 10M betrachten zu können (siehe Abschnitt 5.1.1) 122 7 XML-Schema-Management Messprozedur ist vereinfacht so implementiert worden, dass sie mit einer einmaligen Ausführung den gesamten Inhalt einer XML-Spalte gegen ein definiertes XML-Schema validiert (siehe Abschnitt 7.3.1). Im weiteren Verlauf des Abschnitts erfolgt nun die Performance-Betrachtung der zuvor beschriebenen Verfahren der automatischen und nachträglichen Schemavalidierung. Nachdem kurz auf die jeweiligen Einzelmessreihen Bezug genommen wird, konzentrieren sich die weiteren Ausführungen auf den Vergleich der beiden Verfahren in Relation zum „nichtvalidierenden“ INSERT. Zusätzliche Informationen zum konkreten Aufbau der jeweils verwendeten Messprozeduren, zu den einzelnen Ergebnistabellen und insbesondere zu den Messwerten der Elapsed-Zeit finden sich gemäß den Bemerkungen aus Kapitel 5 im Anhang dieser Arbeit. Betrachtung der Einzelmessreihen zu den Verfahren Aus der Durchführung der Messreihen zur nachträglichen Schemavalidierung resultiert ein ähnlicher Kurvenverlauf der CPU-Zeit wie bereits bei der Betrachtung des „nichtvalidierenden“ INSERTs in Abschnitt 6.1.4. Für die automatische Schemavalidierung gilt dies mit einer geringfügigen Abweichung ebenso. Diese besteht in einer bezogen auf die vertikale Achse leichten Streckung des Kurvenverlaufs. Aufgrund der genannten Ähnlichkeiten soll auf eine ausführliche Begründung für das gezeigte Verhalten verzichtet und stattdessen auf die analogen Ausführungen aus Abschnitt 6.1.4 verwiesen werden. Eine detaillierte Gegenüberstellung der Messergebnisse zu beiden Verfahren schließt sich im nächsten Absatz an. Vergleich der Verfahren mit „nicht-validierendem“ INSERT Die folgenden Betrachtungen dienen der Veranschaulichung des prozentualen Zusatzaufwands, den eine Schemavalidierung bezogen auf einen „nicht-validierenden“ INSERT (siehe Abschnitt 6.1.4) benötigt. Dazu werden dessen Kosten für jede Merkmalsausprägung jeweils als Ausgangspunkt mit 100 Prozent fixiert. Anhand dieser Werte ist dann die Bemessung der Gesamtkosten der jeweiligen Validierungsverfahren ausgerichtet. Da eine nachträgliche Validierung erst stattfinden kann, wenn zuvor ein INSERT der Daten erfolgt ist, sind zur besseren Vergleichbarkeit der Verfahren die Kosten eines INSERTs auf die Messwerte zur 123 7 XML-Schema-Management nachträglichen Schemavalidierung hinzuaddiert worden. Abbildung 53 veranschaulicht den auf diese Weise beschriebenen Vergleich der Verfahren mit einem INSERT ohne eingeschlossene Schemavalidierung. 900% Sekunden (in Prozent) 800% 700% INSERT (ohne Schemavalidierung) 600% 500% 400% INSERT (mit Schemavalidierung) 300% 200% nachträgliche Schemavalidierung (+ Kosten für INSERT) 100% 0% 1K x 100.000 10K x 10.000 100K x 1.000 1M x 100 Größe und Anzahl Abbildung 53: Vergleich der CPU-Zeiten mit „nicht-validierendem“ INSERT Bei der Betrachtung der prozentualen Verhältnisse fällt auf, dass der angesprochene Unterschied zwischen der automatischen und der nachträglichen Schemavalidierung (inklusive den INSERT-Kosten) deutlicher ist, als zuerst angenommen wurde. Bei der nachträglichen Schemavalidierung lässt sich ein konstanter Zusatzaufwand erkennen, der ungefähr dem Vierfachen der Kosten für den „nicht-validierenden“ INSERT entspricht. Im Gegensatz dazu zeigt sich mit zunehmender Dokumentgröße und bei gleich bleibendem Gesamtdatenvolumen für die automatische Schemavalidierung ein linear abnehmender Zusatzaufwand. Während er in der Merkmalsausprägung „1K x 100.000“ noch fast dem Achtfachen der Kosten eines INSERTs ohne Schemavalidierung entspricht, bemisst der Zusatzaufwand bei der Ausprägung „1M x 100“ knapp das Vierfache dieser Kosten. Obwohl beide Validierungsverfahren den gleichen, in Abbildung 47 visualisierten Ablauf nutzen, zeigen sich erhebliche Unterschiede in deren Effizienz. Wie kann das sein? Der Grund dafür ergibt sich aus dem in Abschnitt 7.3.1 angesprochenen Unterschied der Verfahren. Die automatische, Trigger-gesteuerte Schemavalidierung prüft pro Initiierung stets ein XMLDokument gegen ein XML-Schema. Dieses Dokument wird gemäß den Vorüberlegungen aus Abschnitt 7.3.1 erst in die dazugehörige XML-Spalte eingefügt und muss anschließend zur 124 7 XML-Schema-Management Validierung wieder mittels eines SELECT-Statements aus dieser ausgelesen werden. Das Statement wird demnach pro Dokument einmal ausgeführt. Bei der nachträglichen Schemavalidierung ist dies nicht der Fall. Hier findet der Zugriff auf die XML-Dokumente mithilfe eines einzigen SELECT-Statements statt, das Cursor-basiert nach und nach alle Tupel der XML-Spalte ausliest, validiert und daraufhin die nötigen Schemainformationen verifiziert. Da der weitere Ablauf der beiden Validierungsverfahren analog ist, muss demnach die vielfache Ausführung des SELECT-Statements für die unterschiedlichen Kurvenverläufe verantwortlich sein. Dies begründet sich auch durch die Tatsache, dass die Kurve der automatischen Schemavalidierung bei abnehmender Dokumentanzahl (von 100.000 Dokumenten hin zu 100 Dokumenten) abflacht und sich zum Ende hin der Performance der nachträglichen Schemavalidierung annähert. Unabhängig von dem betrachteten Verfahren ist die Validierung von XML-Dokumenten gegen ein XML-Schema ein sehr aufwandsintensiver Prozess (siehe Abschnitt 7.2.2), der in dem hier betrachteten Kontext gemäß den Kennwerten aus Abbildung 53 mindestens ungefähr viermal so teuer ist wie ein „nicht-validierender“ INSERT. Diese enormen Zusatzkosten resultieren aus den verschiedenen Schritten, die während der unterschiedlichen Verfahren durchgeführt werden. Die Prozesse lassen sich wie folgt zusammenfassen. XML-Serialisieren der nativen XML-Dokumente in die nicht-native Form (CLOB) Anschließendes XML-Parsen der Dokumente mit integrierter Schemavalidierung UPDATE der Zusatzspalte mit Informationen zum Ergebnis der Validierung Nähere Details zu den einzelnen Prozessen wurden bereits in Abschnitt 7.3.1 beschrieben und grafisch in Abbildung 51 visualisiert. Auf eine Ermittlung der Kostenanteile dieser Prozesse, wie sie beispielsweise in Abschnitt 6.1 bei der Betrachtung der einzelnen Schritte einer Migration mittels INSERT durchgeführt wurde, ist hier verzichtet worden, da sich die vorgestellten Validierungskonzepte nur durch die Gesamtheit der aufgeführten Prozesse realisieren lassen. Einzelbetrachtungen sind somit unnötig, wurden aber im Rahmen dieser Arbeit dennoch beispielsweise für den Prozess des XML-Parsens (siehe Abschnitt 6.1.4) oder später für den Prozess der Serialisierung (siehe Abschnitt 8.2.1) zum Teil in anderen Kontexten durchgeführt. Entsprechend den durch die angefügten Messreihen gewonnenen Erkenntnissen lässt sich formulieren, dass es in Performance-intensiven Anwendungsszenarien durchaus sinnvoll ist, auf eine automatische Schemavalidierung zu verzichten. Auf diese Weise ist eine nachträgliche 125 7 XML-Schema-Management Validierung in dem hier betrachteten Kontext nicht nur für den Moment der Datenmanipulation, sondern auch insgesamt gesehen effizienter als ihr Pendant die automatische Schemavalidierung. Hier darf aber der Nachteil einer nachträglichen Validierung nicht außer Acht gelassen werden. Ein permanenter „Schutz“ vor Inkonsistenzen kann letztendlich nur durch eine direkt zur Datenmanipulation stattfindende Validierung gewährleistet werden. Abschließend sei noch einmal darauf hingewiesen, dass sich in weiteren Tests auch ein Einfluss der Komplexität eines XML-Schemas auf die Performance der Schemavalidierung verifizieren ließ. Je umfangreicher und komplexer ein XML-Schema ist, umso mehr Zeit benötigt DB2 zur Validierung von XML-Dokumenten gegen dieses Schema. Genauere Ausführungen sollen hierzu aber aus Umfangsgründen nicht angefügt werden. 7.4 Alternative Konzepte Das XML-Schema-Konzept ist nur eine der vielen Schemasprachen, die sich rund um das Thema XML entwickelt haben. Zu Beginn des Kapitels sind bereits alternative Ansätze erwähnt worden, die anschließend näher vorgestellt werden sollen. Dazu zählen die DTD, RELAX NG und auch Schematron. Vorab sei nochmals erwähnt, dass DB2 von den genannten Konzepten lediglich das XML-Schema unterstützt. 7.4.1 DTD Einer der ersten Ansätze zur Festlegung und Prüfung der Struktur von XML-Dokumenten ist die Document Type Definition (DTD) [W3C06b, W3C08]. Diese Variante basiert auf der Definition von Dokumenttypen, denen eine gewisse Klasse ähnlicher XML-Dokumente zugeordnet ist. Analog zu dem XML-Schema-Konzept kann durch DTDs ebenfalls die Struktur von XML-Dokumenten beschrieben werden. Dementsprechend lassen sich beispielsweise zwingend vorhandene Elemente, deren Attribute oder auch deren Verknüpfung miteinander definieren. [WK03] Der mögliche Definitionsumfang bei DTDs ist allerdings verglichen mit dem XML-SchemaKonzept wesentlich geringer. Als Beispiel dafür lässt sich die in Abschnitt 7.1.3 beschriebene 126 7 XML-Schema-Management Entitätsintegrität aufführen. Für DTDs besteht hier lediglich die Möglichkeit die Eindeutigkeit beziehungsweise Schlüsseleigenschaft dokumentweit festzulegen [Pag04b]. Auf einen spezifischen Kontext lässt sich dabei wie im Falle des XML-Schema-Konzepts nicht einschränken. Ein als eindeutig definiertes Attribut, das eventuell „id“ heißt, müsste demnach innerhalb eines gesamten Dokuments eindeutig sein, egal ob es sich dabei wie im Beispieldokument aus Abbildung 7 um das „id“-Attribut der Seite oder das des Textblocks handelt. Abbildung 54 greift den aus diesem Dokument relevanten Ausschnitt nochmals auf. <?xml version="1.0" encoding="UTF-8"?> <seite id="seite1"> <textblock id="textblock1" ...> </textblock> ... </seite> Abbildung 54: DTD basierte Eindeutigkeitsdefinition – gültiges Dokument Sollten die „id“-Attribute allerdings wie in Abbildung 55 vergeben sein, wäre die Eindeutigkeit der DTD-basierten Definition verletzt. <?xml version="1.0" encoding="UTF-8"?> <seite id="1"> <textblock id="1" ...> </textblock> ... </seite> Abbildung 55: DTD basierte Eindeutigkeitsdefinition – ungültiges Dokument Ein weiterer Kritikpunkt an der DTD ist, dass ihre Beschreibung von der XML-Syntax abweicht. Dadurch ergeben sich viele Nachteile. Zum einen wird zur Editierung von DTDs ein spezieller DTD-Editor benötigt. Zum anderen muss für deren Verarbeitung auch im Parser ein zusätzliches Modul integriert sein. Allgemein können Programme, die XML-Dokumente verarbeiten, nicht automatisch mit DTDs umgehen. Im Fall von XML-Schema-Dokumenten ist dies hingegen der Fall. An dieser Stelle würden sich auch noch zahlreiche andere Nachteile der DTDs aufführen lassen. Darauf soll allerdings verzichtet und auf die übersichtliche Darstellung in [Pag04a] verwiesen werden. 127 7 XML-Schema-Management 7.4.2 RELAX NG Die Regular Language Description for XML New Generation (RELAX NG) [Van03] ist das gemeinsame Resultat der beiden Initiativen RELAX [Mak00] und TREX [Cla01] zur Entwicklung von Schemasprachen. Analog zu dem XML-Schema-Konzept liegt ihr ein grammatikorientierter Ansatz zugrunde. Somit sind nur die Konstrukte erlaubt, die sich anhand der Produktionsregeln der Grammatik von RELAX NG ableiten lassen. Dieser Ansatz wird auch als geschlossener Schemaformalismus bezeichnet. Demgegenüber steht der offene Schemaformalismus, den das in Abschnitt 7.4.3 vorgestellte Schematron-Konzept verfolgt. [KST02] Die Idee hinter RELAX NG liegt in der Konstruktion einer kompakten, einfach verständlichen Sprache zur Validierung der Struktur von XML-Dokumenten [WK03]. Daher besitzt diese Sprache einen geringeren Funktionsumfang wie das XML-Schema-Konzept. Dies ist aber nicht unbedingt als Nachteil zu verstehen. RELAX NG wurde nicht etwa als eine Art Modellierungssprache entwickelt, sondern soll ausschließlich der strukturellen Beschreibung von XML-Dokumenten dienen. Dementsprechend behandelt es die in Abschnitt 7.1 angesprochenen Aspekte Entitätsintegrität und Referentielle Integrität nicht. Auch die Sicherstellung der Werteintegrität ist nur teilweise durch RELAX NG abgedeckt. Diese Sprache verfügt selbst nicht über komplexe Datentypen, sie bietet allerdings die Möglichkeit solche über externe Typbibliotheken einzubinden. Auf diesem Weg stehen unter anderem die Datentypen des XML-Schema-Konzepts (siehe Abschnitt 7.1.2) in RELAX NG zur Verfügung. Eine Modifikation der Typen ist innerhalb dieser Sprache jedoch nicht möglich. [WK03] Bezüglich der strukturellen Beschreibung von XML-Dokumenten ist RELAX NG dem XMLSchema-Konzept ebenbürtig. Hier zeigen sich im Wesentlichen lediglich syntaktische Unterschiede. So wird bei RELAX NG beispielsweise der Ansatz verfolgt, sämtliche Strukturbeschreibungen auf der Ebene von Elementen zu definieren [KST02]. Insgesamt gesehen liegt der große Vorteil von RELAX NG in seiner Einfachheit. Damit verbunden existieren Tools, die die Konvertierung von nahezu jedem „RELAX NG“-Schema in ein herkömmliches XML-Schema und umgekehrt ermöglichen [Van03]. Auf diesem Weg könnten somit die Vorteile beider Welten vereint werden – die einfache initiale Beschreibung in RELAX NG und die nachträgliche Anreicherung eines Schemas mit zusätzlichen Konstrukten des XML-Schema-Konzepts. 128 7 XML-Schema-Management 7.4.3 Schematron Anders als alle zuvor betrachteten Schemasprachen verfolgt Schematron [ISO06] keinen grammatikorientierten, sondern einen regelbasierten Ansatz. Während bislang nur die Konstrukte zulässig waren, die sich anhand einer speziellen Grammatik ableiten ließen, ist dies bei dem vorliegenden offenen Schemaformalismus nicht der Fall. Hier sind prinzipiell alle Konstrukte gültig, die nicht explizit verboten wurden. Das sukzessive Ausschließen von Unzulässigkeiten wird in Schematron über Regeln gesteuert. So kann beispielsweise sichergestellt werden, dass ein bestimmtes Element nur zusammen mit ausgewählten Attributen oder speziellen Kindelementen im XML-Dokument enthalten sein darf. [WK03] Zur Definition der Regeln werden drei verschiedene Elementtypen benutzt. Eines dieser Elementtypen ist das „rule“-Element, das beliebig viele Elemente der weiteren zwei Typen „assert“ und „report“ in sich tragen kann. Die beiden letzteren Elementtypen beschreiben jeweils eine Reaktion, die auf einen per „test“-Attribut definierten Test ausgeführt werden soll. Dabei wird der Inhalt dieser Elemente bei den „assert“-Elementen ausgegeben, wenn der Test fehlschlägt. Bei „report“-Elementen erfolgt die Ausgabe im Fall eines positiven Tests. Der Kontext, in dem diese Tests stattfinden, wird innerhalb des „context“-Attributs des „rule“Elements definiert. Hierfür sind komplexe Muster in XSLT-Syntax erlaubt. [WK03] Mithilfe dieser Regeln lassen sich neben den oben beschriebenen syntaktischen Prüfungen aber auch wesentlich umfangreichere Zusammenhänge sicherstellen. Beispielsweise könnte auch auf inhaltliche Abhängigkeiten zwischen Attributen und/oder Elementen geprüft werden. Weitere Möglichkeiten von Schematron finden sich zusammen mit verschiedenen Beispielen in [Pag07] und [WK03]. Gemäß den oben angefügten Spezifika von Schematron ist es nur mit großem Aufwand möglich, bei seiner Verwendung alle strukturellen Zusammenhänge in einem XML-Dokument zu beschreiben. Schließlich müssten sämtliche ungewollten Fälle durch separate Regeln ausgeschlossen werden. Infolgedessen ist Schematron weniger als eigenständige Schemasprache, sondern vielmehr als Ergänzung einer der zuvor genannten grammtikorientierten Sprachen zu verstehen. Denn die Mächtigkeit, mit der Schematron komplexe Zusammenhänge zwischen XML-Daten prüfen kann, besitzt keine der anderen genannten Alternativen. 129 8 Query Performance 8 Query Performance IBM vermarktet die pureXML-Technologie als eine hocheffiziente Art der Verarbeitung von XML-Daten innerhalb des Datenbankmanagementsystems DB2. Nachdem sich diese Aussage durch die Performance-Untersuchungen in den vorangehenden Kapiteln nur bedingt verifizieren ließ, soll in dem aktuellen Kapitel auf den womöglich größten Vorteil der nativen XMLSpeicherung und -Verarbeitung eingegangen werden: die effiziente Art und Weise mit der es in DB2 möglich ist, auf nativ gespeicherte XML-Daten zuzugreifen. Wie performant solche Zugriffe tatsächlich erfolgen, wird dabei, verglichen mit den in der DATEV aktuell verwendeten nicht-nativen XML-Speicherformen VARCHAR und CLOB, in diesem Kapitel unter dem Titel Query Performance evaluiert. Die Ausführungen gliedern sich wie folgt. Eingangs wird in Abschnitt 8.1 aus theoretischer Sicht auf zentrale Aspekte eingegangen, die im Zusammenhang mit der Query Performance, bezogen auf den nativen XML-Datentyp, von Relevanz sind. Anschließend erfolgt in Abschnitt 8.2 eine Performance-Analyse des nativen XML-Datenzugriffs anhand ausgewählter Szenarien. Diese orientieren sich wie bereits in Kapitel 5 geschildert, an den dort vorgestellten Vergleichskriterien und der an jener Stelle ebenfalls ausführlich beschriebenen Verfahrensweise zur Messdatenerhebung. 8.1 Performance-relevante Aspekte Ähnlich wie bei den traditionellen relationalen Strukturen sind in Hinblick auf das Thema Query Performance auch für die native XML-Verarbeitung zugriffsoptimierende Strukturen in DB2 implementiert worden. Dazu zählen im Wesentlichen spezielle XML-Indexe (siehe Abschnitt 8.1.1), erweiterte Statistiken (siehe Abschnitt 8.1.2) und neue Operatoren, die sich in den Zugriffsplänen wiederfinden (siehe Abschnitt 8.1.3). Auf all diese Aspekte soll in den anschließenden Ausführungen näher eingegangen werden. 130 8 Query Performance 8.1.1 XML-Indexe Die zu dem nativen XML-Datentyp gehörenden Strukturen umfassen im Kern implizite XMLTablespaces, spezielle darin befindliche XML-Auxiliary-Tabellen und drei verschiedene Typen von Indexen: der DocID-Index, der NodeID-Index und der User-Defined-XML-Index. Eine ausführliche Beschreibung der einzelnen Indexformen und die Art und Weise wie sie miteinander interagieren ist in [Koc11] zu finden. Hierzu lässt sich zusammenfassend formulieren, dass es sich sowohl bei DocID-, als auch bei NodeID-Indexen um implizit erstellte Objekte handelt, die zur internen Verwaltung von nativ gespeicherten XML-Dokumenten verwendet werden. Im Gegensatz dazu sind User-Defined-XML-Indexe vom Nutzer zu erstellende Indexe, die dazu dienen, den effizienten Zugriff auf einzelne Knoten zu ermöglichen. Sie sollen im Rahmen dieser Arbeit aus dem Performance-Gesichtspunkt heraus näher betrachtet werden. Für die anderen beiden Indextypen sei aufgrund ihrer Verwaltungsfunktion und da sie nicht vom Datenbankadministrator/Nutzer zu „beeinflussen“ sind auf die theoretischen Ausführungen aus [Koc11] verwiesen. Die Erstellung von User-Defined-XML-Indexen erfolgt in DB2 mit dem „CREATE INDEX“Statement [IBM11a]. Dabei ist es, genau wie beim Anlegen traditioneller Indexe, möglich, spezielle UNIQUE [IBM11a] User-Defined-XML-Indexe zu definieren. Diese Sonderform soll hier nicht weiter betrachtet werden. Ausführliche Informationen dazu finden sich in [NK09]. Analog zu traditionellen Indexen handelt es sich bei User-Defined-XML-Indexen ebenfalls um B+-Baum-Indexe [NK09]. Diese sind stets balanciert und haben den Vorteil, dass sie sich mit logarithmischem Aufwand bezogen auf die Anzahl an indexierten Knoten nach einem bestimmten Eintrag durchsuchen lassen [Her09]. Für nähere Details zur Struktur von B+-Bäumen wird auf [Her09] verwiesen. Die Unterschiede zwischen der traditionellen Indexerstellung und der Erstellung eines UserDefined-XML-Indexes lassen sich anhand der Details der „CREATE INDEX“-Syntax erläutern. Dahingehend zeichnet sich ein User-Defined-XML-Index speziell durch die Definition der XML Index Specification [IBM11a] aus. Diese umfasst eine Namespace-Deklaration, einen XPath-Ausdruck und einen relationalen Zieldatentyp. Erstere ist optional und soll hier nicht 131 8 Query Performance weiter berücksichtigt werden. Abbildung 56 veranschaulicht die Bestandteile eines „CREATE INDEX“-Statements (mit Ausnahme einer konkreten Namespace-Deklaration) in Anlehnung an die bereits in Abschnitt 6.3 verwendeten Indexe. Der XPath-Ausdruck dient dabei der Angabe des Pfades, auf dem sich die zu indexierenden Knoten innerhalb der zugehörigen XMLDokumente befinden. Während bei traditionellen Indexen für ein Tupel/Dokument stets genau ein Wert indexiert wurde, ist es bei User-Defined-XML-Indexen möglich, dass der per XPathAusdruck definierte Pfad zu mehreren XML-Dokumentknoten führt. Sofern dies der Fall ist, werden folglich auch pro Tupel/Dokument mehrere Werte indexiert. Abbildung 36 hat bereits beispielhaft gezeigt, wie stark die Dokumentanzahl von der Anzahl an zu indexierenden Werten abweichen kann. [NK09] Position für (optionale) Namespace-Deklaration CREATE INDEX T24431A.IDX_POSX_TXML_100K ON T24431A.TXML_100K(XML_DOC) GENERATE KEY USING XMLPATTERN '/seite/textblock/@posx' AS SQL DECFLOAT; XPath-Ausdruck Zieldatentyp Abbildung 56: Beispiel-Statement für die Indexerstellung Hier sei noch erwähnt, dass es sich bei User-Defined-XML-Indexen um Werteindexe handelt [NK09]. Dementsprechend können beispielsweise Werte von Text- oder Attributknoten (siehe Abbildung 56) indexiert werden. Die Indexierung von Elementknoten ist ebenfalls möglich. Hierbei wird allerdings nicht das Element an sich, sondern der gesamte sich innerhalb des Elements befindliche Textinhalt in konkatenierter Form indexiert. Diese Vorgehensweise macht nur in sehr wenigen Anwendungsfällen, wie beispielsweise in [NK09] aufgezeigt, Sinn und soll für die folgenden Ausführungen außer Betracht gelassen werden. Hinsichtlich der zuvor angesprochenen XML Index Specification verbleibt noch die Klärung des dabei ebenfalls anzugebenden Zieldatentyps. Da es in DB2 gemäß den Ausführungen aus Kapitel 7 nicht möglich ist, einer XML-Spalte ein festes XML-Schema zuzuordnen, existieren datenbankseitig keine Informationen zu dem Datentyp eines zu indexierenden Wertes. Der Datentyp wird allerdings zur Indexerstellung benötigt und muss daher manuell vom Administrator spezifiziert werden. DB2 unterscheidet hier zwischen zwei möglichen Zieldatentypen – VARCHAR und DECFLOAT. Während der DECFLOAT-Datentyp für Zahlenwerte vorgesehen ist, lassen sich mithilfe des VARCHAR-Datentyps nahezu beliebige Werte indexieren. [NK09] 132 8 Query Performance Zusätzlich besteht bei der Definition von User-Defined-XML-Indexen die Möglichkeit, in den XPath-Ausdrücken so genannte Wildcards zu spezifizieren [NK09]. Diese erlauben es, bestimmte Teilpfade nicht zu spezifizieren (hierfür Wildcards zu nutzen) und an deren Ende wieder nahtlos anzusetzen, um ausgewählte Knoten zu indexieren. Eine umfassende Darstellung dazu soll hier nicht gegeben und stattdessen auf [NK09] verwiesen werden. Ebenfalls möglich ist auch die Verwendung von Filterprädikaten (siehe Abschnitt 3.1.3) innerhalb der XPathAusdrücke. Mit deren Hilfe lässt sich die Menge an zu indexierenden Werten in Abhängigkeit anderer Knoten gezielt einschränken. Auch hierzu finden sich in [NK09] zusätzliche Informationen. Obwohl die Möglichkeiten der Indexierung für XML-Dokumente recht vielfältig sind, gilt dies für deren Verwendung beim Datenzugriff nicht. Es können nur jene SQL-Statements UserDefined-XML-Indexe nutzen, die die zur Dekomposition empfohlene XMLTABLE-Funktion verwenden oder innerhalb ihrer WHERE-Bedingung das XMLEXISTS-Prädikat nutzen [NK09]. Voraussetzung ist dabei natürlich immer, dass die darin verwendeten Ziele der XPathAusdrücke auch tatsächlich durch Indexe mit entsprechenden Zieldatentypen indexiert sind. Unabhängig davon haben SELECT-Statements, die beispielsweise mit der XMLQUERYFunktion auf gezielte Teile eines XML-Dokuments zugreifen wollen, keinen Mehrwert von eventuell vorhandenen Indexen. Weitere Einschränkungen zur Verwendung von User-DefinedXML-Indexen finden sich in [NK09]. Wegen dieser Restriktionen ist für die in Abschnitt 8.2.2 durchgeführten Messreihen zum indexunterstützten Zugriff ein Statement mit enthaltenem XMLEXISTS-Prädikat gewählt worden. Dies gilt ebenfalls für die Messreihen aus Abschnitt 8.2.4 und leicht abgewandelt auch für die aus Abschnitt 8.2.3. Letztere zielt zwar primär darauf ab, mithilfe einer nicht „indexfähigen“ XMLQUERY-Funktion ein „textblock“-Element mit einem bestimmten „id“Attributwert aus dem Testdatenbestand herauszuselektieren. Durch die Verwendung des XMLEXISTS-Prädikat ist es aber möglich, die Ergebnismenge zumindest indexunterstützt soweit einzuschränken, dass mit der XMLQUERY-Funktion anschließend nur noch aus dem tatsächlich relevanten XML-Dokument das gewünschte „textblock“-Element herausgefiltert werden muss. Diese Art Workaround kann auch in anderen Szenarien durchaus Sinn machen, in denen „normalerweise“ kein indexunterstützter Zugriff möglich wäre. 133 8 Query Performance 8.1.2 Statistiken zu XML-Daten DB2 verwaltet in Form von diversen Katalogtabellen Statistiken zu verschiedenen Objekten auf unterschiedlichster Ebene. Dazu zählen beispielsweise Statistiken für Tablespaces, Tabellen, Indexe und Spalten. Alle diese Statistiken können mithilfe des RUNSTATS-Utilities entweder auf Ebene von Tablespaces oder Indexen gesammelt werden. Dies gilt sowohl für traditionelle als auch für XML-Statistiken. Allgemein ist bei der Betrachtung von Statistiken zwischen zwei Arten zu unterscheiden. Zum einen gibt es Statistiken, die vom DB2 Optimizer für die Erstellung von Zugriffsplänen genutzt werden. Um eine möglichst hohe Query Performance zu erzielen, empfiehlt es sich, diese für neue Objekte zeitnah zu erstellen und für bestehende regelmäßig zu aktualisieren. Die andere Form der Statistiken sind Space-Statistiken. Diese werden beispielsweise vom Administrator genutzt, um die Speicherverwaltung innerhalb des Datenbankmanagementsystems zu überwachen (Space Monitoring). Die weiteren Betrachtungen dieses Abschnitts konzentrieren sich, aufgrund ihrer höheren Relevanz für das Thema Query Performance, ausschließlich auf die zuerst erwähnte Form der für Zugriffspläne relevanten Statistiken. [Smi07] Im Gegensatz zu den im letzten Abschnitt betrachteten speziellen XML-Indexen existieren, bezogen auf die für Zugriffspläne relevanten Statistiken, bislang nur geringfügige XMLspezifische Erweiterungen in DB2. So ist es hier zwar in Relation zu beispielsweise CLOBDaten möglich, derartige Statistiken zu den gespeicherten XML-Dokumenten zu sammeln [IBM08a]. Die Möglichkeiten dieser Datenerhebung sind allerdings verglichen mit traditionellen Statistiken erheblich geringer. Für das RUNSTATS- Utility resultieren daher diverse Einschränkungen bei der Statistikerstellung zu den nativen XML-Strukturen. Beispielsweise lassen sich für das „RUNSTATS TABLESPACE“-Utility auf einem XML-Tablespace die Optionen COLGROUP, FREQVAL und HISTOGRAM nicht nutzen. Ebenso stehen für die per „RUNSTATS INDEX“ aktualisierbaren Statistiken zu einem User-Defined-XML-Index oder implizit erstellten NodeID-Index die Optionen KEYCARD, FREQVAL und HISTOGRAM nicht zur Verfügung. Genaue Informationen zur deren jeweiliger Bedeutung finden sich in [IBM08a]. Eine Konsequenz der zuvor beschriebenen Einschränkungen ist beispielsweise, dass für die Verteilung von in XML-Dokumenten indexierten Werten stets die Gleichverteilung angenommen wird. Das wiederum kann zur Folge haben, dass bei einer großen Anzahl an unterschiedlichen Werten auch für sehr häufige Werte ein Indexzugriff erfolgt und umgekehrt bei 134 8 Query Performance einem sehr kleinen Wertebereich kein Index bei dem Zugriff auf sehr seltene Werte zu Hilfe gezogen wird. Der letztere Fall lässt sich bei der „XML (mit 3 Indexen)“-Messreihe zu Abschnitt 8.2.4 beobachten. Hier wird der Index nur für die Merkmalsausprägung „1K x 100.000“ verwendet, danach nicht mehr. Nähere Details hierzu finden sich in Abschnitt 8.2.4 beziehungsweise in den Abbildungen zu den jeweils verwendeten Zugriffsplänen im Anhang dieser Arbeit. Neben den betrachteten Statistiken stellt DB2 seit Version 7 auch Echtzeitstatistiken (Real Time Statistics) bereit. Dabei handelt es sich um in-memory Statistiken, die in bestimmten Zeitintervallen – per Default alle 30 Minuten – in die Katalogtabellen SYSTABLESPACESTATS und SYSINDEXSPACESTATS externalisiert werden können. Vom Informationsgehalt her bestehen Echtzeitstatistiken in DB2 aus den Bestandteilen: Kenngrößen zur REORG-Notwendigkeit, Kenngrößen zur RUNSTATS-Notwendigkeit, Kenngrößen zur „IMAGE COPY“-Notwendigkeit und globalen Kenngrößen. Konkrete Details zur Zusammensetzung der Echtzeitstatistiken sollen an dieser Stelle nicht geschildert werden. Weitere Ausführungen dazu finden sich in [Smi07]. Wichtig ist, dass diese Echtzeitstatistiken in ihrem vollen Umfang, jedoch ohne spezifische Erweiterungen, auch für die Strukturen des nativen XML-Datentyps verfügbar sind. Hier gilt es aber anzumerken, dass DB2 aktuell Echtzeitstatistiken nicht zur Zugriffsplanerstellung verwendet [Smi07]. In Zukunft soll aber mithilfe dieser Statistiken unter anderem speziell das Ziel verfolgt werden, eine Alternative zu aufwändig per RUNSTATS zu erstellenden Statistiken zu erhalten, die ebenfalls vom Optimizer zur Generierung von effizienten Zugriffsplänen genutzt werden kann. In der Nachfolgeversion 10 des hier betrachteten DB2 gibt es dahingehend erste Implementierungen, die die alternative Verwendung von Echtzeitstatistiken bei der Zugriffsplanerstellung erlauben. Nähere Informationen dazu finden sich in [IBM11t]. 135 8 Query Performance 8.1.3 Zugriffspläne Zugriffspläne beschreiben eine Folge von internen Operationen, die dazu nötig sind, ein spezielles SQL-Statement intern auszuführen. Die genaue Bildung beziehungsweise der Aufbau eines Zugriffsplans wird vom Optimizer in Abhängigkeit von den aktuell vorliegenden Statistiken (siehe Abschnitt 8.1.2) kostenbasiert generiert. Hier lässt sich vereinfacht folgende Regel formulieren: Je aktueller die Statistiken sind, desto optimaler erfolgt die Auswahl des Zugriffsplans durch den Optimizer und umso genauer sind die durch ihn vorberechneten Abschätzungen. Auch wenn die Optimierungen und Abschätzungen des Optimizers in der Regel qualitativ und genau sind, gibt es Fälle, bei denen ein manuelles Tuning durch den Administrator oder Performance-Experten angebracht ist. Um diese Aufgaben erfüllen zu können, muss es möglich sein, den Zugriffsplan eines Statements einzusehen. Dazu gibt es in DB2 die ExplainFunktionalität, die einen Zugriffsplan innerhalb der Tabelle PLAN_TABLE40 datenbankseitig persistiert [NK09]. Die dort abgespeicherten Informationen können anschließend auf verschiedenen Wegen dargestellt werden. Eine der optisch ansprechendsten Varianten ist dabei die grafische Darstellungsform der IBM-Komponente Visual Explain. Wie bereits in Abschnitt 3.4.2 beschrieben, ist dieses Tool auch in der Lage, den Explain-Prozess für beliebige SQLStatements auszuführen und somit die PLAN_TABLE auf einfache Weise zu befüllen. Daher wurde es auch für die Erstellung der zu Abschnitt 8.2 angefertigten Zugriffsplandiagramme verwendet. Neben dem Einsatz von Visual Explain gibt es noch weitere Möglichkeiten, einen Zugriffsplan darzustellen. Auf diese soll in den nachfolgenden Betrachtungen aber nicht konkreter eingegangen und auf [IBM11u] verwiesen werden. Wie bereit eingangs des Abschnitts beschrieben, setzt sich ein Zugriffsplan (mit beteiligten XML-Strukturen) aus mehreren internen Operatoren zusammen. Hierzu zählen insbesondere vier spezielle XML-Operatoren, die im Folgenden kompakt anhand [NK09] beschrieben werden. DIXSCAN (DocID Index Scan) Bei diesem Zugriff wird abhängig von einer gegebenen DocID über den zugehörigen DocID-Index ein Record Identifier (RID) ermittelt und zurückgegeben. 40 und einigen anderen Tabellen 136 8 Query Performance XIXAND (XML Index ANDing) Mithilfe des XIXAND-Operators kann die Schnittmenge aus zwei sortierten DocID-Listen bestimmt werden. XIXOR (XML Index ORing) Der XIXOR-Operator hat eine ähnliche Funktion wie der XIXAND-Operator. Statt der Schnittmenge bestimmt er allerdings die Vereinigungsmenge von zwei verschiedenen sortierten DocID-Listen. XIXSCAN (XML Index Scan) Dieser Operator beschreibt den Zugriff auf einen User-Defined-XML-Index, bei dem abhängig von einem gegebenen Schlüsselwert die zugehörigen Paare von DocID und NodeID zurückgegeben werden. Die zuvor betrachteten Operatoren stehen alle in direktem oder indirektem Bezug zu den in Abschnitt 8.1.1 beschriebenen User-Defined-XML-Indexen. Während die DIXSCAN- und XIXSCAN-Operatoren bei jedem durch einen solchen Index unterstützten Zugriff Verwendung finden, ist dies für die Operatoren XIXAND und XIXOR nicht der Fall. Letztere werden nur in Zusammenhang mit speziellen XPath-Ausdrücken benutzt. Eine ausführliche Erklärung dazu findet sich in [NK09]. An dieser Stelle soll weiterhin die Verwendung der Operatoren DIXSCAN und XIXSCAN beispielhaft diskutiert werden. Dazu zeigt Abbildung 57 den Zugriffsplan zu der in Abschnitt 8.2.3 beschriebenen Messreihe „XML (mit 3 Indexen)“ für die Merkmalsausprägung „10K x 10.000“. Dieser ist bezüglich der internen Abarbeitungsreihenfolge von unten (links) nach oben zu lesen. Das Ziel des zu dem Zugriffsplan gehörenden Statements besteht darin, mit der XMLQUERY-Funktion effizient auf ein „textblock“-Element mit einer bestimmten „id“ zuzugreifen. Dazu wird der gesamte Datenbestand einer XML-Spalte durch ein XMLEXISTSPrädikat auf genau ein relevantes XML-Dokument projiziert und aus diesem dann anschließend das gewünschte „textblock“-Element herausgesucht. Nähere Details sind für die anschließenden Betrachtungen nicht nötig. Das komplette Statement findet sich im Anhang zu Abschnitt 8.2.3. 137 8 Query Performance Abbildung 57: Beispiel für einen Zugriffspfad mit verwendetem User-Defined-XML-Index Zuerst erfolgt für das XMLEXISTS-Prädikat ein XIXSCAN-Zugriff auf den zu der Tabelle TXML_10K gehörenden User-Defined-XML-Index IDX_ID_TXML_10K, der insgesamt 860.000 Werte indexiert hat. Anhand der Tupelanzahl der Tabelle TXML_10K (10.000) und der FIRSTKEYCARD41 (43) werden aufgrund der generell im XML-Kontext angenommenen Gleichverteilung insgesamt rund 233 (10.000/43) relevante DocIDs abgeschätzt. Zu diesen ungefähr 233 DocIDs erfolgt daraufhin über den DocID-Index per DIXSCAN-Operator die Ermittlung von circa 233 RIDs. Anhand dieser RIDs können anschließend die relevanten Tupel der Tabelle TXML_10K „gefetcht“ werden. Erst jetzt findet für die (Ergebnis-)Tupel die restliche Verarbeitung des Statements inklusive der Anwendung der XMLQUERY-Funktion statt, wonach dann die Abarbeitung des gesamten SELECTs abgeschlossen ist. Hier soll nochmals der Nachteil der Gleichverteilung angemerkt werden, welche bei der XML-Verarbeitung stets angenommenen wird. Im Gegensatz zu dem abgeschätzten Ergebnis von 232 Tupeln besteht das tatsächliche Resultat aus nur einem Tupel. 41 Die FIRSTKEYCARD entspricht der Anzahl an unterschiedlichen indexierten Werten (der ersten Spalte) eines Indexes [IBM11a]. 138 8 Query Performance 8.2 Analyse der Query Performance Für die native XML-Speicherung ergeben sich gegenüber der nicht-nativen Ablageform viele Möglichkeiten, auf spezielle Weise Informationen aus den gespeicherten XML-Dokumenten auszulesen. Die wichtigsten in diesem Zusammenhang denkbaren Optionen sollen hinsichtlich ihrer Performance in dem vorliegenden Abschnitt in Form der Szenarien Komplettzugriff, Indexunterstützter Zugriff, Selektiver Zugriff und Komplexe Prädikate genauer untersucht werden. Während es sich bei den letzten drei Szenarien tatsächlich um XML-spezifische Messreihen handelt, gilt dies für die zuerst aufgeführte Variante des Komplettzugriffs nicht. Diese repräsentiert den typischen Zugriff auf XML-Dokumente, wie er zum aktuellen Zeitpunkt aufgrund der nicht-nativen XML-Speicherform in der DATEV üblich ist. In dieser Hinsicht soll überprüft werden, ob die Verwendung des nativen XML-Datentyps auch für solche Anwendungen Effizienzvorteile bietet, die datenbankseitige (noch) keine XMLFunktionalitäten nutzen. Bereits durch die zuletzt angefügte Bemerkung lässt sich erahnen, dass innerhalb der einzelnen Szenarien stets verschiedene Formen der XML-Speicherung gegenübergestellt werden. Im Detail erfolgt die Betrachtung der Vergleichsformen XML-Speicherung nicht-nativ als CLOB, XML-Speicherung nicht-nativ als VARCHAR, native XML-Speicherung und native XML-Speicherung mit Indexen. Hierzu sollen in Verbindung mit den oben aufgeführten Szenarien zwei generelle Anmerkungen getroffen werden. Zum einen können, wie bereits erwähnt, nicht-nativ gespeicherte Dokumente nicht XML-spezifisch verarbeitet werden42. Sofern eine solche Verarbeitung aber notwendig ist, wird sie momentan nicht datenbankseitig, sondern innerhalb der DATEV-Anwendungen ausgeführt. Dazu müssen die nicht-nativ gespeicherten XML-Dokumente komplett aus DB2 ausgelesen, anschließend anwendungsseitig geparst und danach wie gewünscht verarbeitet werden. 42 Die Funktionalitäten des DB2-XML-Extenders werden hier gemäß Kapitel 1 nicht betrachtet. 139 8 Query Performance Für die Gegenüberstellungen in Abschnitt 8.2.2, 8.2.3 und 8.2.4 wird daher für die Vergleichsformen der nicht-nativen Speicherformen stets der Zeitaufwand eines Komplettzugriffs aus Abschnitt 8.2.1 angenommen. Dazu sind nachträglich die Kosten für den anwendungsseitigen XML-Parse-Prozess und die anwendungsseitige XML-Verarbeitung hinzu zu addieren. Diese sind jedoch stark von der Anwendung, den darin verwendeten XML-Parsern und weiteren Faktoren abhängig, sodass für die anwendungsseitigen Prozesse aufgrund der zu umfangreichen Einflussfaktoren im Rahmen der vorliegenden Arbeit keine Messdaten erhoben werden können. Die zweite Anmerkung bezieht sich auf die zur Vergleichsform „Native XML-Speicherung mit Indexen“ jeweils verwendeten User-Defined-XML-Indexe. Diese sind in Analogie zu den bereits in Abschnitt 6.3 zum Thema Indexpflege untersuchten Indexen gewählt worden. Insbesondere für Informationen zu der von den Indexen jeweils indexierten Knotenanzahl oder den zu ihrer Erstellung notwendigen SQL-Statements wird daher auf Abschnitt 6.3 verwiesen. In Anlehnung an die Performance-Analysen aus den vorangehenden Kapiteln orientieren sich auch die hier durchgeführten Messreihen an den Vorbetrachtungen aus Kapitel 5. Bis auf gewisse Einschränkungen werden alle dort vorgestellten Vergleichskriterien in die weiteren Untersuchungen einbezogen. Abstriche sind dabei lediglich für das Kriterium der Strukturiertheit vorgenommen worden, da sich die dazugehörigen Testdaten aufgrund ihrer starken Strukturunterschiede für die betrachteten speziellen XPath-Abarbeitungen nicht eignen. In ähnlicher Weise wird, abgesehen von den Messreihen in Abschnitt 8.2.1, bei den anderen Vergleichskriterien die Merkmalsausprägung „200B x 500.000“ nicht betrachtet. Dies begründet sich durch den kaum vorhandenen Inhalt, den die XML-Dokumente jener Ausprägung über ihre XML-Deklaration hinaus besitzen. Da sie nämlich kein einziges „textblock“-Element enthalten, sind sie für die an diesem Knoten ansetzenden Messreihen (aus den Abschnitten 8.2.2, 8.2.3 und 8.2.4) nicht geeignet. Generell ist bei den Untersuchungen zur Query Performance folgendes zu beachten. Die Kommunikation von XML-Dokumenten zwischen DB2 und externen Anwendungen findet stets in serialisierter Form statt [IBM07]. Das heißt, unabhängig davon ob XML-Dokumente nativ oder nicht-nativ in DB2 abgespeichert sind, werden sie stets in nicht-nativer Form nach außen hin kommuniziert. Daher verstehen sich die zu den nativen Speicherformen erhobenen Messergebnisse in den Abschnitten 8.2.1 und 8.2.3 inklusive der Kosten für den Prozess der XML-Serialisierung (siehe Abschnitt 3.1.2). Bei den Messreihen zu den Abschnitten 8.2.2 und 140 8 Query Performance 8.2.4 wird dieser Effekt durch die Verwendung der COUNT-Funktion verhindert. Hier sind im Ergebnis des SELECT-Statements keine XML-Dokumente enthalten, weshalb demzufolge auch keine Serialisierung stattfinden muss. DB2 Version 10 ermöglicht in Bezug auf das „Serialisierungsproblem“ teilweise auch die binäre Form der XML-Kommunikation und verzichtet in diesem Zusammenhang beim externen Datenzugriff auf den Prozess der Serialisierung. Nähere Details dazu wurden bereits in Abschnitt 6.2 erwähnt. Abschließend sei noch darauf hingewiesen, dass für die in den weiteren Abschnitten betrachteten Messreihen im Gegensatz zu den bislang durchgeführten Performance-Messungen stets zusätzlich Diagramme zu den jeweils vom DB2 Optimizer gewählten Zugriffsplänen erstellt wurden. Sie befinden sich allerdings aus Umfangsgründen mit Ausnahme des bereits in Abschnitt 8.1.3 diskutierten Zugriffsplans im Anhang dieser Arbeit. 8.2.1 Komplettzugriff Die Messreihe Komplettzugriff vergleicht, wie bereits eingangs von Abschnitt 8.2 beschrieben, die native XML-Ablageform mit den nicht-nativen Varianten in Bezug auf die Performance, mit der auf komplette XML-Dokumente in DB2 zugegriffen werden kann. Diese Gegenüberstellung basiert auf dem Hintergrund, dass DATEV-Anwendungen zum aktuellen Zeitpunkt (nicht-nativ gespeicherte) XML-Dokumente stets vollständig auslesen und erst anwendungsseitig weiterverarbeiten. Hier stellt sich die Frage, ob die native XML-Speicherung auch in diesem Kontext effizienter ist als die nicht-native Ablage als CLOB- oder VARCHAR-Dokument. Zur Beantwortung werden in den folgenden Messreihen stets die kompletten Testdatenbestände zu den einzelnen Kriterien pro Merkmalsausprägung ausgelesen und im Fall der nativen XML-Speicherung gemäß den obigen Ausführungen zu einem CLOB-Dokument43 serialisiert. Demzufolge können die zur Messreihe der nativen XML-Verarbeitung ermittelten Ergebnisse gleichzeitig als Abschätzung für die Effizienz des XML-Serialisierungsprozesses interpretiert werden. Da es sich bei diesem Vorgang um das „Gegenstück“ zum XML-Parse-Prozess handelt, wird in den weiteren Ausführungen unter dem Gesichtspunkt Performance speziell auf deren Gemeinsamkeiten und Unterschiede eingegangen. 43 Der CLOB-Datentyp ist aufgrund seiner größeren maximalen Länge notwendig (siehe Abschnitt 6.1.2). 141 8 Query Performance Zu dem hier betrachteten Szenario sind folgende, den Vorbetrachtungen aus Kapitel 5 unterliegende Messungen und Variationen durchgeführt worden. Größe und Anzahl (CLOB, VARCHAR, XML und XML (mit 3 Indexen)) Strukturiertheit (CLOB und XML) Zusammensetzung (XML) In den nachstehenden Abschnitten sollen die Ergebnisse analysiert werden. Zusätzliche Informationen zum konkreten Aufbau der Messprozedur, zu den einzelnen Ergebnistabellen inklusive den Messwerten der Elapsed-Zeit sowie zu den Diagrammen zu den vom DB2 Optimizer jeweils gewählten Zugriffsplänen sind dabei aus Umfangsgründen und gemäß den Bemerkungen aus Kapitel 5 in den Anhang dieser Arbeit ausgelagert. Größe und Anzahl (CLOB, VARCHAR, XML und XML (mit 3 Indexen)) Hinsichtlich des Kriteriums der Größe und Anzahl ergeben sich für die Messreihe zum Szenario Komplettzugriff die in Abbildung 58 dargestellten Kurvenverläufe. Darin lassen sich zwei Auffälligkeit bezogen auf die in dieser Arbeit bereits durchgeführten Performance-Analysen erkennen. Zuerst einmal erinnern die Kurvenverläufe der VARCHAR- und der CLOBMessreihe stark an die diesen Datentypen zugehörigen Ergebnisse aus Abschnitt 6.1.1. Demnach lässt sich vereinfacht feststellen: Je länger ein INSERT von VARCHAR- oder CLOBDokumenten andauert, umso mehr Zeit benötigt auch der anschließende Zugriff auf die Daten. Für eine ausführliche Deutung dieser beiden Kurvenverläufe wird aus Analogiegründen auf Abschnitt 6.1.1 verwiesen. 142 8 Query Performance 25 20 Sekunden CPU - CLOB 15 CPU - VARCHAR 10 CPU - XML 5 CPU - XML (mit 3 Indexen) 0 200B x 1K x 10K x 100K x 500.000 100.000 10.000 1.000 1M x 100 10M x 10 Größe und Anzahl Abbildung 58: Messergebnis – Komplettzugriff – Größe und Anzahl – CPU-Zeit Die zweite Auffälligkeit besteht in den Kurvenverläufen der beiden Messreihen zur nativen XML-Verarbeitung. Hier gibt es zwar erwartungsgemäß keine Unterschiede zwischen der Messreihe mit Indexen und der ohne Index. Dennoch zeigt sich für die Performance des Serialisierungsprozesses im Vergleich zur Performance des quasi „Umkehrprozesses“ XMLParsen eine nur minimal fallende Kurve der CPU-Zeit. Daraus lässt sich schließen, dass die Performance der Funktion XMLSERIALIZE weniger stark von der Größe der zu verarbeitenden Dokumente abhängt, als es für den XML-Parse-Prozess der Fall ist (siehe Abschnitt 6.1.4). Damit in Verbindung steht vor allem die Komplexität der einzelnen Vorgänge. Während der Serialisierungsprozess auf einfache Weise XML-Dokumente nach bestimmten Regeln von der internen Struktur in eine textuale Form transformiert, gilt dies für den Vorgang des XMLParsens nicht. Hier finden zusätzlich zur Transformation der XML-Dokumente in ein internes binäres Format noch weitere Aktionen statt, die pro Parse-Prozess ausgeführt werden und somit entsprechenden Overhead verursachen. Dazu zählen beispielsweise das Prüfen der XMLDokumente auf Wohlgeformtheit oder, falls spezifiziert, deren Validierung gegen ein definiertes XML-Schema. 143 8 Query Performance Strukturiertheit (CLOB und XML) Das Ergebnis der Strukturiertheitsmessung bei dem Szenario Komplettzugriff zeigt verglichen mit der Performance-Analyse des Parse-Prozesses interessanterweise eine Gemeinsamkeit und einen Unterschied auf (siehe Abbildung 59). So lässt sich hier die Aussage aufgreifen, dass Textknoten schneller als Elementknoten und diese wiederum schneller als Attributknoten serialisiert werden können. Keinen oder zumindest kaum einen Unterschied macht dagegen die Art der Verknüpfung der Knoten eines XML-Dokuments. Die Serialisierung von tiefen, flachen und balancierten nativen XML-Dokumenten nimmt ungefähr gleich viel Zeit in Anspruch. Bei der Untersuchung des Parse-Prozesses hingegen zeigte sich noch ein erhöhter Aufwand für die Verarbeitung von flachen XML-Dokumenten. Die Ursache für diese Abweichung wird in der Arbeitsweise der XMLSERIALIZE-Funktion vermutet, zu der jedoch keine näheren Informationen veröffentlicht sind. 30 Sekunden 25 20 15 10 CPU - XML 5 CPU - CLOB 0 Strukturiertheit Abbildung 59: Messergebnis – Komplettzugriff – Strukturiertheit – CPU-Zeit In Relation zu dem SELECT der gleichen Dokumente, die nicht-nativ in Form des CLOBDatentyps gespeichert sind, resultiert ein wesentlich höherer Aufwand (siehe Abbildung 59), der aber insgesamt mit Ausnahme der zwei Spitzen der Merkmalsausprägungen „A“ und „A, T“ immer noch relativ gering ausfällt. Insgesamt gesehen kann durch die hier durchgeführten Untersuchungen der Modellierungshinweis aus Abschnitt 6.1.4, also Attributknoten an geeigneten Stellen durch Element- oder Textknoten zu ersetzen, bestätigt werden. 144 8 Query Performance Zusammensetzung (XML) Bei der Betrachtung des Kriteriums der Zusammensetzung ergeben sich für das Szenario Komplettzugriff keine wesentlichen neuen Erkenntnisse. Abbildung 60 zeigt einen ähnlichen, jedoch kontinuierlicher und etwas stärker fallenden Kurvenverlauf der CPU-Zeit als die weiter oben durchgeführte Analyse zum Kriterium der Größe und Anzahl. Daraus lässt sich ableiten, dass es analog zu den Ausführungen aus Abschnitt 6.1.4 auch für den Serialisierungsprozess aus Performance-Perspektive Sinn machen kann, mehrere Entitätsausprägungen in ein gemeinsames XML-Dokument abzubilden. 5 4,5 4 Sekunden 3,5 3 2,5 2 CPU 1,5 1 0,5 0 1K 10K (x 100.000) (x 10.000) 100K (x 1.000) 1M (x 100) 10M (x 10) Zusammensetzung (und Anzahl) Abbildung 60: Messergebnis – Komplettzugriff – Zusammensetzung – CPU-Zeit 8.2.2 Indexunterstützter Zugriff Das hier betrachtete Szenario zielt darauf ab, die möglichen Effizienzgewinne aufzuzeigen, die durch die Verwendung eines User-Defined-XML-Index erzielbar sind. Wie bereits in Abschnitt 8.1.1 erwähnt, kann DB2 solche Indexe nur in Verbindung mit der XMLTABLE-Funktion oder dem XMLEXISTS-Prädikat nutzen. Für die untersuchten Messreihen ist dabei die zuletzt erwähnte Variante gewählt worden. 145 8 Query Performance Bezogen auf die Testdaten aus Abschnitt 5.1.1 oder die davon abgeleiteten Testdaten aus Abschnitt 5.1.3 wäre beispielsweise folgende Situation denkbar. Angenommen innerhalb des Datenbestands würde sich genau ein Musterdokument befinden, das demselben XML-Schema (siehe Abbildung 40) genügt wie die übrigen Dokumente. Der einzige Unterschied des Musterdokuments zu den anderen bestünde in den vergebenen „id“-Attributen der „seite“- und „textblock“-Elemente. Diesen ist im Fall des Musterdokuments stets der Präfix „muster_“ vorangestellt. Abbildung 61 visualisiert beispielhaft die ersten Zeilen eines derartigen Dokuments. <?xml version="1.0" encoding="UTF-8"?> <seite id="muster_seite1"> <textblock id="muster_textblock0" posx="10" posy="20" schriftart="arial" schriftgroesse="8" ...> Musterdokument </textblock> <textblock id="muster_textblock1" posx="50" posy="50" schriftart="arial" schriftgroesse="14" ...> Otto Normalverbraucher, Normweg 1, 00001 Normstadt </textblock> ... Abbildung 61: Ausschnitt aus dem „Musterdokument“ Nun soll folgende fachliche Anforderung bestehen. Der Anwender, der den beschriebenen Datenbestand verwaltet, hat vergessen, wo sich das zu den Daten gehörende Musterdokument befindet. Er vermutet zwar, dass es zusammen mit den anderen Dokumenten abgelegt ist, würde dies zur Sicherheit aber gerne nachprüfen. In diesem Szenario seien die „id“Attributknoten der „textblock“-Elemente indexiert. Deshalb kann der Anwender mithilfe einer gezielten SELECT-Abfrage unter Verwendung des XMLEXISTS-Prädikats alle Dokumente indexunterstützt effizient auf ein „textblock“-Element mit beispielsweise dem „id“-Attributwert „muster_textblock1“ durchsuchen. Für die anschließende Messreihe genügt gemäß den allgemeinen Ausführungen aus Abschnitt 8.2.2 die Anwendung der COUNT-Funktion. Ein XML-Serialisierungsprozess bleibt somit bei den Messreihen zur nativen XML-Speicherung aus. Für das vorangehende Beispiel beziehungsweise allgemein für den indexunterstützten Zugriff stellt sich die Frage, wie groß die Effizienzvorteile von User-Defined-XML-Indexen tatsächlich gegenüber den anderen Speicherformen ohne derartige Indexunterstützung sind. Um dies zu klären, wurden zu dem hier betrachteten Szenario folgende, den Vorbetrachtungen aus Kapitel 5 unterliegende Messungen und Variationen durchgeführt. 146 8 Query Performance Größe und Anzahl (CLOB, VARCHAR, XML und XML (mit 3 Indexen)) Zusammensetzung (XML) Im Weiteren sollen die Ergebnisse analysiert werden. Zusätzliche Informationen zum konkreten Aufbau der Messprozedur, zu den einzelnen Ergebnistabellen inklusive den Messwerten der Elapsed-Zeit sowie zu den Diagrammen zu den vom DB2 Optimizer jeweils gewählten Zugriffsplänen sind dabei aus Umfangsgründen und gemäß den Bemerkungen aus Kapitel 5 in den Anhang dieser Arbeit ausgelagert. Größe und Anzahl (CLOB, VARCHAR, XML und XML (mit 3 Indexen)) Die Untersuchungen zu dem Kriterium Größe und Anzahl zeigen, bezogen auf die möglichen Performance-Vorteile von User-Defined-XML-Indexen, ein eindeutiges Ergebnis. Das hierzu verwendete SELECT-Statement mit enthaltenem XMLEXISTS-Prädikat wird für die Messreihe „XML (mit 3 Indexen)“ um ein Vielfaches schneller ausgeführt als für alle anderen betrachteten Messreihen. Dabei lässt sich in Abbildung 62 für die CPU-Zeit im Gegensatz zu den anderen Messreihen ein ungefähr konstanter minimaler Zeitaufwand erkennen. 0,6 Sekunden 0,5 0,4 CPU - CLOB 0,3 CPU - VARCHAR 0,2 CPU - XML 0,1 CPU - XML (mit 3 Indexen) 0 10K x 10.000 100K x 1.000 1M x 100 10M x 10 Größe und Anzahl Abbildung 62: Messergebnis – Indexunterstützter Zugriff – Größe und Anzahl – CPU-Zeit 147 8 Query Performance Bei der Betrachtung von Abbildung 62 fällt auf, dass hier keine Messergebnisse zu der Merkmalsausprägung „1K x 100.000“ dargestellt sind. Dies ist bewusst so entschieden worden, da die in dieser Ausprägung ermittelten Werte speziell für die CLOB-Messreihe (siehe Abschnitt 8.2.1) sehr groß ausfallen. Wären diese in das abgebildete Diagramm einbezogen worden, hätten sich die Unterschiede in den weiteren Kurvenverläufen nicht mehr deutlich erkennen lassen. Demgegenüber sind die Messergebnisse in den Wertetabellen im Anhang der vorliegenden Arbeit vollständig für alle Merkmalsausprägungen verzeichnet. An dieser Stelle sei nochmals vermerkt (siehe Abschnitt 8.2), dass für die Messreihen der nichtnativen XML-Verarbeitung stets die Kosten des Komplettzugriffs als Vergleichswerte dienen. Demzufolge muss für die beiden Messreihen CLOB und VARCHAR noch ein zusätzlicher anwendungsseitiger Aufwand (Parsen und nach Musterdokument suchen) einbezogen werden, der notwendig ist, um die weiter oben geschilderte Auswertung vornehmen zu können. In diesem Zusammenhang ist auch die in Abbildung 62 dargestellte Ergebniskurve der Messreihe „XML“ in Relation zu den „nicht-nativen“ Messergebnissen durchaus als positiv zu bewerten, obwohl sie sich oberhalb der Kurvenverläufe zu den nicht-nativen Messreihen befindet. Weitere Details zu den Ergebnissen der einzelnen Messreihe sind der Abbildung 62 zu entnehmen und sollen hier nicht diskutiert werden. Zusammensetzung (XML) Für das Kriterium der Zusammensetzung zeigt sich bezogen auf das aktuell untersuchte Szenario ein ähnlicher Kurvenverlauf wie bereits bei der Betrachtung aus Abschnitt 8.2.1. Mit zunehmender Dokumentgröße fällt bei gleichzeitig konstant bleibendem Gesamtdatenvolumen die Kurve der CPU-Zeit ab. Aufgrund der angesprochenen Ähnlichkeit wird daher auf ein zusätzliches Diagramm verzichtet und auf Abschnitt 8.2.2 verwiesen. Hervorzuheben bleibt an dieser Stelle lediglich folgender Unterschied: Die aus den hier ermittelten Messergebnissen resultierende Kurve der CPU-Zeit fällt zu Beginn stärker und bereits ab der Merkmalsausprägung „1K x 100.000“ schwächer ab als bei der Untersuchung in Abschnitt 8.2.2. Insgesamt gesehen verursacht der auf diese Weise evaluierte indexunterstützte Zugriff für die Verarbeitung einer geringen Anzahl großer Dokumente weniger Aufwand als bei der Verarbeitung von vielen Dokumenten mit geringer Größe. Hieraus lässt sich folgern, dass auch für das aktuell betrachtete Szenario das Bündeln mehrerer Entitätsausprägungen in einem gemeinsamen 148 8 Query Performance XML-Dokument aus Performance-Perspektive durchaus sinnvoll sein kann. Die Unterschiede sind aber relativ gering. 8.2.3 Selektiver Zugriff Das Szenario Selektiver Zugriff evaluiert eine der großen Stärken der nativen XMLVerarbeitung. Mithilfe der XMLQUERY-Funktion ist es möglich, gezielt per XPath-Ausdruck auf spezifizierte Teile eines XML-Dokuments zuzugreifen, ohne dazu erst das gesamte XMLDokument aus DB2 auslesen zu müssen. Leider ist die Funktion nicht in der Lage, für den gezielten Datenzugriff vorhandene User-Defined-XML-Indexe zu verwenden. Dieser Sachverhalt fand bereits in Abschnitt 8.1.1 Erwähnung. Dort wurde auch darauf Bezug genommen, dass es in bestimmten Situationen Sinn machen kann, zusätzlich zur Verwendung der XMLQUERY-Funktion den zu verarbeitenden Datenbestand zuvor durch das „indexfähige“ XMLEXISTS-Prädikat einzuschränken. Diese Art Workaround wird auch für die hier betrachteten Messreihen verwendet, sodass für die dazugehörigen SELECT-Statements der in Abschnitt 8.1.3 beispielhaft beschriebene Zugriffsplan resultiert. Abbildung 63 zeigt ein solches SELECT-Statement für die Merkmalsausprägung „10K x 10.000“. SELECT XMLQUERY('$x/seite/textblock[@id="muster_textblock1"]' PASSING XML_DOC AS "x") FROM T24431A.TXML_10K WHERE XMLEXISTS('$x/seite/textblock[@id="muster_textblock1"]' PASSING XML_DOC AS "x"); Abbildung 63: Beispiel eines SELECT-Statements für selektiven Zugriff Bevor die Auswertung der Messreihen erfolgt, soll analog zu dem vorangehenden Abschnitt auch hier eine zu dem jeweils verwendeten Statement passende fachliche Anforderung konstruiert werden. Dazu sei wieder das Vorhandensein eines Musterdokuments (siehe Abschnitt 8.2.2) angenommen, dass in diesem Fall ein Anwender zur Orientierung benötigt, um die OCR-Software für das Einscannen neuartiger Dokumente zu kalibrieren. Da er diese Tätigkeit nicht zum ersten Mal ausführt, sind ihm die meisten Details des Musterdokuments noch von der letzten Kalibrierung in guter Erinnerung. Bei der Digitalisierung der Adressdaten der Belege – diese befinden sich stets im ersten „textblock“-Element – ist er jedoch, was deren Format angeht, etwas unsicher. Deshalb würde er sich gern anhand des entsprechenden 149 8 Query Performance „textblock“-Elements im Musterdokument vergewissern, ob er dieses Format richtig in Erinnerung behalten hat. Dazu schreibt er sich ein SELECT-Statement, in dem er mit der XMLQUERY-Funktion gezielt das „textblock“-Element mit dem „id“-Attributwert „muster_textblock1“ ausliest. Da ihm die Details der DB2-seitigen Unterstützung von UserDefined-XML-Indexen bekannt sind, verwendet er, um effizienter zu seinem gewünschten Ergebnis zu gelangen, weiterhin noch ein XMLEXISTS-Prädikat. Dadurch kann er die Ergebnismenge indexunterstützt auf das Musterdokument einschränken und muss anschließend nur noch in diesem mithilfe der XMLQUERY-Funktion nach dem gewünschten „textblock“Element suchen. Im Zusammenhang mit dem obigen Beispiel beziehungsweise allgemein für das Szenario Selektiver Zugriff stellt sich die Frage, welche Effizienzgewinne die native XML-Speicherung für den Fall des selektiven Zugriffs gegenüber den nicht-nativen Ablageformen bietet. Ebenfalls zu klären ist, ob und wenn ja in welchem Ausmaß der indexunterstützte Zugriff gegenüber der nativen XML-Speicherung ohne User-Defined-XML-Index Performance-Vorteile bietet. Um diese Fragestellungen zu klären sind zu dem hier betrachteten Szenario folgende, den Vorbetrachtungen aus Kapitel 5 unterliegende Messungen und Variationen durchgeführt worden. Größe und Anzahl (CLOB, VARCHAR, XML und XML (mit 3 Indexen)) Zusammensetzung (XML) Anschließend sollen die Ergebnisse analysiert werden. Zusätzliche Informationen zum konkreten Aufbau der Messprozedur, zu den einzelnen Ergebnistabellen inklusive den Messwerten der Elapsed-Zeit sowie zu den Diagrammen zu den vom DB2 Optimizer jeweils gewählten Zugriffsplänen sind dabei aus Umfangsgründen und gemäß den Bemerkungen aus Kapitel 5 in den Anhang dieser Arbeit ausgelagert. Größe und Anzahl (CLOB, VARCHAR, XML und XML (mit 3 Indexen)) Die für das Kriterium der Größe und Anzahl durchgeführten Untersuchung zum selektiven Zugriff auf Inhalte eines XML-Dokuments weichen insgesamt in ihren Ergebnissen nur geringfügig von den Resultaten aus Abschnitt 8.2.2 ab. Deshalb soll für vergleichende Aussagen zwischen den nicht-nativen und nativen Messreihen auf diesen Abschnitt verwiesen werden. 150 8 Query Performance Dies gilt auch für die Begründung zu der in Abbildung 64 nicht dargestellten Merkmalsausprägung „1K x 100.000“. 0,6 Sekunden 0,5 0,4 CPU - CLOB 0,3 CPU - VARCHAR 0,2 CPU - XML 0,1 CPU - XML (mit 3 Indexen) 0 10K x 10.000 100K x 1.000 1M x 100 10M x 10 Größe und Anzahl Abbildung 64: Messergebnis – Selektiver Zugriff – Größe und Anzahl – CPU-Zeit Bei genauerer Betrachtung von Abbildung 64 lässt sich für die Messreihen zur nativen XMLVerarbeitung eine Besonderheit gegenüber den in Abschnitt 8.2.2 diskutierten Ergebnissen erkennen, nämlich eine in fast allen Merkmalsausprägungen mit der Dokumentgröße ansteigende CPU-Zeit. Die Messzeiten zum nicht-nativen XML-Datenzugriff weichen gemäß den Vorbemerkungen zu Beginn von Abschnitt 8.2 nicht von den zuvor betrachteten Resultaten ab. Die Ursache für den erwähnten Anstieg bei den Messreihen „XML“ und „XML (mit 3 Indexen)“ lässt sich in der Abarbeitung der XMLQUERY-Funktion vermuten. Bis zu deren Ausführung kann DB2 mithilfe des XMLEXISTS-Prädikats die gesamte Ergebnismenge lediglich auf das in diesem Beispiel betrachtete Musterdokument einschränken. Anschließend wird dieses mittels der XMLQUERY-Funktion gezielt auf das gewünschte „textblock“-Element hin ausgewertet. Je größer dabei das Musterdokument ist, umso höher ist demzufolge auch der Aufwand des erwähnten Suchprozesses. Da die Größe des Musterdokuments aber ebenso wie das Ausmaß der anderen XML-Dokumente des Testdatenbestands mit jeder nachfolgend abgebildeten Merkmalsausprägung wächst, steigt ebenso auch der Gesamtaufwand des hier untersuchten SELECTStatements. Für die Messreihe „XML (mit 3 Indexen)“ sind die Kosten, die durch die indexbasierte Projektion per XMLEXISTS-Prädikat entstehen, im Übrigen gemäß den Ausführungen 151 8 Query Performance aus Abschnitt 8.2.2 äußerst geringfügig, sodass der Kurvenverlauf hier (fast) vollständig auf die nicht „indexfähige“ XMLQUERY-Funktion zurückzuführen ist. Zusammensetzung (XML) Die bei der Untersuchung zum Kriterium der Zusammensetzung gewonnenen Ergebnisse zeigen auch bei dem hier betrachteten Szenario eine durchgehend fallende Messkurve zur CPU-Zeit. Diese verläuft ebenfalls ähnlich zu der aus Abschnitt 8.2.1 und soll daher nicht durch ein zusätzliches Diagramm dargestellt werden. Stattdessen werden die sich zeigenden Abweichungen anschließend erläutert. Es ist anzumerken, dass im Unterschied zu dem Kurvenverlauf der CPU-Zeit in Abschnitt 8.2.1 die hier sichtbare Abflachung der CPU-Zeit sukzessive weniger wird und zum Ende hin bei der Merkmalsausprägung „10M x 10“ stagniert. Dieser Effekt ist auf den gleichzeitigen Anstieg der CPU-Zeit bei der vorher beschriebenen Untersuchung zum Kriterium der Größe und Anzahl zurückzuführen. Er resultierte aus dem erhöhten Aufwand, den die Abarbeitung von immer größer werdenden Dokumenten durch die XMLQUERY-Funktion in Anspruch nimmt. Da der Effekt sich gleichermaßen auf die Untersuchung zum Kriterium der Zusammensetzung auswirkt, wird die noch in Abschnitt 8.2.2 sichtbare Abflachung durch die wachsenden Kosten der XMLQUERY-Funktion immer stärker „gebremst“. Trotz der vorherigen Anmerkungen lässt sich insgesamt aber auch für das hier betrachtete Szenario folgendes formulieren. Der selektive Zugriff auf kumulierte XML-Dokumente ist effizienter als der Zugriff auf über mehrere XML-Dokumente verteilt gespeicherte Entitätsausprägungen. 152 8 Query Performance 8.2.4 Komplexe Prädikate Die hier durchgeführten Betrachtungen dienen der Untersuchung der Query Performance von SELECT-Abfragen, die in ihren WHERE-Klauseln44 komplexe Prädikate enthalten. DB2 unterscheidet Prädikate anhand der folgenden Kriterien. Einfache oder zusammengesetzte Prädikate Lokale oder Join-Prädikate Boolean-Ausdruck Nähere Details sowie eine granularere Einteilung von Prädikaten finden sich in [IBM11u] und sollen hier nicht betrachtet werden. Für den XML-Kontext ist an dieser Stelle wichtig, dass für die Statement-Ausführungen, vereinfacht gesprochen, zwischen „teuren“ (Stage 2) und „günstigen“ (Stage 1) Prädikaten unterschieden wird [IBM11u]. Das XMLEXISTS-Prädikat zählt dabei in allen möglichen Variationen (bezogen auf die XPath-Ausdrücke) zu den „Stage 2“-Prädikaten, ist allerdings trotzdem „indexable“ [IBM11u]. Der Begriff „komplexes Prädikat“ wird von IBM nicht speziell definiert. In dem hier betrachteten Zusammenhang betitelt er die komplexe Verknüpfung mehrerer XPath-Operatoren (AND und OR) zu einem XMLEXISTS-Prädikat. Dieses ist, wie in Abbildung 65 dargestellt, in das für die weiteren Untersuchungen verwendete SELECT-Statement integriert worden. Dabei wird mithilfe des XMLEXISTS-Prädikats der gesamte XML-Datenbestand auf eine dazu passende Teilmenge projiziert. Um analog zu Abschnitt 8.2.2 zu verhindern, dass bei der Ergebnisbildung zu dem SELECT-Statement ein XML-Serialisierungsprozess stattfindet, erfolgt auch hier die Anwendung der COUNT-Funktion. SELECT COUNT(*) FROM T24431A.TXML_100K WHERE XMLEXISTS( '$x/seite/textblock[(@pox=20 and @posy=10) or (@posx=10 and @posy=20)]' PASSING XML_DOC AS "x"); Abbildung 65: SELECT-Statement für das Szenario Komplexe Prädikate Das in Abbildung 65 dargestellte Statement könnte beispielsweise in der folgend beschriebenen Situation genutzt werden. Dazu sei wieder die Existenz des in den vorigen Abschnitten beschriebenen Musterdokuments vorausgesetzt. Nun sei angenommen, dass anstatt der typischen 44 Prädikate lassen sich allgemein für die WHERE-, HAVING- oder ON-Klausel spezifizieren. 153 8 Query Performance Vergabe der „id“-Attribute im Musterdokument nicht das Präfix „muster_“ verwendet wurde, sodass das Musterdokument in dieser Hinsicht identisch zu den anderen Dokumenten des Datenbestands konstruiert ist. Da aber ein Musterdokument auch ein einzigartiges erstes „textblock“-Element (mit dem „id“-Attributwert „textblock0“) beinhaltet (siehe Abbildung 61), kann es durch dieses noch immer von den anderen XML-Dokumenten unterschieden werden. Weiterhin sei die gleiche fachliche Anforderung wie in Abschnitt 8.2.2 vorausgesetzt. Somit besteht die Zielstellung darin, den Datenbestand nach dem Vorhandensein eines Musterdokuments zu durchsuchen. Die an den „id“-Attributwerten orientierte Vorgehensweise aus Abschnitt 8.2.2 führt nun leider nicht mehr zum gewünschten Ergebnis. Gemäß den obigen Bemerkungen existiert für die hier getätigten Annahmen kein Dokument, das ein „textblock“Element mit dem „id“-Attributwert „muster_textblock1“ enthält. Glücklicherweise kann sich der Anwender aber daran erinnern, dass das Musterdokument im Gegensatz zu den anderen Dokumenten ein einzigartiges erstes „textblock“-Element besitzt. Er weiß auch, dass sich dieses Element an der Position (10, 20) befindet, ist sich aber mit der Reihenfolge der Koordinaten nicht ganz sicher, sodass auch die Position (20, 10) in Frage kommt. Daher entscheidet er sich, einen XPath-Ausdruck zu schreiben, der mit einer OR-Verknüpfung beide Fälle abdeckt. Diesen bindet er in ein SELECT-Statement mit enthaltenem XMLEXISTS-Prädikat und verwendeter COUNT-Funktion ein. Dadurch ist es ihm möglich zu überprüfen, ob ein Musterdokument innerhalb des Datenbestands vorhanden ist. An dem obigen Beispiel setzen die Performance-Untersuchungen zu dem Szenario Komplexe Prädikate an. Diese sollen aufzeigen, wie effizient die Abarbeitung von Statements mit einem komplexen XMLEXISTS-Prädikat bei der nativen XML-Speicherform abläuft und welche Gewinne gegenüber der nicht-nativen Ablageform bestehen. Dazu sind folgende, den Vorbetrachtungen aus Kapitel 5 unterliegende Messungen und Variationen durchgeführt worden. Größe und Anzahl (CLOB, VARCHAR, XML und XML (mit 3 Indexen)) Zusammensetzung (XML) Anschließend sollen die Ergebnisse analysiert werden. Zusätzliche Informationen zum konkreten Aufbau der Messprozedur, zu den einzelnen Ergebnistabellen inklusive den Messwerten der Elapsed-Zeit sowie zu den Diagrammen zu den vom DB2 Optimizer jeweils gewählten Zugriffsplänen sind dabei aus Umfangsgründen und gemäß den Bemerkungen aus Kapitel 5 in den Anhang dieser Arbeit ausgelagert. 154 8 Query Performance Größe und Anzahl (CLOB, VARCHAR, XML und XML (mit 3 Indexen)) Die Messergebnisse der Messreihen zum Kriterium der Größe und Anzahl zeigen, dass das hier betrachtete Szenario Komplexe Prädikate, wie aufgrund dessen „Komplexität“ zu vermuten war, wesentlich höhere Kosten nach sich zieht als die zuvor untersuchten Messreihen. Dabei gilt für die in Abbildung 66 präsentierten Resultate, dass für die Messreihen zur nicht-nativen XMLSpeicherung wiederum die Kosten für den Komplettzugriff als Referenzwerte verwendet wurden. Dies basiert auf den Vorbemerkungen von Abschnitt 8.2, welche hier aber nicht nochmals thematisiert werden sollen. 18 16 14 CPU - CLOB Sekunden 12 10 CPU - VARCHAR 8 6 CPU - XML 4 2 CPU - XML (mit 3 Indexen) 0 1K x 100.000 10K x 10.000 100K x 1.000 1M x 100 10M x 10 Größe und Anzahl Abbildung 66: Messergebnis – Komplexe Prädikate – Größe und Anzahl – CPU-Zeit In Abbildung 66 zeigt sich bezüglich der Messreihen zur nativen XML-Verarbeitung neben den insgesamt in Relation zu den zuvor untersuchten Szenarien verhältnismäßig hohen Kosten aber auch ein ungewöhnlich starker Anstieg der CPU-Zeit von der ersten zur zweiten Merkmalsausprägung. Dieser erklärt sich allerdings bei einem Blick auf die in Abschnitt 6.3 erwähnte Anzahl an indexierten Knoten. Da genau auf jenen Knoten der innerhalb des hier verwendeten XMLEXISTS-Prädikats befindliche XPath-Ausdruck ausgewertet wird, ist der dabei resultierende Aufwand umso größer, je mehr Knoten mit OR und AND (siehe Abbildung 65) zu verknüpfen sind. Hier lässt sich eine gewisse Analogie zu den Kosten der Indexpflege in Abschnitt 6.3 erkennen. Genau wie dort steigt der Aufwand von der Merkmalsausprägung 155 8 Query Performance „1K x 100.000“ zur nächsten zusammen mit der Anzahl an indexierten/zu indexierenden Knoten stark an und verhält sich von dort an nahezu konstant. Speziell bei der Kurve zur Messreihe „XML (mit 3 Indexen)“ ist für den in Abbildung 66 dargestellten Kurvenverlauf noch eine andere Tatsache verantwortlich. Dazu ist an dieser Stelle ein Blick auf die sich im Anhang dieses Abschnitts befindlichen Zugriffsplandiagramme notwendig. Hier lässt sich erkennen, dass der DB2 Optimizer bei der aktuell betrachteten Messreihe nur für die Merkmalsausprägung „1K x 100.000“ die vorhandenen User-Defined-XML-Indexe verwendet. Für alle anderen Merkmalsausprägungen wählt er einen FULL TABLE SCAN. Diese Entscheidung ist allerdings ungünstig und resultiert aus der bereits angesprochenen unvorteilhaften Gleichverteilung, die für die indexierten XML-Knoten generell angenommen wird. Deshalb schätzt der DB2 Optimizer für die (Zwischen-)Ergebnismenge des XMLEXISTSPrädikats, entgegen dem tatsächlich immer einen Musterdokument, beispielsweise für die Merkmalsausprägung „10K x 10.000“ insgesamt rund 506 XML-Dokumente ab. Entsprechend kalkuliert er auch die Kosten für den indexunterstützten Zugriff und entscheidet sich für den FULL TABLE SCAN. Wie effizient für die weiteren Merkmalsausprägungen in diesem Zusammenhang die Verwendung der dafür vorgesehenen User-Defined-XML-Indexe wäre, lässt sich nur erahnen. Trotzdem kann hier aufgrund der Messergebnisse aus der Merkmalsausprägung „1K x 100.000“ vermutet werden, dass der indexunterstützte Zugriff auch für die Messungen zu den weiteren Ausprägungen wesentliche Effizienzvorteile bieten würde. Hinsichtlich des Vergleichs der Messreihen der nativen und nicht-nativen XML-Verarbeitung kann an dieser Stelle keine klare Aussage getroffen werden. Zwar zeigt Abbildung 66 deutlich höhere Kosten für den Zugriff auf die nativ abgelegten Daten. Hierbei muss aber berücksichtigt werden, dass die „komplexe“ Verarbeitung der nicht-nativen XML-Dokumente in dem betrachteten Fall erst noch anwendungsseitig inklusive eines zuvor notwendigen Parse-Prozesses erfolgen muss. Demnach hängt der tatsächliche Effizienzgewinn, den die native XMLSpeicherung in diesem Kontext (vielleicht) hat, stark von der Performance der anwendungsseitigen XML-Verarbeitung ab. Ohne Zusatzmessungen, auf die gemäß den Bemerkungen aus Abschnitt 8.2 aber verzichtet wurde, sind leider keine konkreteren Aussagen hierzu möglich. 156 8 Query Performance Zusammensetzung (XML) Entgegen den Ergebnissen zum Kriterium der Größe und Anzahl zeigen sich für die Untersuchungen zur Zusammensetzung wenig neue Erkenntnisse. Zwar sind auch hier die Kosten gegenüber den Messreihen aus den vorangehenden Abschnitten deutlich gestiegen. Der gesamte Kurvenverlauf der CPU-Zeit hebt sich jedoch nur geringfügig von den beispielsweise in Abschnitt 8.2.1 diskutierten Resultaten ab. Hierbei ist insgesamt ein nur sehr geringfügig abnehmender Aufwand erkennbar. Aus diesem lässt sich dennoch folgern, dass es, wie auch bei allen anderen in Abschnitt 8.2 betrachteten Szenarien, durchaus sinnvoll sein kann, zur Effizienzsteigerung mehrere Entitätsausprägungen innerhalb eines gemeinsamen XMLDokuments zusammenzufassen. Hinsichtlich des Gesamtaufwands sind die PerformanceGewinne aber trotzdem nur von geringfügiger Bedeutung. 157 9 Zusammenfassung und Bewertung von DB2 9 Zusammenfassung und Bewertung von DB2 Das folgende Kapitel dient dazu, einen zusammenfassenden Überblick über die in dieser Arbeit durchgeführten Performance-Untersuchungen zu geben. Dabei soll kategorisiert nach den drei Themenschwerpunkten Migration und Parsen, XML-Schema-Management und Query Performance sowohl auf die Ergebnisse der einzelnen Messreihen als auch auf die zum Teil festgestellten Schwachstellen der pureXML-Implementierung in DB2 eingegangen werden. Hinzu kommen an passender Stelle auch Informationen zu den bereits bekannten Verbesserungen in der Nachfolgeversion 10 des hier betrachteten DB2. Migration und Parsen Die Untersuchungen zum Themenschwerpunkt Migration und Parsen zeigen zwei wesentliche Ressourcenkonsumenten. Sowohl der XML-Parse-Prozess (mittels XMLPARSE) als auch der Konkatenationsprozess (mittels CONCAT) sind sehr aufwändig. Beide Prozesse bilden für einen Großteil der betrachteten Merkmalsausprägungen mit weitem Abstand den Hauptanteil der dabei verursachten Kosten. Während der Konkatenationsprozess allerdings nur in Migrationsszenarien Verwendung findet, ist der XML-Parse-Prozess ein dauerhafter Aufwandsfaktor, der bei jeder Datenmanipulation anzutreffen ist. Daher ist es speziell für letzteren wichtig, ihn stetig weiter zu optimieren beziehungsweise an geeigneten Stellen unnötig zu machen. Die Nachfolgeversion 10 des hier betrachteten DB2 versucht der Problematik vor allem durch die Funktionalitäten Binary XML (siehe Abschnitt 6.2) und XMLMODIFY (siehe Abschnitt 6.4) gerecht zu werden. Diese erlauben zum einen die binäre Kommunikation von bereits geparsten XML-Dokumenten und zum anderen „in-Document“-UPDATEs, sodass der Parse-Aufwand hier auf einen geringen Teil reduziert wird. Ausführliche Analysen dazu finden sich in [IBM11z]. Eine Zusammenfassung der Ergebnisse zur Thematik Migration und Parsen ist Abbildung 67 zu entnehmen. 158 Migration und Parsen 9 Zusammenfassung und Bewertung von DB2 Messreihe Ergebnisse/Bemerkungen „Einfaches Kopieren“ - bei gleichem Gesamtdatenvolumen höherer Aufwand zum „einfachen Kopieren“ kleiner Dokumente - „Seitenfüllgradproblem“ bei LOBs - kein Einfluss der Strukturiertheit und Zusammensetzung der XML-Dokumente Konkatenation - Konkatenation per Stored Procedure wesentlich effizienter als per Recursive SQL - erheblicher Einfluss, bereits ab 100 zu konkatenierenden Teilen der Hauptkostenfaktor einer Migration - kein Einfluss der Strukturiertheit und Zusammensetzung der XML-Dokumente UnicodeKonvertierung - quasi-linearer Aufwand bei dem Kriterium der Größe und Anzahl - kein Einfluss der Strukturiertheit und Zusammensetzung der XML-Dokumente XML-Parsen - Hauptanteil der Kosten einer Migration (ohne Konkatenation) von großen XML-Dokumenten (bei konstantem Gesamtdatenvolumen) - Struktur hat merklichen Einfluss - kumulierte (zusammengesetzte) XML-Dokumente lassen sich etwas schneller parsen als „Einzeldokumente“ Pflege von UserDefined-XML-Indexen - Indexpflegeaufwand ist stark abhängig von Anzahl indexierter/zu indexierenden Knoten - nachträgliche Index-Erstellung ist deutlich effizienter als automatische Indexpflege Abbildung 67: Zusammenfassung der Messergebnisse – Migration und Parsen XML-Schema-Management Das XML-Schema-Management stellt den größten Schwachpunkt von DB2 hinsichtlich der XML-Unterstützung dar. Wie bereits erläutert, bietet DB2 kaum Unterstützung zu den in Abschnitt 7.2 beschriebenen Anforderungen an das XML-Schema-Management. Sämtliche der gewünschten Funktionalitäten sind derzeit eigenständig „nachzubauen“. Das wiederum wirkt sich erheblich auf die Performance der Schemavalidierung aus, die beispielsweise gemessen an einem „nicht-validierenden“ INSERT mindestens das Vierfache an Aufwand benötigt. Dabei ist es irrelevant, welche Form der Validierung gewählt wird. Die Nachfolgeversion 10 des in dieser Arbeit betrachteten DB2 bringt allerdings auch hier wesentliche Verbesserungen. Nähere 159 9 Zusammenfassung und Bewertung von DB2 Details dazu wurden bereits in Abschnitt 7.3 erwähnt. Eine Zusammenfassung der Messergeb- XML-Schema-Management nisse zur Thematik XML-Schema-Management findet sich in Abbildung 68. Messreihe Ergebnisse/Bemerkungen Automatische Schemavalidierung - mit abnehmender XML-Dokumentanzahl bei konstantem Gesamtdatenvolumen geringer werdender Aufwand zur Validierung - in Relation zum „nicht-validierenden“ INSERT hoher Aufwand - Aufwand abhängig von der Komplexität des XMLSchemas Nachträgliche Schemavalidierung - effizienter als automatische Schemavalidierung - konstanter Aufwand zur Validierung - in Relation zum „nicht-validierenden“ INSERT hoher Aufwand - Aufwand abhängig von der Komplexität des XMLSchemas Abbildung 68: Zusammenfassung der Messergebnisse – XML-Schema-Management Query Performance Die Untersuchungen zum Thema Query Performance zeigen entgegen den anderen betrachteten Themenschwerpunkten durchgehend relativ positive Ergebnisse für die Performance des Datenzugriffs auf nativ gespeicherte XML-Dokumente (siehe Abbildung 69). Besonders hervorzuheben sind dabei die Effizienzvorteile von User-Defined-XML-Indexen und die Möglichkeit des selektiven Datenzugriffs. Als verbesserungsbedürftig haben sich allerdings die eingeschränkte Verwendbarkeit der genannten Indexe und die zum Teil unvorteilhaften Abschätzungen des DB2 Optimizers herausgestellt. So handelt es sich bei den User-Defined-XML-Indexen lediglich um Werteindexe mit generell angenommener Gleichverteilung, die nur in bestimmten Zusammenhängen (XMLTABLE-Funktion oder XMLEXISTS-Prädikat) verwendbar sind. An dieser Stelle bietet leider auch die Nachfolgeversion 10 des hier betrachteten DB2 keine grundlegenden Verbesserungen. 160 9 Zusammenfassung und Bewertung von DB2 Query Performance Messreihe Ergebnisse/Bemerkungen Komplettzugriff - abgesehen vom „Seitenfüllgradproblem“ ist Komplettzugriff von nativen XML-Daten deutlich teurer als von nicht-nativen - merklicher Einfluss der Strukturiertheit der XMLDokumente beim Zugriff auf nativ gespeicherte XMLDaten - kumulierte XML-Dokumente lassen sich schneller auslesen Indexunterstützter Zugriff - gezielte Verwendung von User-Defined-XML-Indexen kann erhebliche Performance-Vorteile bewirken - geringfügig effizienterer Zugriff auf kumulierte XMLDokumente Selektiver Zugriff - effiziente, nur zum Teil indexunterstützte Möglichkeiten zum selektiven Datenzugriff - geringfügig effizienterer Zugriff auf kumulierte XMLDokumente Komplexe Prädikate - komplexe Prädikate lassen sich auf Dokumentebene indexunterstützt auswerten - zum Teil unvorteilhafte Zugriffsplanauswahl durch den DB2 Optimizer - geringfügig effizienterer Zugriff auf kumulierte XMLDokumente Abbildung 69: Zusammenfassung der Messergebnisse – Query Performance Abschließend soll an dieser Stelle noch eine kurze Zusammenfassung zu den untersuchten Kriterien angeführt werden. So sei hinsichtlich des Kriteriums der Größe und Anzahl nochmals an das „Seitenfüllgradproblem“ erinnert, das für die Verarbeitung von kleinen LOB-Daten erhebliche Performance-Defizite nach sich zieht. Hier besteht großer Verbesserungsbedarf. Die Nachfolgeversion 10 des hier betrachteten DB2 versucht dieses Problem durch die „inline LOB“-Technik zu lösen, sodass kleine LOB-Dokumente wie eine Art VARCHAR-Dokument nicht in Auxiliary-Tabellen, sondern innerhalb der Basistabelle gespeichert werden. Was die Untersuchungen zum Kriterium der Strukturiertheit betrifft, haben sich vor allem Unterschiede bei der Verarbeitung der einzelnen Knotentypen aufgezeigt. Die hier betrachteten Fälle sind allerdings derart „extrem“, dass sie in realen Umgebungen nicht existieren. Die verbleibenden festgestellten Differenzen zwischen den Strukturen sind geringfügig. 161 9 Zusammenfassung und Bewertung von DB2 Zum Kriterium der Zusammensetzung gilt es anzumerken, dass zwar durchgehend ein abnehmender Performance-Aufwand für kumulierte XML-Dokumente festgestellt wurde. Dieser ist aber ebenfalls so geringfügig, dass er es nicht rechtfertigt, für die Datenmodellierung von Relevanz zu sein. Hier muss auch beachtet werden, dass in realen Umgebungen nur selten alle Informationen eines kumulierten XML-Dokuments benötigt werden. Denn zumeist wird detailliert nach einzelnen Entitätsausprägungen gesucht, sodass der übrige Teil eines kumulierten Dokuments mitunter unnötig verarbeitet werden würde. 162 10 Schlussbetrachtung 10 Schlussbetrachtung In der vorliegenden Arbeit sind diverse Performance-Untersuchungen zu den Themenschwerpunkten Migration und Parsen, XML-Schema-Management und Query Performance durchgeführt und in ihren Ergebnissen analysiert worden. Dabei haben sich neben wertvollen Vorteilen der pureXML-Implementierung in DB2 for z/OS aber auch Schwachstellen gezeigt, an denen es Optimierungsbedarf gibt. Ein großer Teil davon ist jedoch bereits erkannt und in der Nachfolgeversion 10 des hier betrachteten DB2 verbessert worden. Nichtsdestotrotz können mithilfe der nativen XML-Speicherung und -Verarbeitung auch in der vorliegenden DB2 for z/OS Version 9 diverse Anwendungsszenarien optimiert werden. Dazu sei unter anderem an das eingangs in Abschnitt 1.2 betrachtete Einstiegsbeispiel erinnert. Die dort angedachten Einsatzszenarien der neuartigen XML-Funktionalitäten könnten allesamt durch DB2 abgedeckt werden. Besonders große Vorteile sind dabei durch die Möglichkeit des selektiven, zum Teil indexunterstützten Datenzugriffs zu erwarten. Wie effizient aber beispielsweise die „konstruierte“ datenbankseitige XML-Schemavalidierung gegenüber der anwendungsseitigen arbeitet und ob sich der zusätzliche in Kauf zu nehmende XML-Parse-Aufwand tatsächlich für die gebotenen Vorzüge der nativen XML-Speicherung lohnt, bleibt zum aktuellen Zeitpunkt noch ungeklärt. Hier besteht ein geeigneter Ansatzpunkt für weiterführende Untersuchungen, bei denen beispielsweise an einer speziellen Anwendungs-Workload prototypisch die native der nicht-nativen XML-Speicherung und -Verarbeitung gegenübergestellt werden könnte. Insgesamt lassen sich anhand der hier gewonnenen Erkenntnisse die Design-Empfehlungen von IBM zur Speicherung von XML-Daten in DB2 bestätigen [IBM10c]. Abbildung 70 zeigt eine vereinfachte Darstellung dieser Empfehlungen, worin auch die in der vorliegenden Arbeit nicht betrachtete (nicht-native) XML-Speicherform der Dekomposition zu relationalen Daten einbezogen ist. Zusammenfassend kann festgehalten werden: Die native Speicherung von XMLDaten bietet genau dann Vorzüge gegenüber nicht-nativen Speicherformen, wenn zum einen die Anforderung der Suche beziehungsweise des selektiven Zugriffs auf diese Daten besteht und wenn zum anderen davon auszugehen ist, dass die Daten auch als XML-Dokument wieder ausgelesen und beispielsweise nicht nur archiviert werden sollen. 163 10 Schlussbetrachtung ? Suchen in XML Nein nicht-native XML-Speicherung Ja Rückgabe stets als XML Ja Nein relationale Speicherung (Dekomposition) native XML-Speicherung Abbildung 70: Design-Empfehlungen zur XML-Speicherform Abschließend lässt sich für die weitere XML-Strategie der DATEV folgendes Resümee ziehen. Obwohl die Möglichkeiten und Performance-Gewinne der nativen XML-Speicherung in DB2 in speziellen Szenarien klar sichtbar waren, zeigten sich aber auch deutliche Schwachstellen. Da diese in der Nachfolgeversion 10 des hier betrachteten DB2 zu großen Teilen beseitigt wurden, kann eine allgemeingültige Empfehlung zur nativen XML-Speicherung und -Verarbeitung erst nach erfolgreicher Prüfung in DB2 for z/OS Version 10 ausgesprochen werden. Für neue Projektanwendungen, die intern XML-Daten verarbeiten, ist es aber bereits jetzt sinnvoll, die Vorteile der nativen XML-Ablage in die Realisierungsplanungen einzubeziehen. 164 Abkürzungs- und Begriffsverzeichnis Basistabelle Als Basistabelle werden in dieser Arbeit stets Tabellen bezeichnet, für die explizit vom Nutzer eine Spalte vom VARCHAR-, LOB- oder XMLDatentyp definiert wurde. Zur Speicherung von LOB- und XML-Daten werden noch weitere Tabellen benötigt. Diese nennen sich LOB-Auxiliarybeziehungsweise XML-Auxiliary-Tabellen. BIGINT BIG INTeger Der BIGINT-Datentyp ist ein binärer Integer mit einer Genauigkeit von 63 Bits. Er deckt somit die komplette Spanne von -9223372036854775808 bis +9223372036854775807 ab. Binary-String Binary-Strings sind Folgen von Bytes. Verglichen mit Character-Strings sind sie nicht mit einer CCSID verknüpft. DB2 unterscheidet zwischen den Binary-String-Datentypen BINARY, VARBINARY und BLOB (der maximalen Länge nach geordnet). CA Detector Der CA Detector ist ein Tool zur Performance-Analyse in DB2. Er ermöglicht beispielsweise die gezielte Zuordnung von CPU- und Elapsed-Zeiten auf Statement-Ebene oder auch die Analyse von aufgetretenen SQLCODEs. (siehe Abschnitt 3.4.3) CCSID Coded Character Set Identifier Die CCSID ist eine 16-Bit lange Nummer. Sie identifiziert eine Vorschrift, mit der enkodierte Character-Strings zu interpretieren sind. Character-String Ein Character-String ist eine Folge von Bytes zur Speicherung einzelner Zeichen. Die dazu nötige Umsetzung erfolgt anhand eines Zeichensatzes (Enkodierschema, „encoding scheme“). Damit dieser bekannt ist, wird auf Tabellenebene eine CCSID definiert. Zeichensätze für Character-Strings sind beispielsweise EBCDIC oder Unicode. 165 CLOB Character Large OBject Ein CLOB ist eine Form des LOBs. Speziell handelt es sich um einen variabel langen Character-String. Ein CLOB hat maximal eine Länge von 2147483647 Bytes (2 Gigabytes - 1 Byte). Somit dient er der Speicherung großer Zeichenketten. Im Rahmen dieser Arbeit wird der CLOB-Datentyp besonders im Zusammenhang mit der nicht-nativen XML-Speicherung betrachtet. Constraint Ein Constraint ist eine Regel (Bedingung), die bei Datenmanipulationen berücksichtigt wird und die zu manipulierenden Werte einschränkt beziehungsweise überprüft. In DB2 existieren zum Beispiel UNIQUE-, Primärschlüssel-, Fremdschlüssel- oder auch CHECK-Constraints. CPU-Zeit „Central Processing Unit“-Zeit Die CPU-Zeit beschreibt die reine Rechenzeit, die zur Abarbeitung von Aktionen auf den CPUs der zSeries benötigt wird. (siehe Abschnitt 3.3) Data Sharing Data Sharing ist eine Funktionalität, die mehreren DB2-Subsystemen den Zugriff auf einen gemeinsamen, konsistent gehaltenen Datenbestand ermöglicht. Dabei setzt sie auf die „Parallel Sysplex“-Technologie und basiert auf dem Ansatz Shared Data. (siehe Abschnitt 5.2.2) Data Sharing Group Eine Data Sharing Group ist eine Gruppe von DB2-Subsystemen (Membern), die auf einem gemeinsamen Datenbestand („Shared Data“) arbeiten. DATEV eG Die DATEV eG ist ein Unternehmen, das IT-Dienstleistungen für Steuerberater, Wirtschaftsprüfer, Rechtsanwälte sowie deren Mandanten erbringt. (siehe Kapitel 2) DB2 for z/OS DB2 ist eine Familie von relationalen Datenbankmanagementsystemen, die durch IBM entwickelt und vertrieben wird. Die z/OS-Version des DB2 ist für den Einsatz auf dem Mainframe und dessen z/OS-Betriebssystem konzipiert worden. (siehe Abschnitt 3.2.1) 166 DDL Data Definition Language Unter DDL verstehen sich SQL-Anweisungen zur Definition (Erstellen, Strukturändern und Löschen) von Datenbankobjekten, wie beispielsweise Tabellen, Indexen oder anderen Strukturen. DECFLOAT DECimal FLOATing-Point DECFLOAT ist ein Datentyp zur Abbildung von Gleitkommazahlen. Er besitzt eine Genauigkeit von maximal 34 Dezimalstellen. Im Rahmen der vorliegenden Arbeit wird der DECFLOAT-Datentyp besonders im Zusammenhang mit den User-Defined-XML-Indexen betrachtet. Dekomposition Dekomposition bezeichnet das Zerlegen von XML-Dokumenten in relationale Strukturen. Die „xml collection“-Variante des XML-Extenders baut beispielsweise auf der Dekomposition auf. In der pureXML-Technologie findet dieses Prinzip bei Bedarf durch die XMLTABLE-Funktion ebenfalls Verwendung. DocID Document IDentifier Die DocID ist ein eindeutiger Identifikator für jedes einzelne XMLDokument. Sie wird über eine dedizierte Sequence vergeben. Die DocID findet sich sowohl in der Basistabelle als auch in der XML-Auxiliary-Tabelle als Spalte wieder. Zu deren Verknüpfung ist sie zusätzlich zentraler Bestandteil aller XML-Indexe. DocID-Index DocumentID-Index Dieser Index ist Teil der implizit für die native XML-Speicherung erzeugten Strukturen. Er umfasst die DocID-Spalte und dient in Kombination mit den User-Defined-XML-Indexen der Rückabbildung auf die Basistabelle. DTD Document Type Definition DTDs dienen dazu, die Struktur von XML-Dokumenten zu beschreiben. Aufgrund verschiedener Nachteile ist das Konzept DTD jedoch zunehmend durch das später vom W3C-Consortium empfohlene XML-Schema aus der Praxis verdrängt worden. 167 EBCDIC Extended Binary Coded Decimals Interchange Code EBCDIC ist ein Encoding-Schema, das unter anderem auf dem z/OS-System genutzt wird, um Character-Daten zu repräsentieren. Dieser Zeichensatz existiert in verschiedenen, teils länderspezifischen Ausführungen. Im Rahmen der vorliegenden Arbeit wird stets der Zeichensatz EBCDIC 273 betrachtet. Elapsed-Zeit Bei der Performance-Analyse gibt es in DB2 verschiedene Klassen von Elapsed-Zeiten. Sofern nicht anders kenntlich gemacht, bezeichnet ElapsedZeit in dieser Arbeit stets die Class 2 Elapsed-Zeit. Dies ist die Zeit, die insgesamt für die Abarbeitung von Aktionen innerhalb von DB2 benötigt wird. (siehe Abschnitt 3.3) Explain Explain betitelt den für die Analyse von Zugriffsplänen nötigen Vorgang zu deren Externalisierung. Dabei wird der durch den Optimizer berechnete Zugriffsplan in der PLAN_TABLE persistiert. I/O-Vorgänge Input/Output-Vorgänge Sobald sich angeforderte Datenbankseiten nicht im Bufferpool befinden, müssen I/O-Vorgänge ausgeführt werden, um diese vom Sekundärspeicher auszulesen. Umgekehrt sind ebenfalls I/O-Prozesse nötig, um aus dem Bufferpool verdrängte, geänderte Pages wieder auf den Sekundärspeicher zu schreiben. Zusätzlich dazu werden I/O-Vorgänge aber auch durch das Logging verursacht. IBM Data Studio Das IBM Data Studio ist ein von IBM entwickeltes und vertriebenes Datenbanktool. Es bietet seinen Anwendern verschiedene Funktionalitäten in den Bereichen Design, Entwicklung, Administration und Tuning. In seiner Basisversion ist es kostenfrei einsetzbar. (siehe Abschnitt 3.4.1) Inline-Datentyp Als Inline-Datentyp werden Datentypen bezeichnet, die ihre Datensätze ausschließlich in der Basistabelle ablegen. Damit wird die Größe eines InlineDatentyps durch die maximale Record Size beschränkt. In dieser Arbeit wird die Bezeichnung zumeist im Zusammenhang mit dem VARCHAR-Datentyp genannt. 168 JDBC Java DataBase Connectivity JDBC stellt eine einheitliche Datenbankschnittstelle – Call Level Interface (CLI) – auf der Java-Plattform dar. Sie ist speziell auf relationale Datenbankmanagementsysteme ausgerichtet. Um die Verbindung mit einem solchen System herzustellen, wird ein von diesem abhängiger, spezieller JDBC-Treiber benötigt. LOB Large OBject LOBs sind, wie der Name schon sagt, große Objekte. Diese werden als Outline-Datentyp außerhalb der Basistabelle gespeichert. DB2 unterscheidet speziell zwischen CLOB, DBCLOB und BLOB, wobei ausschließlich der erstgenannte Datentyp in dieser Arbeit Erwähnung findet. LOB-Auxiliary- Eine LOB-Auxiliary-Tabelle ist eine Tabelle, die von DB2 genutzt wird, um Tabelle LOB-Daten außerhalb der Basistabelle abzulegen. Dazu muss sie in einem dedizierten LOB-Tablespace angelegt werden. Weiterhin ist es notwendig, auf der LOB-Auxiliary-Tabelle einen speziellen Auxiliary-Index zu erstellen, der den effizienten Zugriff auf deren Inhalte ermöglicht. LOB-Tablespace Ein LOB-Tablespace ist ein spezieller Tablespace in DB2. Er wird zur Verwaltung von LOB-Daten benutzt. Dazu enthält ein LOB-Tablespace genau eine LOB-Auxiliary-Tabelle mit einem darauf erstellten AuxiliaryIndex. Erst wenn diese Objekte vollständig erstellt sind, können im LOBTablespace Daten abgelegt werden. Member DB2-Subsysteme werden innerhalb einer „Data Sharing“-Umgebung auch als Member bezeichnet. Dabei können ein bis viele Member eine Data Sharing Group bilden. nativ Die native XML-Speicherung entspricht einer „natürlichen“ Ablage. Dabei werden XML-Dokumente so gespeichert, dass sie direkt aus dem abgelegten Format ohne zusätzlich notwendiges Parsen verarbeitet werden können. DB2 stellt dafür als ein um XML-Strukturen erweitertes relationales Datenbankmanagementsystem den nativen XML-Datentyp zur Verfügung. Demgegenüber existieren aber auch dedizierte XML-Datenbankmanagementsysteme. (siehe Abschnitt 3.1.1) 169 nicht-nativ Im Gegensatz zur nativen XML-Speicherung handelt es sich bei der nichtnativen XML-Ablage um eine „unnatürliche“, abgewandelte Speicherform. Auf diese Weise abgelegte Dokumente müssen vor ihrer typspezifischen Verarbeitung stets in das XML-Format geparst werden. In der vorliegenden Arbeit werden hauptsächlich die Varianten der nicht-nativen XMLSpeicherung als CLOB und VARCHAR betrachtet. (siehe Abschnitt 3.1.1) NodeID-Index Der NodeID-Index ist ein im Rahmen der nativen XML-Speicherung implizit von DB2 erzeugter Index. Er umfasst die DocID- und die XMLData-Spalte. Funktional realisiert der NodeID-Index die effiziente Verknüpfung der Tupel aus der Basistabelle mit den zugehörigen Tupeln der XML-Auxiliary-Tabelle. OCR Optical Character Recognition OCR ist eine Bezeichnung für die automatische Texterkennung innerhalb von Bildern. In der DATEV wird beispielsweise OCR-Software dazu verwendet, um eingegangene, gescannte Belege ganz oder teilweise zu digitalisieren. Outline-Datentyp Ein Outline-Datentyp ist ein Datentyp, der seine Datensätze außerhalb der Basistabelle ablegt. Dazu benötigt er zusätzliche Objekte, die entweder explizit oder implizit erstellt werden müssen. Die LOB-Datentypen und auch der native XML-Datentyp sind Vertreter der Outline-Datentypen. Recursive SQL Unter rekursivem SQL sind SQL-Statements zu verstehen, die über den UNION-Operator in einem rekursiven Ablauf verschiedene Ergebnismengen miteinander verknüpfen. Dieser Prozess erfolgt bis zum Eintreten einer definierten Bedingung, bei der der Vorgang kontrolliert endet. RELAX NG Regular Language Description for XML New Generation RELAX NG ist eine dem XML-Schema ähnliche Schemasprache mit geringerem (Definitions-)Umfang. Sie verfolgt das Ziel, eine kompakte, einfach verständliche Sprache zur Validierung von XML-Dokumenten zu sein. Schematron Schematron ist eine Schemasprache mit regelbasiertem Ansatz. Alternativ zu dem in dieser Arbeit primär betrachteten XML-Schema können mithilfe von Schematron ebenfalls XML-Dokumente validiert werden. DB2 bietet dafür allerdings keine Unterstützung. 170 Stored Procedure Eine Stored Procedure ist ein datenbankseitig definierbares Anwendungsprogramm, das über ein CALL-Statement aufgerufen werden kann. DB2 unterscheidet dabei zwischen folgenden Prozeduren: externen, SQL (externen) und SQL (nativen) [IBM11a]. TPOX-Benchmark „Transaction Processing over XML“-Benchmark Der TPOX-Benchmark ist ein spezieller Benchmark zur PerformanceAnalyse der XML-Verarbeitung in Datenbankmanagementsystemen. Er besteht aus einem Testdatengenerator (inklusive XML-Schemas), einer Sammlung von Transaktionen, einem Workload-Treiber und Dokumentationen zu den einzelnen Bestandteilen. (siehe Abschnitt 4.2) Transition Variable Eine Transition Variable ist eine Variable, die den Wert einer Spalte enthält, für deren zugehörige Zeile ein Trigger aktiv geworden ist. Abhängig vom Trigger-Typ kann sie den alten Wert vor der dazugehörigen Datenmanipulation oder den neuen geänderten Wert danach annehmen. Trigger Bei einem Trigger handelt es sich um ein aktives Objekt nach „ECA (Event Condition Action)“-Regeln, das bei bestimmten Nutzeraktionen (INSERT, UPDATE oder DELETE) automatisch eine im Trigger-Body definierte Folge von Aktionen ausführt. In DB2 ist dabei zusätzlich zwischen den TriggerFormen BEFORE, AFTER und INSTEAD OF zu unterscheiden, die jeweils auf Tupel- oder Statement-Ebene definierbar sind. Unicode Unicode bezeichnet einen internationalen Standard für die Darstellung von Schriftzeichen. Dieser umfasst unter anderem die in DB2 verfügbare Zeichenkodierung UTF-8, welche für die native Ablage von XMLDokumenten genutzt wird. Aufgrund des verglichen mit dem EBCDICZeichensatz erweiterten Zeichenumfangs gewinnt der Unicode-Standard in DB2 zunehmend an Bedeutung. User-Defined-XML- Als User-Defined-XML-Indexe sind im Rahmen dieser Arbeit vom Nutzer Index explizit anzulegende XML-Indexe bezeichnet. Diese basieren auf einem definierten XPath-Pfadausdruck und ermöglichen in Kombination mit dem DocID-Index den effizienten Zugriff auf spezifizierte Teilbäume eines XMLDokuments. (siehe Abschnitt 8.1.1) 171 VARCHAR VARying-length CHARacter Ein VARCHAR ist ein variabel langer Character-String. Da es sich bei ihm um einen Inline-Datentyp handelt, ist er bezüglich seiner Länge durch die maximale Record Size limitiert. Diese beträgt in DB2 höchstens 32 Kilobytes. Somit hat ein VARCHAR eine Länge von 1 - 32704 Bytes. Im Rahmen dieser Arbeit wird der VARCHAR-Datentyp besonders im Zusammenhang mit der nicht-nativen XML-Speicherung betrachtet. Visual Explain Visual Explain ist ein bis zuletzt eigenständiges Tool zur Zugriffsplananalyse und -Visualisierung in DB2. Mittlerweile ist Visual Explain in seinem vollen Funktionsumfang als ein Modul in das Tool IBM Data Studio integriert worden. (siehe Abschnitt 3.4.2) XML EXtensible Markup Language XML ist eine erweiterbare Auszeichnungssprache zur Repräsentation von hierarchischen Daten. Besondere Verbreitung hat es durch seinen Charakter als universelles Datenaustauschformat erlangt. (siehe Abschnitt 3.1) XML-Auxiliary- Die XML-Auxiliary-Tabelle ist ein implizit erstelltes Verwaltungsobjekt des Tabelle nativen XML-Datentyps. Sie dient der Ablage von XML-Dokumenten. In der XML-Auxiliary-Tabelle befinden sich die Spalten DocID, min_NodeID und XMLData. XML-Extender Der XML-Extender ist eine Erweiterung des DB2, die als ein Zwischenschritt auf dem Weg der DB2-Entwicklung zur nativen XML-Datenhaltung angesehen werden kann. Er ermöglicht es über zwei verschiedene Ansätze („xml collection“ und „xml column“), XML-Daten zu verarbeiten. Bei beiden Varianten handelt es sich um nicht-native XML-Speicherformen. XML-Parse-Prozess Der XML-Parse-Prozess dient dazu, ein nicht-natives XML-Dokument in die native Speicherform zu überführen. Dabei kann abhängig von dem verwendeten XML-Parser beispielsweise auch ein Validierungsvorgang gegen ein XML-Schema erfolgen. (siehe Abschnitt 3.1.2) 172 XML-Schema XML-Schemas dienen der Strukturbeschreibung von XML-Dokumenten. Sie werden in Form eigener XML-Dokumente definiert. In DB2 sind XMLSchemas im XML Schema Repository abgelegt. Von dort aus können sie zur Validierung von XML-Dokumenten herangezogen werden. (siehe Kapitel 7) XML-Serialisieren Der Serialisierungsprozess ist das „Gegenstück“ zum XML-Parse-Prozess. Hier werden die (binär) nativ gespeicherten XML-Dokumente wieder zu (nicht-nativen) Character-Strings transformiert. XML-Tablespace Ein XML-Tablespace ist ein implizit erstellter Tablespace. Er dient der Verwaltung von nativ gespeicherten XML-Daten. Pro nativer XML-Spalte wird genau ein XML-Tablespace erzeugt, welcher wiederum genau eine XML-Auxiliary-Tabelle in sich trägt. XPath XML Path Language XPath ist eine Abfragesprache für XML-Dokumente und dient der Adressierung von hierarchisch repräsentierten Inhalten. Aktuell existieren zwei Versionen der XPath-Sprachklassifikation: XPath 1.0 [W3C99] und XPath 2.0 [W3C10b]. (siehe Abschnitt 3.1.3) XQuery XML Query Language XQuery ist eine Abfragesprache für XML-Dokumente. Sie bietet gegenüber der Sprache XPath erweiterte Möglichkeiten, um gezielt auf Dokumentinhalte zugreifen zu können. In der hier untersuchten Version bietet DB2 keine Unterstützung für die Abfragesprache XQuery. XSR XML Schema Repository Das XML Schema Repository setzt sich aus verschiedenen Tabellen des DB2-Katalogs zusammen und dient der datenbankseitigen Speicherung von XML-Schemas. 173 Abbildungsverzeichnis Abbildung 1: wohlgeformtes XML-Dokument .......................................................................... 18 Abbildung 2: Beispiel für XML-Parsen und XML-Serialisieren................................................ 21 Abbildung 3: Whitespace in XML-Dokumenten........................................................................ 22 Abbildung 4: Beschreibung wesentlicher XPath-Ausdrücke [W3S11b] .................................... 23 Abbildung 5: Klassifizierung der Elapsed-Zeiten [IBM00]........................................................ 29 Abbildung 6: Beispieldiagramm – Größe und Anzahl................................................................ 38 Abbildung 7: Beispieldokument – Größe und Anzahl................................................................ 40 Abbildung 8: Merkmalsausprägungen des Kriteriums der Strukturiertheit ................................ 42 Abbildung 9: Merkmalsausprägungen des Kriteriums der Zusammensetzung .......................... 44 Abbildung 10: Beziehungen zwischen den Datenbankobjekten................................................. 47 Abbildung 11: „Shared Data“-Architektur [IBM06a]................................................................. 50 Abbildung 12: Beispiel – Anteil des PREPARE-Prozesses........................................................ 53 Abbildung 13: Beispielprozedur – Migration und Parsen........................................................... 58 Abbildung 14: Beispiel-Trigger – XML-Schema-Management ................................................. 58 Abbildung 15: Beispielprozedur – Query Performance.............................................................. 59 Abbildung 16: Beispielausgabe des CA Detectors ..................................................................... 61 Abbildung 17: Beispieldiagramm – Prozentuale Schwankungen ............................................... 63 Abbildung 18: Überblick der betrachteten INSERT-Szenarien.................................................. 64 Abbildung 19: Messreihen zur INSERT-Performance im Migrationsfall .................................. 67 Abbildung 20: Überblicksgrafik – „Einfaches Kopieren“ .......................................................... 68 Abbildung 21: Messergebnis – „Einfaches Kopieren“ – Größe und Anzahl – CPU-Zeit .......... 69 Abbildung 22: Messergebnis – „Einfaches Kopieren“ – Strukturiertheit – CPU-Zeit ............... 71 Abbildung 23: Verteilung über mehrere Tupel [Koc11]............................................................. 72 Abbildung 24: Überblicksgrafik – Konkatenation...................................................................... 73 Abbildung 25: Beispiel für die Bezeichnung einer Merkmalsausprägung ................................. 74 Abbildung 26: Messergebnis – Konkatenation – Größe und Anzahl – CPU-Zeit ...................... 76 Abbildung 27: Überblicksgrafik – Unicode-Konvertierung ....................................................... 78 Abbildung 28: Messergebnis – Unicode-Konvertierung – Größe und Anzahl – CPU-Zeit ....... 79 Abbildung 29: Überblicksgrafik – XML-Parsen der Dokumente............................................... 81 Abbildung 30: Messergebnis – XML-Parsen – Größe und Anzahl – CPU-Zeit......................... 82 Abbildung 31: Messergebnis – XML-Parsen – Strukturiertheit – CPU-Zeit.............................. 85 Abbildung 32: Messergebnis – XML-Parsen – Zusammensetzung – CPU-Zeit ........................ 86 174 Abbildung 33: Gegenüberstellung der Prozessketten zur Migrationsuntersuchung ................... 87 Abbildung 34: Kostenanteil der Konkatenation an einer XML-Migration................................. 89 Abbildung 35: Überblicksgrafik – Neueinfügungen................................................................... 91 Abbildung 36: Anzahl indexierter Knoten je Index.................................................................... 94 Abbildung 37: Beispiel-Statements zur Indexerstellung............................................................. 94 Abbildung 38: Messergebnis – Pflege von User-Defined-XML-Indexen – CPU-Zeit............... 95 Abbildung 39: Beispiel zum Vergleich von UPDATE und „in-document“-UPDATE .............. 97 Abbildung 40: Beispiel für ein XML-Schema .......................................................................... 102 Abbildung 41: Vordefinierte Datentypen bei dem XML-Schema-Konzept [W3C04c] ........... 104 Abbildung 42: Anwendungsbeispiel für das „unique“-Element ............................................... 106 Abbildung 43: Anwendungsbeispiel für das „key“-Element .................................................... 106 Abbildung 44: Anwendungsbeispiel für das „keyref“-Element................................................ 107 Abbildung 45: Verknüpfung von XML-Dokument und XML-Schema ................................... 109 Abbildung 46: Transparente Schemavalidierung...................................................................... 110 Abbildung 47: Alternativer Umgang mit ungültigen XML-Dokumenten ................................ 111 Abbildung 48: Auskunft über Gültigkeit von XML-Dokumente ............................................. 112 Abbildung 49: Vorgehensweise bei Schemaevolution ............................................................. 115 Abbildung 50: Syntaxdiagramm der Funktion DSN_XMLVALIDATE [IBM11a]................. 116 Abbildung 51: Vorgehensweise zur automatisierten Schemavalidierung in DB2.................... 119 Abbildung 52: Beispielinhalt einer Tabelle mit Zusatzspalte zur Gültigkeitsauskunft............. 121 Abbildung 53: Vergleich der CPU-Zeiten mit „nicht-validierendem“ INSERT ...................... 124 Abbildung 54: DTD basierte Eindeutigkeitsdefinition – gültiges Dokument........................... 127 Abbildung 55: DTD basierte Eindeutigkeitsdefinition – ungültiges Dokument....................... 127 Abbildung 56: Beispiel-Statement für die Indexerstellung....................................................... 132 Abbildung 57: Beispiel für einen Zugriffspfad mit verwendetem User-Defined-XML-Index. 138 Abbildung 58: Messergebnis – Komplettzugriff – Größe und Anzahl – CPU-Zeit.................. 143 Abbildung 59: Messergebnis – Komplettzugriff – Strukturiertheit – CPU-Zeit....................... 144 Abbildung 60: Messergebnis – Komplettzugriff – Zusammensetzung – CPU-Zeit ................. 145 Abbildung 61: Ausschnitt aus dem „Musterdokument“ ........................................................... 146 Abbildung 62: Messergebnis – Indexunterstützter Zugriff – Größe und Anzahl – CPU-Zeit .. 147 Abbildung 63: Beispiel eines SELECT-Statements für selektiven Zugriff .............................. 149 Abbildung 64: Messergebnis – Selektiver Zugriff – Größe und Anzahl – CPU-Zeit............... 151 Abbildung 65: SELECT-Statement für das Szenario Komplexe Prädikate.............................. 153 Abbildung 66: Messergebnis – Komplexe Prädikate – Größe und Anzahl – CPU-Zeit........... 155 Abbildung 67: Zusammenfassung der Messergebnisse – Migration und Parsen...................... 159 175 Abbildung 68: Zusammenfassung der Messergebnisse – XML-Schema-Management ........... 160 Abbildung 69: Zusammenfassung der Messergebnisse – Query Performance......................... 161 Abbildung 70: Design-Empfehlungen zur XML-Speicherform ............................................... 164 176 Literaturverzeichnis [Aue10] J. Auer. „Design-Entscheidungen zwischen Element und Attribut bei einer eigenen document type definition“, 05.02.2010. http://www.sql-und-xml.de/xml-lernen/xml-element-attribut-eigene-dtd-design.html [Bos06] P. Bossman. „A Guide to using Visual Explain V8“, 13.12.2006. http://www.bwdb2ug.org/PDF/Visual Explain Guide.pdf [CAT11] CA Technologies. „CA Detector® for DB2 for z/OS“, 2011. http://www.ca.com/~/media/Files/ProductBriefs/1724_detector_cs342_1110.pdf [Cla01] J. Clark. „TREX – Tree Regular Expressions for XML“, Sprachspezifikation, 2001. [Com07] Computerwoche. „Das Herz der Weltwirtschaft“, Online-Artikel, 30.08.2007. http://www.computerwoche.de/heftarchiv/2007/35/1220473/ [DAT10] DATEV. „Mehr Rechenleistung für Cloud-Dienste“, 22.12.2010. http://www.datev.de/portal/ShowPage.do?pid=dpi&nid=109742 [DAT11a] DATEV. „Sicherung der Wohlfahrt“, Interview, 2011. http://www.datev.de/portal/ShowPage.do?pid=dpi&nid=120356 [DAT11b] DATEV. „… was Sie über DATEV wissen sollten“, 2011. http://www.datev.de/portal/ShowPage.do?pid=dpi&nid=2155 [DAT11c] DATEV. „Neu bei DATEV?“, 2011. http://www.datev.de/portal/ShowPage.do?pid=dpi&nid=81681 [DAT11d] DATEV. „Vorstandsvorsitzender – Professor Dieter Kempf “, 2011. http://www.datev.de/portal/ShowPage.do?pid=dpi&nid=97649 [DAT11e] DATEV. „DATEV“, Online-Präsenz, 2011. http://www.datev.de [DAT11f] DATEV. „Outsourcing an DATEV“, 2011. http://www.datev.de/portal/ShowPage.do?pid=dpi&nid=104852 177 [DAT11g] DATEV. „DATEVasp“, Online-Präsenz, 2011. http://www.datev.de/portal/SelectPage.do?pid=dpi&cid=122774 [DAT11h] DATEV. „Chronologischer Überblick 1966 bis 1975“, 2011. http://www.datev.de/portal/ShowPage.do?pid=dpi&nid=2185 [Ecl11] Eclipse Foundation. „Eclipse“, Projekt-Homepage, 2011. http://www.eclipse.org [Fav07] W. Favero. „DB2 9 for z/OS Universal Table Spaces (UTS)“, 15.05.2007. BlogArtikel. http://it.toolbox.com/blogs/db2zos/db2-9-for-zos-universal-table-spaces-uts-16273 [Hee02] H. Heeskens. „Was ist XML?“, 04.02.2002. http://mata.gia.rwth-aachen.de/Vortraege/Hanno_Heeskens/XML/script/node4.html [Her09] M. Herschel. „Datenbanksysteme II – Architektur und Implementierung von Datenbanksystemen – Kapitel 4: Baum-basierte Indizes“, Vorlesungsskript, Willhelm-Schickard-Institut für Informatik, Eberhard Karls Universität Tübingen, 2009. http://db.inf.uni-tuebingen.de/files/teaching/ws0910/dbs2/04_treeindex_r1.pdf [HR01] T. Härder, E. Rahm. „Datenbanksysteme: Konzepte und Techniken der Implementierung“, Springer Verlag, 2. Auflage, 2001. [HS04] M. Hertel, Prof. A. Schätter. „Kleines XML Schema 1x1“, 2004. http://www.mathertel.de/2004/schemaeinmaleins.aspx [IBM00] IBM Corporation. „Tivoli – Performance Reporter for OS/390 System Performance Feature Guide“, 08.2000. http://publib.boulder.ibm.com/tividd/td/perfrpt/SH19-6818-05/en_US/PDF/SH19-681805.pdf [IBM04a] IBM Corporation. „IBM Redbook – DB2 UDB for z/OS Version 8: Everything You Ever Wanted to Know, ... and More“, 05.2004. http://www.redbooks.ibm.com/redbooks/pdfs/sg246079.pdf 178 [IBM04b] IBM Corporation. „DB2 for OS/390 and z/OS library – XML Extender Administration and Programming“, 10.2004. http://publibfp.dhe.ibm.com/epubs/pdf/dxxxa811.pdf [IBM06a] IBM Corporation. „IBM Redbook – DB2 for z/OS: Data Sharing in a Nutshell“, 10.2006. http://www.redbooks.ibm.com/redbooks/pdfs/sg247322.pdf [IBM06b] IBM Corporation. „IBM Redbook – LOBs with DB2 for z/OS: Stronger and Faster“, 11.2006. http://www.redbooks.ibm.com/redbooks/pdfs/sg247322.pdf [IBM07] IBM Corporation. „IBM Redbook – DB2 9 for z/OS Performance Topics“, 09.2007. http://www.redbooks.ibm.com/redbooks/pdfs/sg247473.pdf [IBM08a] IBM Corporation. „DB2 Version 9.1 for z/OS – Utility Guide and Reference“, 12.2008. http://www.sk-consulting.de/db2manuals/DB2%20V9%20Utility_Guide_dsnugk13.pdf [IBM08b] IBM Corporation. „IBM Redbook – DB2 9 for z/OS Stored Procedures: Through the CALL and Beyond“, 03.2008. http://www.redbooks.ibm.com/redbooks/pdfs/sg247604.pdf [IBM08c] IBM Corporation. „DB2 Version 9.1 for z/OS – Codes“, 12.2008. http://www.sk-consulting.de/db2manuals/DB2%20V9%20Codes_dsnc1k13.pdf [IBM09a] IBM Corporation. „IBM Redpaper – DB2 9 for z/OS: Buffer Pool Monitoring and Tuning“, 25.10.2009. http://www.redbooks.ibm.com/redpapers/pdfs/redp4604.pdf [IBM09b] IBM Corporation. „The bind process“, 06.2009. http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=%2Fcom.ibm.db 2.doc.comref%2Fchhpt3.htm [IBM09c] IBM Corporation. „IBM Redbook – XML Processing on z/OS“, 12.2009. http://www.redbooks.ibm.com/redbooks/pdfs/sg247810.pdf 179 [IBM09d] IBM Corporation. „IBM Redbook – DB2 9 for z/OS: Packages Revisited“, 03.2009. http://www.redbooks.ibm.com/redbooks/pdfs/sg247688.pdf [IBM10a] IBM Corporation. „Extensible Dynamic Binary XML, Client/Server Binary XML Format (XDBX)“, Spezifikation, 14.07.2010. http://www-01.ibm.com/support/docview.wss?uid=swg27019354&aid=1 [IBM10b] IBM Corporation. „z/OS V1R12.0 information center“, 2010. http://publib.boulder.ibm.com/infocenter/zos/v1r12/index.jsp [IBM10c] IBM Corporation. „DB2 9 for z/OS pureXML Performance and Best Practices“, 06.2010. https://www.ibm.com/developerworks/wikis/download/attachments/97321405/DB2_9_z OS_pureXML_Performance.pps [IBM10d] IBM Corporation. „IBM InfoSphere Optim Query Workload Tuner“, 10.2010. ftp://public.dhe.ibm.com/common/ssi/ecm/en/ims14099usen/IMS14099USEN.PDF [IBM10e] IBM Corporation. „DB2 Version 9.1 for z/OS – XML Guide“, 12.2010. http://publibfp.dhe.ibm.com/epubs/pdf/dsnxgk16.pdf [IBM11a] IBM Corporation. „DB2 Version 9.1 for z/OS – SQL Reference“, 03.2011. http://publib.boulder.ibm.com/epubs/pdf/dsnsqk1a.pdf [IBM11b] IBM Corporation. „Parallel Sysplex“, 2011. http://www-03.ibm.com/systems/z/advantages/pso/sysover.html#Parallel_Sysplex [IBM11c] IBM Corporation. „DB2 Version 9.1 for z/OS – Application Programming and SQL Guide“, 10.2011. http://publib.boulder.ibm.com/epubs/pdf/dsnapk18.pdf [IBM11d] IBM Corporation. „DB2 Version 9.1 for z/OS – Administration Guide“, 12.2011. http://publib.boulder.ibm.com/epubs/pdf/dsnagk1b.pdf [IBM11e] IBM Corporation. „IBM“, Online-Präsenz, 2011. http://www.ibm.com/us/en/ [IBM11f] IBM Corporation. „IBM InfoSphere Optim Query Tuner“, 01.2011. http://public.dhe.ibm.com/common/ssi/ecm/en/ims14103usen/IMS14103USEN.PDF 180 [IBM11g] IBM Corporation. „DB2 Version 9.1 for z/OS – Command Reference“, 12.2011. http://publib.boulder.ibm.com/epubs/pdf/dsncrk17.pdf [IBM11h] IBM Corporation. „IBM zEnterprise System“, 2011. http://www-03.ibm.com/systems/de/z/hardware/zenterprise/z196.html [IBM11i] IBM Corporation. „Control Center overview“, 2011. http://publib.boulder.ibm.com/infocenter/db2help/topic/com.ibm.db2.udb.cc.doc/db2_ud b/intro.htm [IBM11j] IBM Corporation. „Optimization Service Center for DB2 for z/OS“, 20.07.2011. https://www-304.ibm.com/support/docview.wss?uid=swg27017059 [IBM11k] IBM Corporation. „Visual Explain for DB2 for z/OS“, 04.10.2011. https://www-304.ibm.com/support/docview.wss?uid=swg27011680 [IBM11l] IBM Corporation. „Data Studio V3.1 features: by data server and component“, 14.12.2011. http://www-01.ibm.com/support/docview.wss?uid=swg27022147 [IBM11m] IBM Corporation. „IBM Data Studio“, Produkt-Homepage, 2011. http://www-01.ibm.com/software/data/optim/data-studio/ [IBM11n] IBM Corporation. „IBM Data Studio – Features and benefits“, 2011. http://www-01.ibm.com/software/data/optim/data-studio/features.html [IBM11o] IBM Corporation. „DB2 for z/OS“, Produkt-Homepage, 2011. http://www-01.ibm.com/software/data/db2/zos/ [IBM11p] IBM Corporation. „DB2 for Linux, UNIX and Windows“, Produkt-Homepage, 2011. http://www-01.ibm.com/software/data/db2/linux-unix-windows/ [IBM11q] IBM Corporation. „IBM System z – Operating System – z/OS“, ProduktHomepage, 2011. http://www-03.ibm.com/systems/z/os/zos/ [IBM11r] IBM Corporation. „DB2 Server for VSE & VM“, Produkt-Homepage, 2011. http://www-01.ibm.com/software/data/db2/vse-vm/ 181 [IBM11s] IBM Corporation. „DB2 10 for z/OS – SQL Reference“, 10.2011. http://publib.boulder.ibm.com/epubs/pdf/dsnsqm04.pdf [IBM11t] IBM Corporation. „DB2 10 for z/OS – Maintaining statistics in the catalog“, 12.2011. http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=%2Fcom.ibm.db 2z10.doc.perf%2Fsrc%2Ftpc%2Fdb2z_maintaincatalogstatistics.htm [IBM11u] IBM Corporation. „DB2 Version 9.1 for z/OS – Performance Monitoring and Tuning Guide“, 03.2011. http://publib.boulder.ibm.com/epubs/pdf/dsnpfk1a.pdf [IBM11v] IBM Corporation. „DB2 10 for z/OS – What’s New?“, 12.2011. http://publib.boulder.ibm.com/epubs/pdf/dsnwnm04.pdf [IBM11w] IBM Corporation. „DB2 pureXML – Intelligent XML database management ALT“, Produkt-Homepage, 2011. http://www-01.ibm.com/software/data/db2/xml/ [IBM11x] IBM Corporation. „DB2“, Produkt-Homepage, 2011. http://www-01.ibm.com/software/data/db2/ [IBM11y] IBM Corporation. „IBM zEnterprise System“, 08.2011. http://public.dhe.ibm.com/common/ssi/ecm/en/zsd03020usen/ZSD03020USEN.PDF [IBM11z] IBM Corporation. „IBM Redbook – DB2 10 for z/OS Performance Topics“, 06.2011. http://www.redbooks.ibm.com/redbooks/pdfs/sg247942.pdf [IBM12a] IBM Corporation. „Getting started with IBM Data Studio for DB2“, 01.2012. http://public.dhe.ibm.com/software/dw/db2/express-c/wiki/Getting_Started_with_IBM_ Data_Studio_v31.pdf [IBM12b] IBM Corporation. „z/OS – XML System Services User's Guide and Reference “, 01.2012. http://www-03.ibm.com/systems/resources/gxlza151.pdf [IBM78] IBM Corporation. „OS/VS2 MVS Overview“, Produkt-Homepage, 06.1978. http://www.prycroft6.com.au/misc/download/GC28-0984-0_MVSoverview_ Jun78OCR2009.pdf 182 [IES98] Internet Engineering Steering Group (IESG). „Uniform Resource Identifiers (URI): Generic Syntax“, Memo, 08.1998. http://www.ietf.org/rfc/rfc2396.txt [ISO06] International Organization for Standardization (ISO). „Information technology – Document Schema Definition Languages (DSDL) –Part 3: Rule-based validation – Schematron“, 01.06.2006. International Standard. ISO/IEC 19757-3 :2006(E). [Joc06] B. Jockman. „Don’t Break the Link: Avoid Four Costly Pitfalls in Linking and Reuse“, 2006. White Paper. http://xml.coverpages.org/InnodataJockmanLinkManagement2006.pdf [Koc11] C. Koch. „XML-Speicherstrukturen in DB2 for z/OS Version 9.1 und Überführungskonzepte für nicht-native XML-Speicherformen“, Studienarbeit, Fakultät für Mathematik und Informatik, Friedrich-Schiller-Universität Jena, 08.2011. [KST02] W. Kazakos, A. Schmidt, P. Tomczyk. „Datenbanken und XML: Konzepte, Anwendungen, Systeme“, Springer Verlag, 1. Auflage, 26.03.2002. [Ley11] M. Ley. „System R“, 2011. http://www.informatik.uni-trier.de/~ley/db/systems/r.html [Loe09] H. Loeser. „XML Database Benchmarks, TPoX, and DB2 pureXML“, BlogArtikel, 10.02.2009. http://blog.4loeser.net/2009/02/xml-database-benchmarks-tpox-and-db2.html [Mak00] M. Makoto. „Regular language description for xml (relax): Relax core.“, JIS Technical Report, 2000. [Mic11] Microsoft Corporation. „Microsoft SQL Server“, Produkt-Homepage, 2011. http://www.microsoft.com/sqlserver/en/us/default.aspx [Mil11] R. Miller. „DB2 History“, 25.04.2011. http://www.dbisoftware.com/db2nightshow/20110425-Z01-roger-miller.pdf 183 [Mül08] T. Müller. „Verfahren zur Verarbeitung von XML-Werten in SQL-Anfrageergebnissen“, Dissertation, Fakultät für Mathematik und Informatik, FriedrichSchiller-Universität Jena, 02.04.2008. http://deposit.ddb.de/cgi-bin/dokserv?idn=990512835&dok_var=d1&dok_ext=pdf& filename=990512835.pdf [NGXS11] M. Nicola, A. Gonzalez, K. Xie, B. Schiefer. „An XML Database Benchmark: "Transaction Processing over XML (TPoX)"“, Spezifikation, 07.2011. http://tpox.svn.sourceforge.net/viewvc/tpox/TPoX/documentation/TPoX_BenchmarkPro posal_v2.1.pdf [Nic10] M. Nicola. „New XML Features in DB2 10 for z/OS !“, Blog-Artikel, 18.11.2010. http://nativexmldatabase.com/2010/11/18/new-xml-features-in-db2-10-for-zos/ [NK09] M. Nicola, P. Kumar-Chatterjee. „DB2 pureXML Cookbook“, IBM Press, 1. Auflage, 08.2009. [Ora11a] Oracle Corporation. „Designing an XML Data Structure“, Tutorial, 2011. http://docs.oracle.com/javaee/1.4/tutorial/doc/IntroXML4.html [Ora11b] Oracle Corporation. „Oracle Database“, Produkt-Homepage, 2011. http://www.oracle.com/de/products/database/index.html [Pag04a] Pagina. „Grenzen der DTD-Technologie“, 02.2004. http://www.pagina-online.de/xml-hintergruende/pagina-daskompendium/themenkomplex-ii-xml/xml-schema-als-dtd-alternative/grenzen-der-dtdtechnologie/ [Pag04b] Pagina. „Uniqueness und Keys“, 02.2004. http://www.pagina-online.de/xml-hintergruende/pagina-daskompendium/themenkomplex-ii-xml/xml-schema-als-dtd-alternative/uniqueness-undkeys/ [Pag07] Pagina. „Schematron – Der neue Freund des Lektorats“, 05.2007. http://www.pagina-online.de/xml-hintergruende/pagina-daskompendium/themenkomplex-ii-xml/schematron-der-neue-freund-des-lektorats/ [Päß07] M. Päßler. „Datenbanken und XML – Passt das?“, 04.07.2007. http://inka.htw-berlin.de/datenverwaltung/docs/Paessler.pdf 184 [Pic09] H.-J. Picht. „Wie ein Pinguin und ein Dinosaurier helfen können, Platz, Wartungskosten und Strom zu sparen“, 06.10.2009. http://www-05.ibm.com/at/symposium/pdf/11_Wie_ein_Pinguin_und_ein_Dinosaurier. pdf [Rod08] V. Rodrigues. „Static SQL vs Dynamic SQL“, 14.01.2008. Blog-Artikel. http://www.vitorrodrigues.com/blog/2008/01/14/static-sql-vs-dynamic-sql/ [Smi07] B. F. Smith. „IBM DB2 RUNSTATS Utility and Real-time Statistics“, 10.2007. ftp://ftp.boulder.ibm.com/software/systemz/pdf/Dec_4_Telecon_RUNSTATS_Utility_an d_Real-time_Statistics.pdf [Stö01] U. Störl. „Backup und Recovery in Datenbanksystemen. Verfahren, Klassifikation, Implementierung und Bewertung“, Teubner Verlag, 1. Auflage, 11.04.2001. [Van03] E. Van der Vlist. „RELAX NG“, O'Reilly Media, 1. Auflage, 07.2003. [Von05] H. Vonhoegen. „Einstieg in XML“, Galileo Computing, 3.Auflage, 03.2005. [W3C02] World Wide Web Consortium (W3C). „XML Pointer Language (XPointer)“, W3C Working Draft, 16.08.2002. http://www.w3.org/TR/xptr/ [W3C04a] World Wide Web Consortium (W3C). „XML Schema Part 0: Primer Second Edition“, W3C Recommendation, 28.10.2004. http://www.w3.org/TR/xmlschema-0/ [W3C04b] World Wide Web Consortium (W3C). „XML Schema Part 1: Structures Second Edition“, W3C Recommendation, 28.10.2004. http://www.w3.org/TR/xmlschema-1/ [W3C04c] World Wide Web Consortium (W3C). „XML Schema Part 2: Datatypes Second Edition“, W3C Recommendation, 28.10.2004. http://www.w3.org/TR/xmlschema-2/ [W3C06a] World Wide Web Consortium (W3C). „XML Inclusions (XInclude) Version 1.0 (Second Edition)“, W3C Recommendation, 15.11.2006. http://www.w3.org/TR/xinclude/ 185 [W3C06b] World Wide Web Consortium (W3C). „Extensible Markup Language (XML) 1.1 (Second Edition)“, W3C Recommendation, 16.08.2006. http://www.w3.org/TR/2006/REC-xml11-20060816/ [W3C08] World Wide Web Consortium (W3C). „Extensible Markup Language (XML) 1.0 (Fifth Edition)“, W3C Recommendation, 26.11.2008. http://www.w3.org/TR/2008/REC-xml-20081126/ [W3C10] World Wide Web Consortium (W3C). „XML Linking Language (XLink) Version 1.1“, W3C Recommendation, 06.05.2010. http://www.w3.org/TR/xlink11/ [W3C10b] World Wide Web Consortium (W3C). „XML Path Language (XPath) 2.0 (Second Edition)“, W3C Recommendation, 14.12.2010. http://www.w3.org/TR/xpath20/ [W3C10c] World Wide Web Consortium (W3C). „XQuery 1.0: An XML Query Language (Second Edition)“, W3C Recommendation, 14.12.2010. http://www.w3.org/TR/xquery/ [W3C11] World Wide Web Consortium (W3C). „W3C“, Online-Präsenz, 2011. http://www.w3.org [W3C99] World Wide Web Consortium (W3C). „XML Path Language (XPath) Version 1.0“, W3C Recommendation, 16.11.1999. http://www.w3.org/TR/xpath/ [W3S11a] W3Schools. „XSD Simple Elements“, 2011. http://www.w3schools.com/schema/schema_simple.asp [W3S11b] W3Schools. „XPath Syntax“, 2011. http://www.w3schools.com/xpath/xpath_syntax.asp [WK03] H. Wittenbrink, W. Köhler. „XML“, Teia Lehrbuch Verlag, 1. Auflage, 2003. [Zha08] G. Zhang. „DB2 pureXML® Podcast Series © IBM 2008: Part 2. Getting Started with pureXML in DB2 9 for z/OS“, 2008. http://www.ibm.com/developerworks/wikis/download/attachments/97321405/pureXML_ Podcast2_Getting_Started.pdf 186 [Zha09] G. Zhang. „DB2 9 for z/OS pureXML® FAQs“, 05.01.2009. http://www.ibm.com/developerworks/wikis/download/attachments/97321405/DB2_9_for _zOS_pureXML_FAQs_V08.pdf Sämtliche Verweise auf Webseiten und online verfügbare Dokumentationen beziehen sich auf den Stand vom 17.01.2012 und wurden zu diesem Zeitpunkt letztmalig geprüft. 187 Anhang A.1 „Einfaches Kopieren“ (Abschnitt 6.1.1) Messprozeduren Exemplarisch am Beispiel Messreihe: Größe und Anzahl (CLOB) Merkmalsausprägung: „10K x 10.000“ CREATE PROCEDURE T24431A.SP_CLOB_KOPIEREN_10K() LANGUAGE SQL BEGIN FOR V AS C CURSOR FOR SELECT NNXML_DOC AS CUR_DOC FROM T24431A.TCLOB_10K DO INSERT INTO T24431A.TCLOB_EBCDIC_10K(NNXML_DOC) VALUES(CUR_DOC); END FOR; COMMIT; END Messergebnisse Messreihe: Größe und Anzahl (CLOB und VARCHAR) Merkmalsausprägung CLOB Elapsed 200B x 500.000 VARCHAR CPU Elapsed CPU 254,40 33,65 56,81 6,09 1K x 100.000 55,42 5,72 18,14 1,43 10K x 10.000 9,41 0,64 9,50 0,56 100K x 1.000 5,28 0,20 - - 1M x 100 5,01 0,14 - - 10M x 10 6,59 0,13 - - 188 Messreihe: Strukturiertheit (CLOB) Merkmalsausprägung CLOB Elapsed CPU E (tief) 5,88 0,20 E (flach) 5,34 0,18 E (balanciert) 5,99 0,20 T 5,61 0,19 A 5,46 0,18 A, T 5,19 0,21 E, T (tief) 5,19 0,19 E, T (flach) 4,89 0,18 E, T (balanciert) 4,89 0,19 A, E (tief) 6,32 0,21 A, E (flach) 5,59 0,22 A, E (balanciert) 5,87 0,21 A, E, T (tief) 5,44 0,18 A, E, T (flach) 5,23 0,21 A, E, T (balanciert) 5,33 0,21 189 Messreihe: Zusammensetzung (CLOB) Merkmalsausprägung CLOB Elapsed CPU 1K x 100.000 57,35 5,83 10K x 10.000 9,73 0,60 100K x 1.000 5,19 0,21 1M x 100 5,03 0,13 10M x 10 6,23 0,12 190 A.2 Konkatenation (Abschnitt 6.1.2) Messprozeduren Stored Procedure – exemplarisch am Beispiel Messreihe: Größe und Anzahl (CLOB) Merkmalsausprägung: „10 x 1K x 10.000“ CREATE PROCEDURE T24431A.SP_CLOB_CONCAT_SP_10K() LANGUAGE SQL BEGIN DECLARE CUR_DOC CLOB(2G) CCSID EBCDIC; SET CUR_DOC = ''; FOR V AS C CURSOR FOR SELECT NNXML_DOC FROM T24431A.TCLOB_1K FETCH FIRST 10 ROWS ONLY DO SET CUR_DOC = CONCAT(CUR_DOC, NNXML_DOC); END FOR; INSERT INTO T24431A.TCLOB_EBCDIC_10K(NNXML_DOC) VALUES (CUR_DOC); COMMIT; END 191 Recursive SQL – exemplarisch am Beispiel Messreihe: Größe und Anzahl (CLOB) Merkmalsausprägung: „10 x 1K x 10.000“ CREATE PROCEDURE T24431A.SP_CLOB_CONCAT_RSQL_10K() LANGUAGE SQL BEGIN FOR V AS C CURSOR FOR WITH RPL (LEVEL, CUR_DOC) AS ( SELECT 1 AS LEVEL, NNXML_DOC AS CUR_DOC FROM T24431A.TCLOB_1K WHERE ID = 1 UNION ALL SELECT PARENT.LEVEL + 1, CONCAT( PARENT.CUR_DOC, CHILD.NNXML_DOC) AS CUR_DOC FROM RPL AS PARENT, T24431A.TCLOB_1K AS CHILD WHERE PARENT.LEVEL < 10 AND CHILD.ID = 1 + PARENT.LEVEL ) SELECT CUR_DOC FROM RPL ORDER BY LEVEL DESC FETCH FIRST 1 ROW ONLY DO INSERT INTO T24431A.TCLOB_EBCDIC_10K(NNXML_DOC) VALUES (CUR_DOC); END FOR; COMMIT; END Messergebnisse Messreihe: Größe und Anzahl (CLOB und VARCHAR) Merkmalsausprägung CLOB (Stored Procedure) CLOB (Recursive SQL) VARCHAR (Stored Procedure) Elapsed CPU Elapsed Elapsed CPU CPU 10 x 1K x 10.000 2413,22 1,93 36505,59 9128,15 2247,34 1,78 100 x 1K x 1.000 436,60 8,42 32484,58 9083,87 484,99 7,90 1.000 x 1K x 100 288,20 92,48 - - 272,83 95,08 10.000 x 1K x 10 2248,57 1860,64 - - 2231,74 1949,15 192 Messreihe: Zusammensetzung (CLOB) Merkmalsausprägung CLOB Elapsed CPU 10 x 1K x 10.000 2153,39 1,84 100 x 1K x 1.000 492,20 9,16 1.000 x 1K x 100 259,11 88,23 10.000 x 1K x 10 2192,93 1912,23 193 A.3 Unicode-Konvertierung (Abschnitt 6.1.3) Messprozeduren Exemplarisch am Beispiel Messreihe: Größe und Anzahl (CLOB) Merkmalsausprägung: „10K x 10.000“ CREATE PROCEDURE T24431A.SP_CLOB_UNICODE_10K() LANGUAGE SQL BEGIN FOR V AS C CURSOR FOR SELECT NNXML_DOC AS CUR_DOC FROM T24431A.TCLOB_10K DO INSERT INTO T24431A.TCLOB_UNICODE_10K(NNXML_DOC) VALUES(CUR_DOC); END FOR; COMMIT; END Messergebnisse Messreihe: Größe und Anzahl (CLOB und VARCHAR) Merkmalsausprägung CLOB Elapsed 200B x 500.000 VARCHAR CPU Elapsed CPU 302,73 37,63 74,45 6,43 1K x 100.000 71,26 7,46 25,71 1,79 10K x 10.000 12,97 1,13 10,95 0,91 100K x 1.000 6,47 0,43 - - 1M x 100 6,29 0,46 - - 10M x 10 6,71 0,41 - - 194 Messreihe: Strukturiertheit (CLOB) Merkmalsausprägung CLOB Elapsed CPU E (tief) 6,69 0,42 E (flach) 5,14 0,41 E (balanciert) 6,67 0,41 T 6,38 0,40 A 5,21 0,41 A, T 5,29 0,40 E, T (tief) 5,44 0,39 E, T (flach) 5,15 0,40 E, T (balanciert) 4,99 0,41 A, E (tief) 6,26 0,41 A, E (flach) 6,46 0,39 A, E (balanciert) 5,87 0,39 A, E, T (tief) 6,37 0,41 A, E, T (flach) 5,06 0,42 A, E, T (balanciert) 5,17 0,42 195 Messreihe: Zusammensetzung (CLOB) Merkmalsausprägung CLOB Elapsed CPU 1K x 100.000 67,26 7,59 10K x 10.000 12,79 1,06 100K x 1.000 6,54 0,41 1M x 100 6,19 0,44 10M x 10 6,33 0,40 196 A.4 XML-Parsen der Dokumente (Abschnitt 6.1.4) Messprozeduren Exemplarisch am Beispiel Messreihe: Größe und Anzahl (CLOB) Merkmalsausprägung: „10K x 10.000“ CREATE PROCEDURE T24431A.SP_XMLPARSE_10K() LANGUAGE SQL BEGIN FOR V AS C CURSOR FOR SELECT NNXML_DOC AS CUR_DOC FROM T24431A.TCLOB_10K DO INSERT INTO T24431A.TXML_XMLPARSE_10K(XML_DOC) VALUES(XMLPARSE( DOCUMENT CUR_DOC STRIP WHITESPACE)); END FOR; COMMIT; END Messergebnisse Messreihe: Größe und Anzahl (CLOB und VARCHAR) Merkmalsausprägung CLOB Elapsed 200B x 500.000 VARCHAR CPU Elapsed CPU 130,11 39,10 98,00 19,02 1K x 100.000 42,39 10,70 40,63 7,94 10K x 10.000 24,81 5,57 24,79 5,24 100K x 1.000 20,54 4,92 - - 1M x 100 22,82 5,05 - - 10M x 10 23,70 4,80 - - 197 Messreihe: Strukturiertheit (CLOB) Merkmalsausprägung CLOB Elapsed E (tief) CPU 24,27 6,89 174,85 88,72 10,63 2,75 T 6,92 0,90 A 279,43 128,80 A, T 90,53 33,92 E, T (tief) 16,70 4,34 E, T (flach) 60,47 23,63 E, T (balanciert) 10,26 2,04 A, E (tief) 16,64 4,48 A, E (flach) 63,33 23,94 A, E (balanciert) 10,37 2,30 A, E, T (tief) 17,34 3,52 A, E, T (flach) 33,99 11,53 A, E, T (balanciert) 12,26 2,09 E (flach) E (balanciert) 198 Messreihe: Zusammensetzung (CLOB) Merkmalsausprägung CLOB Elapsed CPU 1K x 100.000 43,47 10,44 10K x 10.000 18,43 4,78 100K x 1.000 14,00 3,86 1M x 100 15,01 3,81 10M x 10 17,42 3,51 199 A.5 Pflege von User-Defined-XML-Indexen (Abschnitt 6.3) Messprozeduren Analog zu A.4 XML-Parsen der Dokumente (Abschnitt 6.1.4) Messergebnisse Messreihe: Sofortige Indexpflege und nachträgliche Indexerstellung Merkmalsausprägung INSERT (bei 1 Index) INSERT (bei 2 Indexen) INSERT (bei 3 Indexen) nachträgliche Erstellung aller 3 Indexe (exklusive Kosten für den INSERT) Elapsed CPU Elapsed CPU Elapsed CPU Elapsed CPU 144,98 43,09 165,63 44,59 185,88 46,83 6,76 1,02 1K x 100.000 47,70 16,00 57,21 19,59 60,75 22,40 34,78 3,38 10K x 10.000 35,36 13,84 81,09 24,89 87,26 37,53 133,39 7,73 100K x 1.000 37,77 13,15 89,513 22,81 108,21 35,21 132,15 8,32 1M x 100 40,34 13,83 95,92 24,69 115,93 35,96 153,84 8,71 10M x 10 45,71 13,17 93,11 24,27 113,63 33,78 152,39 9,86 200B x 500.000 200 A.6 Performance der Schemavalidierung (Abschnitt 7.3.2) Messprozeduren Automatische Schemavalidierung CREATE PROCEDURE T24431A.SP_SCHEMA_VALIDATION_AUTO( IN TABLE_SCHEMA VARCHAR(1000), IN TABLE_NAME VARCHAR(1000), IN XML_COLUMN VARCHAR(1000), IN DOCID BIGINT, IN SCHEMA_NAME VARCHAR(1000)) LANGUAGE SQL BEGIN DECLARE CUR_DOC CLOB(2G); DECLARE CUR_SCHEMA_OBJECTID BIGINT; DECLARE SCHEMA_FULL_QUALIFIER VARCHAR(1000); DECLARE INVALID_DOCUMENT CONDITION FOR '2201R'; DECLARE INVALID_STMT_SQL VARCHAR(10000); DECLARE VALID_STMT_SQL VARCHAR(10000); DECLARE SELECT_STMT_SQL VARCHAR(10000); DECLARE INVALID_STMT STATEMENT; DECLARE VALID_STMT STATEMENT; DECLARE SELECT_STMT STATEMENT; DECLARE CUR1 CURSOR FOR SELECT_STMT; DECLARE CUR2 CURSOR FOR SELECT XSROBJECTID FROM SYSIBM.XSROBJECTS WHERE XSROBJECTNAME = SCHEMA_NAME AND XSROBJECTSCHEMA = 'SYSXSR'; DECLARE CONTINUE HANDLER FOR INVALID_DOCUMENT BEGIN EXECUTE INVALID_STMT USING CUR_SCHEMA_OBJECTID; END; SET SELECT_STMT_SQL = 'SELECT XMLSERIALIZE(' || XML_COLUMN || ' AS CLOB(2G)) AS DOC FROM ' || TABLE_SCHEMA || '.' || TABLE_NAME || ' WHERE DB2_GENERATED_DOCID_FOR_XML = ?' || ' FOR UPDATE OF XML_SCHEMA_INFO'; PREPARE SELECT_STMT FROM SELECT_STMT_SQL; SET VALID_STMT_SQL = 'UPDATE ' || TABLE_SCHEMA || '.' || TABLE_NAME || ' SET XML_SCHEMA_INFO = ? WHERE CURRENT OF CUR1'; PREPARE VALID_STMT FROM VALID_STMT_SQL; 201 SET INVALID_STMT_SQL = 'UPDATE ' || TABLE_SCHEMA || '.' || TABLE_NAME || ' SET XML_SCHEMA_INFO = (-1) * ?' || ' WHERE CURRENT OF CUR1'; PREPARE INVALID_STMT FROM INVALID_STMT_SQL; SET SCHEMA_FULL_QUALIFIER = 'SYSXSR' || '.' || SCHEMA_NAME; -- SCHEMA_OBJECTID ERMITTELN OPEN CUR2; FETCH CUR2 INTO CUR_SCHEMA_OBJECTID; CLOSE CUR2; OPEN CUR1 USING DOCID; FETCH CUR1 INTO CUR_DOC; -- OPTIMISTISCHE ANNAHME: DOKUMENT IST „GÜLTIG“ -- FALLS NICHT, -- DANN KORRIGIERT CONDITION ZU „FEHLERHAFT“ EXECUTE VALID_STMT USING CUR_SCHEMA_OBJECTID; SET CUR_DOC = XMLSERIALIZE( XMLPARSE(DOCUMENT SYSFUN.DSN_XMLVALIDATE( CUR_DOC, SCHEMA_FULL_QUALIFIER)) AS CLOB(2G)); CLOSE CUR1; COMMIT; END Nachträgliche Schemavalidierung CREATE PROCEDURE T24431A.SP_SCHEMA_VALIDATION_AFTER( IN TABLE_SCHEMA VARCHAR(1000), IN TABLE_NAME VARCHAR(1000), IN XML_COLUMN VARCHAR(1000), IN SCHEMA_NAME VARCHAR(1000)) LANGUAGE SQL BEGIN DECLARE SQLCODE INTEGER DEFAULT 0; DECLARE CUR_DOC CLOB(2G); DECLARE CUR_SCHEMA_OBJECTID BIGINT; DECLARE SCHEMA_FULL_QUALIFIER VARCHAR(1000); DECLARE INVALID_DOCUMENT CONDITION FOR '2201R'; DECLARE INVALID_STMT_SQL VARCHAR(10000); DECLARE VALID_STMT_SQL VARCHAR(10000); DECLARE SELECT_STMT_SQL VARCHAR(10000); DECLARE INVALID_STMT STATEMENT; DECLARE VALID_STMT STATEMENT; DECLARE SELECT_STMT STATEMENT; DECLARE CUR1 CURSOR FOR SELECT_STMT; 202 DECLARE CUR2 CURSOR FOR SELECT XSROBJECTID FROM SYSIBM.XSROBJECTS WHERE XSROBJECTNAME = SCHEMA_NAME AND XSROBJECTSCHEMA = 'SYSXSR'; DECLARE CONTINUE HANDLER FOR INVALID_DOCUMENT BEGIN EXECUTE INVALID_STMT USING CUR_SCHEMA_OBJECTID; END; SET SELECT_STMT_SQL = 'SELECT XMLSERIALIZE(' || XML_COLUMN || ' AS CLOB(2G)) AS DOC FROM ' || TABLE_SCHEMA || '.' || TABLE_NAME || ' FOR UPDATE OF ' || 'XML_SCHEMA_INFO'; PREPARE SELECT_STMT FROM SELECT_STMT_SQL; SET VALID_STMT_SQL = 'UPDATE ' || TABLE_SCHEMA || '.' || TABLE_NAME || ' SET XML_SCHEMA_INFO = ? WHERE CURRENT OF CUR1'; PREPARE VALID_STMT FROM VALID_STMT_SQL; SET INVALID_STMT_SQL = 'UPDATE ' || TABLE_SCHEMA || '.' || TABLE_NAME || ' SET XML_SCHEMA_INFO = (-1) * ?' || ' WHERE CURRENT OF CUR1'; PREPARE INVALID_STMT FROM INVALID_STMT_SQL; SET SCHEMA_FULL_QUALIFIER = 'SYSXSR' || '.' || SCHEMA_NAME; -- SCHEMA_OBJECTID ERMITTELN OPEN CUR2; FETCH CUR2 INTO CUR_SCHEMA_OBJECTID; CLOSE CUR2; OPEN CUR1; FETCH CUR1 INTO CUR_DOC; WHILE (SQLCODE=0) DO -- OPTIMISTISCHE ANNAHME: DOKUMENT IST „GÜLTIG“ -- FALLS NICHT, -- DANN KORRIGIERT CONDITION ZU „FEHLERHAFT“ EXECUTE VALID_STMT USING CUR_SCHEMA_OBJECTID; SET CUR_DOC = XMLSERIALIZE( XMLPARSE(DOCUMENT SYSFUN.DSN_XMLVALIDATE( CUR_DOC, SCHEMA_FULL_QUALIFIER)) AS CLOB(2G)); FETCH CUR1 INTO CUR_DOC; END WHILE; CLOSE CUR1; COMMIT; END 203 Messergebnisse Messreihe: Automatische und nachträgliche Schemavalidierung Merkmalsausprägung automatische Schemavalidierung (inklusive Kosten für den INSERT) Elapsed CPU nachträgliche Schemavalidierung (exklusive Kosten für den INSERT) Elapsed CPU 1K x 100.000 205,17 82,55 101,96 36,05 10K x 10.000 81,78 36,38 60,36 17,13 100K x 1.000 56,93 22,47 62,19 14,28 1M x 100 53,71 18,60 55,94 13,16 204 A.7 Komplettzugriff (Abschnitt 8.2.1) Messprozeduren Exemplarisch am Beispiel Messreihe: Größe und Anzahl (XML) Merkmalsausprägung: „10K x 10.000“ CREATE PROCEDURE T24431A.SP_XML_KOMPLETT_10K() LANGUAGE SQL BEGIN DECLARE SQLCODE INTEGER DEFAULT 0; DECLARE TMP CLOB(2G) CCSID UNICODE; DECLARE C1 CURSOR FOR SELECT XML_DOC FROM T24431A.TXML_10K; OPEN C1; WHILE (SQLCODE=0) DO FETCH C1 INTO TMP; END WHILE; CLOSE C1; END 205 Zugriffspläne Alle Messreihen Messergebnisse Messreihe: Größe und Anzahl (CLOB, VARCHAR, XML, XML (mit 3 Indexen)) Merkmalsausprägung CLOB Elapsed 200B x 500.000 VARCHAR CPU Elapsed XML (mit 3 Indexen) XML CPU Elapsed CPU Elapsed CPU 174,07 22,98 4,79 1,66 11,27 5,89 10,99 5,77 1K x 100.000 57,69 4,92 2,44 0,37 10,44 4,11 10,89 3,98 10K x 10.000 6,89 0,52 2,59 0,11 10,25 4,61 10,10 4,57 100K x 1.000 3,03 0,11 - - 9,36 4,56 10,44 4,52 1M x 100 2,71 0,07 - - 10,61 4,22 9,59 4,31 10M x 10 2,32 0,08 - - 11,40 3,03 10,96 3,05 206 Messreihe: Strukturiertheit (CLOB und XML) Merkmalsausprägung CLOB Elapsed VARCHAR CPU Elapsed CPU E (tief) 8,76 1,31 8,76 1,31 E (flach) 3,55 1,41 3,55 1,41 E (balanciert) 6,52 1,44 6,52 1,44 T 2,32 0,39 2,32 0,39 A 60,83 25,29 60,83 25,29 A, T 13,30 6,65 13,30 6,65 E, T (tief) 3,33 0,70 3,33 0,70 E, T (flach) 3,89 0,66 3,89 0,66 E, T (balanciert) 7,05 0,75 7,05 0,75 11,24 2,45 11,24 2,45 A, E (flach) 5,93 1,87 5,93 1,87 A, E (balanciert) 9,20 2,14 9,20 2,14 A, E, T (tief) 5,51 1,59 5,51 1,59 A, E, T (flach) 4,37 1,34 4,37 1,34 A, E, T (balanciert) 7,32 1,43 7,32 1,43 A, E (tief) 207 Messreihe: Zusammensetzung (XML) XML Merkmalsausprägung Elapsed CPU 1K x 100.000 11,52 4,37 10K x 10.000 8,14 3,47 100K x 1.000 8,44 3,11 1M x 100 7,97 2,75 10M x 10 7,17 1,98 208 A.8 Indexunterstützter Zugriff (Abschnitt 8.2.2) Messprozeduren Exemplarisch am Beispiel Messreihe: Größe und Anzahl (XML) Merkmalsausprägung: „10K x 10.000“ CREATE PROCEDURE T24431A.SP_XML_INDEX_10K() LANGUAGE SQL BEGIN DECLARE TMP INTEGER; DECLARE C1 CURSOR FOR SELECT COUNT(*) FROM T24431A.TXML_10K WHERE XMLEXISTS('$x/seite/textblock [@id="muster_textblock1"]' PASSING XML_DOC AS "x"); OPEN C1; FETCH C1 INTO TMP; CLOSE C1; END 209 Zugriffspläne Messreihe: Größe und Anzahl (XML (mit 3 Indexen)) Alle anderen Messreihen 210 Messergebnisse Messreihe: Größe und Anzahl (CLOB, VARCHAR, XML und XML (mit 3 Indexen)) Merkmalsausprägung CLOB Elapsed VARCHAR CPU Elapsed CPU XML (mit 3 Indexen) XML Elapsed CPU Elapsed CPU 1K x 100.000 57,69 4,92 2,44 0,37 3,45 0,45 0,20 0,00 10K x 10.000 6,89 0,52 2,59 0,11 3,82 0,29 0,21 0,00 100K x 1.000 3,03 0,11 - - 3,52 0,19 0,19 0,00 1M x 100 2,71 0,07 - - 3,42 0,21 0,23 0,00 10M x 10 2,33 0,08 - - 3,96 0,36 0,21 0,01 Messreihe: Zusammensetzung (XML) XML Merkmalsausprägung Elapsed CPU 1K x 100.000 3,81 0,45 10K x 10.000 3,68 0,28 100K x 1.000 4,09 0,24 1M x 100 3,59 0,24 10M x 10 3,71 0,21 211 A.9 Selektiver Zugriff (Abschnitt 8.2.3) Messprozeduren Exemplarisch am Beispiel Messreihe: Größe und Anzahl (XML) Merkmalsausprägung: „10K x 10.000“ CREATE PROCEDURE T24431A.SP_XML_SELEKTIV_10K() LANGUAGE SQL BEGIN DECLARE SQLCODE INTEGER DEFAULT 0; DECLARE TMP CLOB(2G) CCSID UNICODE; DECLARE C1 CURSOR FOR SELECT XMLQUERY('$x/seite/textblock [@id="muster_textblock1"]' PASSING XML_DOC AS "x") FROM T24431A.TXML_10K WHERE XMLEXISTS('$x/seite/textblock [@id="muster_textblock1"]' PASSING XML_DOC AS "x"); OPEN C1; WHILE (SQLCODE=0) DO FETCH C1 INTO TMP; END WHILE; CLOSE C1; END 212 Zugriffspläne Messreihe: Größe und Anzahl (XML (mit 3 Indexen)) Alle anderen Messreihen 213 Messergebnisse Messreihe: Größe und Anzahl (CLOB, VARCHAR, XML und XML (mit 3 Indexen)) Merkmalsausprägung CLOB Elapsed VARCHAR CPU Elapsed CPU XML (mit 3 Indexen) XML Elapsed CPU Elapsed CPU 1K x 100.000 57,69 4,92 2,44 0,37 2,92 0,34 0,18 0,00 10K x 10.000 6,89 0,52 2,59 0,11 2,73 0,30 0,19 0,00 100K x 1.000 3,03 0,11 - - 3,08 0,29 0,21 0,01 1M x 100 2,71 0,07 - - 3,44 0,33 0,25 0,01 10M x 10 2,33 0,08 - - 4,11 0,46 0,63 0,08 Messreihe: Zusammensetzung (XML) XML Merkmalsausprägung Elapsed CPU 1K x 100.000 3,09 0,34 10K x 10.000 2,50 0,20 100K x 1.000 2,34 0,15 1M x 100 2,79 0,14 10M x 10 2,47 0,14 214 A.10 Komplexe Prädikate (Abschnitt 8.2.4) Messprozeduren Exemplarisch am Beispiel Messreihe: Größe und Anzahl (XML) Merkmalsausprägung: „10K x 10.000“ CREATE PROCEDURE T24431A.SP_XML_COMPLEX_10K() LANGUAGE SQL BEGIN DECLARE TMP INTEGER; DECLARE C1 CURSOR FOR SELECT COUNT(*) FROM T24431A.TXML_10K WHERE XMLEXISTS('$x/seite/textblock [(@pox=20 and @posy=10) or (@posx=10 and @posy=20)]' PASSING XML_DOC AS "x"); OPEN C1; FETCH C1 INTO TMP; CLOSE C1; END 215 Zugriffspläne Messreihe: Größe und Anzahl (XML (mit 3 Indexen)) – nur Merkmalsausprägung „1K x 100.000“ Alle anderen Messreihen 216 Messergebnisse Messreihe: Größe und Anzahl (CLOB, VARCHAR, XML und XML (mit 3 Indexen)) Merkmalsausprägung CLOB Elapsed VARCHAR CPU Elapsed CPU XML (mit 3 Indexen) XML Elapsed CPU Elapsed CPU 1K x 100.000 57,69 4,92 2,44 0,37 11,29 5,90 0,22 0,01 10K x 10.000 6,89 0,52 2,59 0,11 34,75 13,97 39,30 14,12 100K x 1.000 3,03 0,11 - - 36,46 15,10 40,44 14,88 1M x 100 2,71 0,07 - - 34,71 14,75 43,57 15,09 10M x 10 2,33 0,08 - - 37,14 15,93 44,11 16,52 Messreihe: Zusammensetzung (XML) XML Merkmalsausprägung Elapsed CPU 1K x 100.000 17,58 5,90 10K x 10.000 15,42 5,16 100K x 1.000 15,98 5,47 1M x 100 15,71 5,57 10M x 10 12,70 4,77 217 Selbstständigkeitserklärung Ich erkläre, dass ich die vorliegende Arbeit selbstständig und nur unter Verwendung der angegebenen Quellen und Hilfsmittel angefertigt habe. Jena, 31.01.2012, Christoph Koch