\documentclass{beamer} \mode{\usetheme{Marburg}} \setbeamercovered{transparent} \usepackage{ngerman} \usepackage[utf8]{inputenc} \usepackage{tikz} \usetikzlibrary{shapes} \usepackage{graphicx} \usepackage{listings} \lstset{showstringspaces=false} \lstset{stringstyle=\color{red!70!black}} \lstset{basicstyle=\small} \AtBeginSection[] { \begin{frame} \frametitle{Übersicht} \tableofcontents[currentsection] \end{frame} } \AtBeginSubsection[] { \begin{frame} \frametitle{Übersicht} \tableofcontents[currentsection,currentsubsection] \end{frame} } \tikzstyle{pfeil}=[->,thick] \tikzstyle{pfeilwichtig}=[->,draw=red!50,thick] \tikzstyle{rel}=[ellipse,draw,thick] \tikzstyle{xml}=[ellipse,draw,fill=red!40,thick] \newcommand{\xmltag}[1]{$\langle${#1}$\rangle$} \newcommand{\xmltext}[1]{#1} \title{XQuery in MS SQL Server 2005} \author{Volker Grabsch \and Christine Janischek} \date{14. Januar 2008} \begin{document} \begin{frame} \titlepage \end{frame} \begin{frame} \frametitle{Allgemeines} \begin{itemize} \item veröffentlicht unter \\ \url{http://www.profv.de/uni/} \vfill \item lizensiert unter \\ \href{http://creativecommons.org/licenses/by-sa/3.0/deed.de}{% % CC-Icons heruntergeladen von: % http://creativecommons.org/presskit \includegraphics{by-sa} \\ Creative Commons BY-SA 3.0} \end{itemize} \end{frame} \begin{frame} \frametitle{Quelle} Dieser Vortrag basiert auf dem Paper \begin{quote} XQuery Implementation \\ in a Relational Database System \end{quote} und der Webseite \begin{quote} \href{http://technet.microsoft.com/en-us/library/ms345117.aspx} {XML Support in Microsoft SQL Server 2005} \end{quote} der Microsoft Corporation. \end{frame} \begin{frame} \frametitle{Übersicht} \tableofcontents \end{frame} \section{Benutzung} \begin{frame}[fragile] \frametitle{Beispiel-Relation "`reports"'} \begin{center} \begin{tabular}{ll} \hline \textbf{reportname} & \textbf{report} \\ \hline Bericht-0 & \begin{lstlisting}[language=XML,basicstyle=\tiny] Christine Volker Jan 2008
\end{lstlisting} \\ \hline Bericht-1 & \begin{lstlisting}[language=XML,basicstyle=\tiny] Christine Volker Jan 2008
... blabla ...
\end{lstlisting} \\ \hline Bericht-2 & \begin{lstlisting}[language=XML,basicstyle=\tiny] Christine Volker Jan 2008
... blabla ...
... suelzsuelz ...
\end{lstlisting} \\ \hline \end{tabular} \end{center} \end{frame} \begin{frame}[fragile] \frametitle{Registrieren des XML-Schemas} \begin{itemize} \item XML-Schemas müssen registriert werden \item Erkennungsmerkmal: Namespace \begin{itemize} \item http://www.profv.de/uni/xml\_xpath\_xquery/report \end{itemize} \end{itemize} \pause \begin{lstlisting}[language=SQL,basicstyle=\tiny] CREATE XML SCHEMA COLLECTION report_schemas AS ' ' ALTER XML SCHEMA COLLECTION report_schemas ADD '...' \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Erstellen der Relation} \begin{itemize} \item Relation mit Constraint für das XML-Schema \begin{lstlisting}[language=SQL] CREATE TABLE reports ( reportname VARCHAR(64) PRIMARY KEY, report XML(DOCUMENT report_schemas) ) \end{lstlisting} \pause \item XML-Index \begin{lstlisting}[language=SQL] CREATE PRIMARY XML INDEX pxi_report ON reports (report) \end{lstlisting} \pause \item XML-Dokumente mit Namespace einfügen \begin{lstlisting}[language=SQL,basicstyle=\tiny] INSERT INTO reports (reportname, report) VALUES ('Bericht-0', ' Christine Volker Jan 2008
') \end{lstlisting} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Einfache SQL/XQuery-Anfrage} \begin{lstlisting}[language=SQL] SELECT reportname, report.query(' FOR $i in /report[date="Jan 2008"] RETURN {$i/section} ') FROM reports \end{lstlisting} \end{frame} \section{Anfrage-Bearbeitung} \begin{frame} \frametitle{Anfrage-Bearbeitung} \begin{itemize} \item XQuery $\rightarrow$ XML-Algebra-Baum \item XML-Algebra-Baum $\rightarrow$ (relationaler) Op.-Baum \item Op.-Baum erhält zusätzliche Operationen (Rel+) \item Optimierung des \textit{gesamtem} Op.-Baums \end{itemize} \end{frame} \begin{frame} \frametitle{Anfrage-Bearbeitung} \begin{center} \begin{tikzpicture}[node distance=1.4cm] \node [rel] (Ergebnis) {Ergebnis}; \node [rel] (Optimierung) [above of=Ergebnis] {Optimierung} edge [pfeil] (Ergebnis); \node [rel] (Op-Baum) [above of=Optimierung] {Op.-Baum \textcolor{red!60}{(Rel+)}} edge [pfeil] (Optimierung); \node [rel] (SQL) [above of=Op-Baum,xshift=-2cm] {SQL} edge [pfeil] (Op-Baum); \node [xml] (XML-Op-Baum) [above of=Op-Baum,xshift=2cm] {Op.-Baum (XML)} edge [pfeil] (Op-Baum); \node [xml] (XQuery) [above of=XML-Op-Baum] {XQuery} edge [pfeil] (XML-Op-Baum); \node [rel] (Anfrage) [above of=XQuery,xshift=-2cm] {Anfrage} edge [pfeil] (XQuery) edge [pfeil] (SQL); \end{tikzpicture} \end{center} \end{frame} \begin{frame} \frametitle{Neue relationale Operatoren (Rel+)} \begin{itemize} \item Apply \item XML\_Serialize \item Assemble Subtree \item Switch\_Union \end{itemize} \end{frame} \begin{frame} \frametitle{Datenstruktur} \begin{itemize} \item XML-Dokument oder mehrere XML-Fragmente \pause \item XML als BLOB \begin{itemize} \item XML nicht in Relationen zerlegt \end{itemize} \pause \item XML-Index zeigt in den BLOB \item Auswertung: XML-Parser an entsprechender Stelle ansetzen \item Serialisierung: Ausschnitte herauskopieren \end{itemize} \end{frame} \begin{frame} \frametitle{Typcheck} \begin{itemize} \item Typ-Inferenz \item überwiegend statischer Typcheck \item XML-Schema genutzt \pause \item Fehlerbehandlung \begin{itemize} \item bei statischem Typcheck $\rightarrow$ Abbruch \item bei dynamischen Typcheck $\rightarrow$ NULL / leeres XML \end{itemize} \end{itemize} \end{frame} \begin{frame} \frametitle{XML-Index} \begin{itemize} \item indexierter vs. nicht-indexierter XML-Zugriff \pause \item primärer XML-Index \begin{itemize} \item XML-Knoten (Name, Typ, Wert) \item Pfad-ID \item OrdPath \end{itemize} \pause \item sekundäre XML-Indexe \begin{itemize} \item PATH \item PROPERTY \item VALUE \end{itemize} \end{itemize} \end{frame} \section{XQuery-Übersetzung} \begin{frame} \frametitle{XQuery-Übersetzung: FOR} \begin{itemize} \item FOR \begin{itemize} \item XPath-Ausdruck \begin{itemize} \item Pfad-Ausdruck: exakt vs. inexakt \item Prädikat: siehe WHERE \end{itemize} \item Variablenbindung (Apply) \end{itemize} \end{itemize} \end{frame} \begin{frame} \frametitle{Beispiel: Exakter Pfad-Ausdruck} \resizebox{\textwidth}{!}{% \includegraphics{Scherz-Skizze-3}} \setbeamercovered{invisible} \pause \begin{center} \Large\bf\color{red} Nur ein Scherz! \end{center} \end{frame} \begin{frame}[fragile] \frametitle{Beispiel: Exakter Pfad-Ausdruck} \begin{lstlisting}[language=SQL] SELECT reportname, report.query(' FOR $i in /report/section RETURN $i') FROM reports \end{lstlisting} \hrulefill \vfill \begin{tikzpicture}[level distance=1cm] \tikzstyle{level 1}=[sibling distance=0cm] \tikzstyle{level 2}=[sibling distance=5cm] \tikzstyle{level 3}=[sibling distance=1.5cm] \node {XML\_Serialize} child[level distance=0.8cm] {node {Apply} child {node {SELECT(\$i)} child {node {GET(PXI)}} child[level distance=1.5cm] {node {Path\_ID='\#section\#report'}}} child {node {SELECT} child {node {GET(PXI)}} child[level distance=2cm] {node {\$i.OrdPath $\leq$ OrdPath $<$ DL(\$i)}}}} ; \end{tikzpicture} \end{frame} \begin{frame}[fragile] \frametitle{Beispiel: Inexakter Pfad-Ausdruck} \begin{lstlisting}[language=SQL] SELECT reportname, report.query(' FOR $i in /report//section RETURN {$i}') FROM reports \end{lstlisting} \hrulefill \vfill \begin{tikzpicture}[level distance=1cm] \tikzstyle{level 1}=[sibling distance=0cm] \tikzstyle{level 2}=[sibling distance=4cm] \tikzstyle{level 3}=[sibling distance=4cm] \node {XML\_Serialize} child[level distance=0.8cm] {node {Apply} child {node {SELECT(\$i)} child {node {GET(PXI)}} child[level distance=1.5cm] {node {Path\_ID LIKE '\#section\%\#report'}}} child[level distance=1.1cm] {node {Assemble subtree of $<$section$>$}}} ; \end{tikzpicture} \end{frame} \begin{frame} \frametitle{XQuery-Übersetzung: LET} \begin{itemize} \item LET \begin{itemize} \item (noch) nicht unterstützt \end{itemize} \end{itemize} \end{frame} \begin{frame} \frametitle{XQuery-Übersetzung: WHERE} \begin{itemize} \item WHERE / XPath-Prädikat \begin{itemize} \item SQL: Sub-SELECT mit EXISTS-Quantor \end{itemize} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Beispiel: XPath-Prädikat} \begin{lstlisting}[language=SQL] SELECT reportname, report.query(' FOR $i in /report[date="Jan 2008"] RETURN {$i}') FROM reports \end{lstlisting} \hrulefill \vfill \begin{tikzpicture}[level distance=0.8cm] \tikzstyle{level 1}=[sibling distance=4cm] \tikzstyle{level 2}=[sibling distance=4cm] \tikzstyle{level 3}=[sibling distance=4cm] \tikzstyle{level 4}=[sibling distance=4cm] \node {...} child {node {SELECT} child {node {...}} child {node {EXISTS} child {node {SELECT} child {node {GET(PXI)}} child {node {VALUE='Jan 2008' AND ...}}}}} ; \end{tikzpicture} \end{frame} \begin{frame} \frametitle{XQuery-Übersetzung: ORDER BY} \begin{itemize} \item ORDER BY \begin{itemize} \item SQL: ORDER BY \item zusätzliche Spalte: Rangfolge \begin{itemize} \item konvertiert nach OrdPath \end{itemize} \end{itemize} \end{itemize} \end{frame} \begin{frame} \frametitle{XQuery-Übersetzung: RETURN} \begin{itemize} \item RETURN \begin{itemize} \item zusätzliche Spalte: New-Flag \item Zusammenfügen unter Berücksichtigung des Flags (Switch\_Union) \end{itemize} \end{itemize} \end{frame} \section{Optimierungen} \begin{frame}[fragile] \frametitle{Optimierungen} \begin{itemize} \item unnötige Sortierungen vermeiden \pause \item Pfade über Klauseln hinweg zusammenführen \begin{lstlisting} FOR $i in /report RETURN $i/author \end{lstlisting} \pause \item nutze statische Typ-Information \begin{itemize} \item Zwischenwerte in korrektem Typ \item unnötige Konvertierungen vermeiden \item bei 1-elementigen Listen abkürzen \end{itemize} \end{itemize} \end{frame} \begin{frame} \frametitle{Frage an das Publikum} \begin{itemize} \item Wird das XML-Schema zur Optimierung genutzt? \end{itemize} \end{frame} \end{document}