440 likes | 566 Views
Effiziente Evaluierung von XQuery-Anfragen über XML-Strömen. Michael Schmidt, 05.11.2007 LS Datenbanken und Informationssysteme, Prof. Georg Lausen Graduiertenkolleg „Mathematische Logik und Anwendungen“. Inhalt. XQuery Auswertung auf XML-Strömen Motivation und Anforderungen
E N D
Effiziente Evaluierung von XQuery-Anfragen über XML-Strömen Michael Schmidt, 05.11.2007 LS Datenbanken und Informationssysteme, Prof. Georg Lausen Graduiertenkolleg „Mathematische Logik und Anwendungen“
Inhalt XQuery Auswertung auf XML-Strömen • Motivation und Anforderungen • Statische Analyse: Effiziente Projektion von XML-Dokumenten • Kombination statischer & dynamischer Analyse: Effiziente Minimierung von Hauptspeicherressourcen Christoph Koch, Stefanie Scherzinger, Michael Schmidt XML Prefiltering as a String Matching Problem. In Proc. ICDE 2008. To appear. Michael Schmidt, Stefanie Scherzinger, Christoph Koch Combined Static and Dynamic Analysis for Effective Buffer Minimization in Streaming XQuery Evaluation. In Proc. ICDE 2007.
I. Motivation und Anforderungen Motivation • Verarbeitung von XML-Strömen gewinnt immer mehr an Bedeutung z.B. Börsendaten, Satellitendaten, Temperaturdaten … • Empfangsraten ggf. sehr hoch Zwischenspeichern auf Festplatte oft unmöglich • Herkömmliche DBMS ungeeignet, da • Daten üblicherweise phyikalisch gespeichert werden… • … und Zwischenspeichern zudem oftmals überflüssig ist
I. Motivation und Anforderungen Motivation • Daten müssen im Hauptspeicher verarbeitet werden • Probleme: • Datenmengen können sehr groß werden • Darstellung von XML-Dokumenten im Speicher als DOM-Baum sehr platzaufwendig Effizientes Puffermanagement wird zur Schlüsselkomponente • Streaming Techniken auch sehr gut geeignet für in-memory Engines
I. Motivation und Anforderungen Anforderungen an Pufferminimierung • Puffere lediglich die Daten, die auch zur Auswertung der Anfrage benötigt werden • Vermeide mehrfache Kopien der selben Daten im Hauptspeicher • Puffere die Daten nicht länger als notwendig
I. Motivation und Anforderungen Projektion von XML Dokumenten • Puffere lediglich die Daten, die auch zur Auswertung der Anfrage benötigt werden A. Marian and J. Siméon Projecting XML Documents In Proc. VLDB’03, pages 213–224, 2003 S. Bréssan, B. Catania, Z. Lacroix, Y. G. Li and A. Maddalena Accelerating Queries by Pruning XML Documents TKDE, 54(2):211–240, 2005 V. Benzaken, G. Castagna, D. Colazzo, and K. Nguyen Type-Based XML Projection In Proc. VLDB’06, 2006 Projektion • Statische Analyse der XML-Query • Identifikation von Teilen des XML-Dokuments, die für die Anfrageauswertung relevant sind • Nicht relevante Teile des XML-Dokuments können wegprojiziert werden
I. Motivation und Anforderungen article isbn isbn … … … … … … … Projektion von XML Dokumenten XQuery Pfade <q> { for $b in /bib/book where ($b/author=“A. Turing” and fn:exists($b/price)) return $b/title } </q> { /bib/book, /bib/book/author/ dos::node(), /bib/book/price, /bib/book/title/ dos::node() } XML-Dokument bib dos:=descendant-or-self (wählt Knoten und alle descendants aus) dos:=descendant-or-self book book author price title author price title … … … …
I. Motivation und Anforderungen Existierende Ansätze • Analyse der XML-Query und Extraktion relevanter Pfade im Eingabedokument • Tokenizen des XML-Dokuments • Kompilieren eines Automaten, der für eingehende Tokens on-the-fly überprüft, ob diese relevant sind XQuery XML-Dokument <r> { /bib/book/title, /bib/book//author } </r> „<bib><article></article> <book><title>T</title> <author>A</author></book> </bib>“ Pfade { /bib/book/title, /bib/book//author }
I. Motivation und Anforderungen Existierende Ansätze • Analyse der XML-Query und Extraktion relevanter Pfade im Eingabedokument • Tokenizen des XML-Dokuments • Kompilieren eines Automaten, der für eingehende Tokens on-the-fly überprüft, ob diese relevant sind XML Pfade ●/bib/book/title ●/bib/book//author <bib> <article> </article> <book> <title> T </title> <author> A </author> </book> </bib> {/bib/book/title, /bib/book//author} <bib> /bib●/book/title /bib●/book//author <article> <book> /bib/book●//author /bib/book●/title <title> <author> /bib/book●//author /bib/book/title● /bib/book●//author /bib/book//author●
II. Projektion von XML-Dokumenten Optimierter Ansatz • Projektion ohne Zerlegung in Tokens • Lokalisierung der relevanten Pfade erfolgt durch effiziente String-Matching Algorithmen Exkurs: String Matching Techniken b e g i n in Text; Länge des Schlüsselworts = 5 Suche nach match b e g i n b e g i n b e g b i e n g i n b e g i b n e g i n S t r i n g m a t c h i n g f o r b e g i n n e r s 1 5 10 15 20 25 Ähnliche Techniken für parallele Suche nach mehreren Keywords!
II. Projektion von XML-Dokumenten XML Prefiltering mit String Matching Techniken XQuery DTD <r> { /bib/book/title, /bib//author } </r> <!ELEMENT bib (article,book)> <!ELEMENT article (title*,author*)> <!ELEMENT book (title*,author*)> <!ELEMENT title #PCDATA> <!ELEMENT author #PCDATA> <!ELEMENT year #PCDATA> Pfade { /bib/book/title, /bib//author } bib article book title title … author … title … author … author title author „T1“ „T1“ „A1“ „A2“ „T1“ „T1“ „A1“ „A3“
II. Projektion von XML-Dokumenten XML Prefiltering mit String Matching Techniken DTD <!ELEMENT bib (article,book)> <!ELEMENT article (title*,author*)> <!ELEMENT book (title*,author*)> <!ELEMENT title #PCDATA> <!ELEMENT author #PCDATA> <!ELEMENT year #PCDATA> Pfade { /bib/book/title, /bib//author } Suche „<article>“ Suche „</author>“ <author> <author> Suche „<bib>“ <title> Suche „<author>“ und „</article>“ <article> <bib> <title> </title> <author> </author> <article> <book> </article> </article> <book> <author> <author> <title> <book> <title> </title> <author> </author> </book> </book> </bib>
II. Projektion von XML-Dokumenten XML Prefiltering using String Matching Techniques Vorkompilieren der Automaten/Sprungtabellen in Lookup-Tables: DFA Vokabular Action Kurzer, hocheffizienter Laufzeitalgorithmus, der die vorkompilierten Lookup-Tables nutzt
II. Projektion von XML-Dokumenten XML Prefiltering using String Matching Techniques • Prototyp-Implementierung in C++ • Experimente • Setting • Core2 Duo IBMThinkPad Z61p • T2500 2.00GHz CPU mit 1GB RAM • Ubuntu Linux 6.06 LTS • Verschiedene Daten: XMark, Medline, ProtSeq • Verschiedene Dokumentgrößen: 1MB bis 5000MB
II. Projektion von XML-Dokumenten XML Prefiltering using String Matching Techniques Projektion eines 5.000MB XMark Dokuments für verschiedene XMark Queries
II. Projektion von XML-Dokumenten XML Prefiltering using String Matching Techniques TimeFail: >1 Stunde MemFail: >1GB Verbesserung von XQuery Engines durch Projektion Erfolgsquoten für 18 XMark Queries mit vs. ohne Projektion
II. Projektion von XML-Dokumenten XML Prefiltering using String Matching Techniques Durchsatzverbesserung durch Projektion für XPath Queries MB/s • Datensätze: • Medline: M1-M5 • Protein Sequence: P1-P5 • Einfache XPath-Anfragen • Auswertung durch SPEX
III. Kombination statischer und dynamischer Analyse Kombination Statischer und Dynamischer Analyse • Vermeide mehrfache Kopien der selben Daten im Hauptspeicher • Puffere die Daten nicht länger als notwendig Behauptung: Sowohl statische als auch dynamische Analyse erforderlich, um beide Ansprüche zu erfüllen Michael Schmidt, Stefanie Scherzinger, Christoph KochCombined Static and Dynamic Analysis for Effective Buffer Minimization in Streaming XQuery Evaluation In Proc. ICDE 2007, Istanbul
III. Kombination statischer und dynamischer Analyse Das GCX-System Rollen Eingabestrom Puffer (Knoten, annotiert mit Rollen) Umgeschriebene XQuery (Rollen-Updates) XQuery Variablen -bindung Entfernen von Rollen, Aktive Garbage Collection Evaluator Ausgabestrom
III. Kombination statischer und dynamischer Analyse Ableiten von Rollen XQuery <r> { for $bib in /bib return ( for $book in $bib/book for $title in $book/title return $title, for $author in $bib//author return $author ) } </r> Projektions-Baum r1 /bib r2 //author /book r4 /bib//author/dos::node() /descendant-or-self::node() /title Pfade r3 /bib/book/title/dos::node() { /bib/book/title/dos::node(), /bib//author/dos::node() } /descendant-or-self::node()
III. Kombination statischer und dynamischer Analyse Verteilen von Rollen • Selektierte Dokumentknoten bekommen Rollen zugewiesen, wenn sie in den Puffer geladen werden • Unselektierte Knoten werden wegprojiziert XML Dokument Rollen r1 /bib r2 /bib/book r3 /bib/book/title/dos::node() r4 /bib//author/dos::node() { r1 } bib { r2 } book { r3 } { r4} title author
III. Kombination statischer und dynamischer Analyse Umschreiben der XQuery: Rollenupdates <r> { for $bib in /bib return ( ( for $book in $bib/book ( for $title in $book/title return ( $title, signOff($title/dos::node(),r3) ), signOff($book,r2) ), for $author in $bib//author return ( $author, signOff($author/dos::node(),r4) ) ), signOff($bib,r1) ) } </r> Entfernt Rolle r3 vom Knoten, an den Variable $title derzeit gebunden ist incl. allen Descendant-Knoten XQuery <r> { for $bib in /bib return (for $book in $bib/book for $title in $book/title return $title, for $author in $bib//author return $author ) } </r> Rollen r1 /bib r2 /bib/book r3 /bib/book/title/dos::node() r4 /bib//author/dos::node()
III. Kombination statischer und dynamischer Analyse Aktives Garbage Collection XQuery Input Stream <r> { for $bib in /bib return ( ( for $book in $bib/book ( for $title in $book/title return ( $title, signOff($title/dos::node(),r3) ), signOff($book,r2) ), for $author in $bib//author return ( $author, signOff($author/dos::node(),r4) ) ), signOff($bib,r1) ) } </r> <bib> <title> </title> <author> </author> </book> </bib> <book> Buffer {} { r1 } bib {} { r2 } book { r3 } {} {} { r4 } title author Output Stream <r> <title> </title> <author> </author> </r>
III. Kombination statischer und dynamischer Analyse Die GCX Engine • Garbage Collected XQuery • Implementiert für ein mächtiges Fragment von XQuery • Verschachtelte for-loops • Child und descendant Axen • For–where–return expressions • If-expressions mit and, or, not, Existenzchecks • Aggregationen derzeit nicht unterstützt • Open Source (Berkeley Software Distribution Licence) • GCX Projektseite: http://dbis.informatik.uni-freiburg.de/index.php?project=GCX
III. Kombination statischer und dynamischer Analyse Benchmarks GCX • Messung von Zeit- und Speicherverbrauch • Queries und Dokumente des XMark Benchmarks (angepasst) • Experimentelles Setting: • 3GHz CPU Intel Pentium IV mit 2GB RAM • SuSe Linux 10.0 • J2RE v1.4.2 für Java-basierte Systeme • 1 Stunde Zeitlimit pro Query • Benchmarks gegen verschiedene Systeme • FluX: In-memory Engine für Streaming XQuery Evaluation (Java) • MonetDB v4.12.0/XQuery v0.12.0: Secondary storage Engine (C++) • QizX/open v1.1: Freie in-memory XQuery Engine (Java) • Saxon v8.7.1: Freie in-memory XQuery Engine (Java)
III. Kombination statischer und dynamischer Analyse Benchmarks GCX Laufzeit (s) XMark Q1 <query1> { for $s in /site return for $p in $s/people return for $pe in $pe/person return if ($pe/person_id="person0") then <result>{ $pe/name }</result> else () } </query1>
III. Kombination statischer und dynamischer Analyse Benchmarks GCX Speicherverbrauch (MB) XMark Q1 <query1> { for $s in /site return for $p in $s/people return for $pe in $pe/person return if ($pe/person_id="person0") then <result>{ $pe/name }</result> else () } </query1>
III. Kombination statischer und dynamischer Analyse Benchmarks GCX Speicherverbrauch (MB) Laufzeit (s) • XMark Q8: • Komplexer als Q1 • Join Query • Erfordert gewisse Menge an Pufferung Time Fail 100MB: MonetDB – Time Fail 200MB: GCX, FluxQuery, MonetDB
III. Kombination statischer und dynamischer Analyse Aktives Garbage Collection <query6> { for $site in //site return for $regions in $site/regions return $regions//item} </query6> Buffer plot for XMark Q6 on 10MB input document According to the DTD: all regions occur at the beginning of the document
Benchmark Queries (2) <query8> { for $root in (/) return for $site in $root/site return for $people in $site/people return for $person in $people/person return <item> { ( <person>{ $person/name }</person>, <items_bought> { for $site2 in $root/site return for $cas in $site2/closed_auctions return for $ca in $cas/closed_auction return for $buyer in $ca/buyer return if ($buyer/buyer_person=$person/person_id) then <result> { $ca } </result> else () } </items_bought> ) } </item> } </query8>
III. Kombination statischer und dynamischer Analyse Aktives Garbage Collection XQuery <r> { for $bib in /bib return (for $x in $bib/* return if (not(exists($x/price))) then $x else (), for $b in $bib/book return $b/title) } </r> 9 x article + 1 x book Dokument bib (book|article)* author title price 9 x book + 1 x article
Benchmark Queries (1) <query1> { for $s in /site return for $p in $s/people return for $pe in $pe/person return if ($pe/person_id="person0") then <result>{ $pe/name }</result> else () } </query1> <query6> { for $site in //site return for $regions in $site/regions return $regions//item} </query6>
Benchmark Queries (3) <query13> { for $site in /site return for $regions in $site/regions return for $australia in $regions/australia return for $item in $australia/item return <item> { ( <name> { $item/name } </name>, <desc> { $item/description } </desc> ) } </item>} </query13>
Benchmark Queries (4) <query20> { for $site in /site return for $people in $site/people return for $person in $people/person return if (fn:not(fn:exists($person/person_income))) then $person else ()} </query20>
Buffer Plot (1) <query6> { for $site in //site return for $regions in $site/regions return $regions//item} </query6> Buffer plot for XMark Q6 on 10MB input document According to the DTD: all regions occur at the beginning of the document
Buffer Plot (2) XQuery <r> { for $bib in /bib return (for $x in $bib/* return if (not(exists($x/price))) then $x else (), for $b in $bib/book return $b/title) } </r> 9 x article + 1 x book Dokument bib (book|article)* author title price 9 x book + 1 x article
Buffer Plot (3) first partition of join partners: persons second partition of join partners: buyers <query8> { for $root in (/) return for $site in $root/site return for $people in $site/people return for$personin $people/person return <item> { ( <person>{ $person/name }</person>, <items_bought> { for $site2 in $root/site return for $cas in $site2/closed_auctions return for $ca in $cas/closed_auction return for$buyerin $ca/buyer return if ($buyer/buyer_person=$person/person_id) then <result> { $ca } </result> else () } </items_bought> ) } </item> } </query8> Buffer plot for XMark Q8 on 10MB input document
The GCX Runtime Engine Buffer XQuery input stream node lookup garbage collection nodes/roles nextNode() getNext($x/π) Stream Preprojector Buffer Manager Evaluator node/eos node/NULL OK signOff($x/π,r) output stream
System Architecture input stream input stream Stream Preprojector Projection Paths Roles Projection DFA (constructed lazily, assigns roles) Rewritten XQuery (role updates) Normalized XQuery Buffer (nodes & roles) role updates input XQuery Evaluator output stream
II. Projektion von XML-Dokumenten XML Prefiltering mit String Matching Techniken <author> <author> </author> <article> <book> <book> <author> <author> <title> <title> </title> <author> </author> </book> </book> </bib> <bib><article> </article><book> … titles authors titles authors Suche „<article>“ Suche „<author>“ und „<book>“ Suche „</author>“ Suche „<author>“ und „<book>“ Suche „<title>“, „<author>“, „</book>“
II. Projektion von XML-Dokumenten XML Prefiltering mit String Matching Techniken XQuery Pfade <r> { /bib/book/title, /bib//author } </r> { /bib/book/title, /bib//author } bib article book title title … author … title … author … author title author „T1“ „T1“ „A1“ „A2“ „T1“ „T1“ „A1“ „A3“ <bib><article> </article><book> … titles authors titles authors
Exkurs: XML und XQuery XML-Dokument XQuery “/”: selektiert Kind-Knoten <bib> <book> <title>T1</title> <author>A1</author> </book> <book> <title>T2</title> <author>A2</author> </book> <article> <author>A3</author> </article> </bib> <q> { for $book in /bib/book where ($book/title=„T1“) return $book, for $author in /bib//author return $author } </q> “//”: selektiert Descendant-Knoten Ergebnis <q> <book> <title>T1</title> <author>A1</author> </book> <author>A1</author> <author>A2</author> <author>A3</author> </q>