Add 'idb_skript/' from commit 'c58e48248db6a8d8856da9d232901f90d2f76434'
git-subtree-dir: idb_skript git-subtree-mainline:d4458978d8
git-subtree-split:c58e48248d
10
idb_skript/.gitignore
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
*.fls
|
||||
*.lof
|
||||
*.swp*
|
||||
*.pdf
|
||||
*.aux
|
||||
*.out
|
||||
*.log
|
||||
*.toc
|
||||
*.fdb*
|
||||
X.tex
|
86
idb_skript/Anfrageverarbeitung.tex
Normal file
@ -0,0 +1,86 @@
|
||||
\section{Anfrageverarbeitung}
|
||||
|
||||
\subsection{Allgemein}
|
||||
Eine SQL Anfrage ist ein mengenorientierter Zugriff.
|
||||
D.h. diese mengenorientierten Operatoren müssen auf satzorientierte
|
||||
Operatoren abgebildet werden.
|
||||
\subsubsection{Phasen}
|
||||
\textbf{Verarbeitungsschritte}:
|
||||
\begin{itemize}
|
||||
\item Syntax überprüfen
|
||||
\item Rechte und Integritätsbedingungen (Formate) prüfen
|
||||
\item \textbf{Anfrageoptimierung} um effizient Query zu bearbeiten
|
||||
\item Code Generieung
|
||||
\end{itemize}
|
||||
\begin{figure}[H]
|
||||
\begin{center}
|
||||
\includegraphics[scale=0.7]{pics/anfrageverarbeitung.png}
|
||||
\caption{Phasen der Anfrageverarbeitung}
|
||||
\end{center}
|
||||
\end{figure}
|
||||
\textbf{Ziel}:\\
|
||||
Umsetzung deskriptiver Anfragen in eine \glqq optimale\grqq Folge
|
||||
interner DBS-Operationen
|
||||
\subsection{Interndarstellung}
|
||||
\subsubsection{Relationale Algebra}
|
||||
Definition von relationalen \textbf{logischen Operatoren}:
|
||||
\begin{itemize}
|
||||
\item Selektion: Auswahl von \glqq Zeilen\grqq (\textbf{where}-Klausel)
|
||||
\item Projektion Auswahl von \glqq Spalten\grqq (\textbf{select}-Klausel)
|
||||
\item Kreuzprodukt: Konkatenation derjenigen Tupel aus zwei Relationen(\textbf{from})
|
||||
\item Verbund: Konkatenation derjenigen Tupel aus zwei Relationen
|
||||
die eine Bedingung erfüllen(\textbf{from-where})
|
||||
\item Mengenoperationen auf zwei Relationen:
|
||||
\begin{itemize}
|
||||
\item $R \cup S$ bzw \textbf{UNION(R,S)}
|
||||
\item $R \cap S$ bzw \textbf{INTERSECT(R,S)}
|
||||
\item $R \setminus S$ bzw \textbf{EXCEPT(R,S)}
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\subsubsection{Operatorbaum}
|
||||
Beispiel:
|
||||
\begin{lstlisting}
|
||||
select Name, Beruf
|
||||
from Abt a, Pers p,
|
||||
PM pm , Projekt pj
|
||||
where a.ANr = p.ANr
|
||||
and a.AOrt = "Erlangen"
|
||||
and p.PNr = pm.PNr
|
||||
and pm.JNr = pj.JNr
|
||||
and pj.POrt = "Erlangen"
|
||||
\end{lstlisting}
|
||||
|
||||
\begin{figure}[H]
|
||||
\begin{center}
|
||||
\includegraphics[scale=0.7]{pics/operatorbaum.png}
|
||||
\caption{Operatorbaum}
|
||||
\end{center}
|
||||
\end{figure}
|
||||
Blattknoten: Relationen\\
|
||||
Gerichtete Kanten: Datenfluss\\
|
||||
Knoten: Operatoren der Relationalen Algebra
|
||||
\subsection{Restrukturierung}
|
||||
Regeln:
|
||||
\begin{enumerate}
|
||||
\item Ein n-facher Verbund kann durch eine Folge von binären Verbunden ersetzt und werden und umgekehrt
|
||||
\item Verbund ist kommutativ
|
||||
\item Verbund ist assoziativ
|
||||
\item Selektionen können zusammengefasst werden
|
||||
\item Projektionen können zusammengefasst werden
|
||||
\item Selektionen und Projektionen dürfen vertauscht werden
|
||||
\item Selektionen und Verbund dürfen vertauscht werden
|
||||
\item Selektion darf mit Vereinigung und Differenz vertauscht werden
|
||||
\item Selektion und Kreuzprodukt können zu Verbund zusammengefasst weren
|
||||
\end{enumerate}
|
||||
\subsubsection{Algorithmus}
|
||||
\textbf{Ziel}: Kreuzprodukt vermeiden
|
||||
Heuristik:
|
||||
\begin{itemize}
|
||||
\item komplexe Verbundoperationen zerlegen in binäre Verbunde (Regel 1)
|
||||
\item Selektionen mit mehreren Prädikat Termen separieren in Selektionen mit jeweils einem Prädikat Term (Regel 4)
|
||||
\item Selektionen so früh wie möglich ausführen (Regel 7 und 8)
|
||||
\item Selektionen und Kreuzprodukt zu Verbund zusammenfassen, wenn
|
||||
das Selektionsprädikat Attribute aus den beiden Relationen verwendet (Regel 9)
|
||||
\item Projektionen so früh wie möglich ausführen, allerdings nicht vor Selektion und Mengenoperationen.
|
||||
|
||||
\end{itemize}
|
112
idb_skript/BBaum.tex
Normal file
@ -0,0 +1,112 @@
|
||||
\section{BBaum}
|
||||
Idee: Zusammenfassung ganz bestimmter Sätze in einem Block.
|
||||
Mehrwegbaum: jeder Knoten entspricht einem Block.
|
||||
|
||||
\subsection{Aufbau}
|
||||
Am Anfang eines jeden Knotens steht $n$. $n$ ist Anzahl der verwendeten
|
||||
Einträge, $k \leq n \leq 2k$ (in root $ 1 \leq n \leq 2k$).
|
||||
|
||||
\begin{figure}[H]
|
||||
\begin{center}
|
||||
\includegraphics[scale=1.0]{pics/bbaumknoten.png}
|
||||
\caption{BBaum Knoten}
|
||||
\end{center}
|
||||
\end{figure}
|
||||
Danach folgen Tripel (Ki,Di,Pi) welche einen \textbf{Eintrag} bilden:
|
||||
Ki = Schlüsselwert\\
|
||||
Di = Datensatz\\
|
||||
Pi = Zeiger auf Nachfolgeknoten
|
||||
\subsection{Eigenschaften}
|
||||
\begin{itemize}
|
||||
\item jeder Pfad ist perfekt balanciert
|
||||
\item jeder Knoten mit Ausnahme von root und Blättern hat
|
||||
mindesten $k+1$ Nachfolger und höchstens $2k+1$
|
||||
\item jeder Knoten (Ausnahme root) immer mindestens halb voll
|
||||
\end{itemize}
|
||||
\subsection{Löschvorgang}
|
||||
\begin{enumerate}
|
||||
\item Suche Knoten, in dem der zu löschende Schlüssel S liegt
|
||||
\item Falls S in Blattknoten, dann lösche S und behandle ggf Unterlauf
|
||||
\item Fall S in innerem Knoten dann untersuche linken und rechten
|
||||
Unterbaum von S
|
||||
\begin{itemize}
|
||||
\item finde direkten Vorgänger $\text{S}'$ und Nachfolger $\text{S}''$
|
||||
\item Wähle den aus der mehr Elemente hat
|
||||
\item Ersetze zu löschenden Schlüssel S durch $\text{S}'$ oder $\text{S}''$ aus gewähltem Blattknoten und behandle ggf Unterlauf
|
||||
|
||||
\end{itemize}
|
||||
\end{enumerate}
|
||||
\subsection{Unterlauf}
|
||||
\begin{itemize}
|
||||
\item Ein endgülter Unterlauf entsteht bei obigen Algorithmus erst auf Blattebene
|
||||
\item \textbf{Unterlaufbehandlung} wird durch Mischen des Unterlaufknotens mit seinem Nachbarknoten und darüber liegenden Diskriminator durchgeführt $\rightarrow$ Splitt rückwärts
|
||||
\item Unterlaufbehandlung endet in einem der Blätter!
|
||||
\end{itemize}
|
||||
\subsection{B*-Baum}
|
||||
Alle Sätze werden in den Blattknoten abgelegt. Innere Knoten enthalten nur noch Verzweigungsinformationen, keine Daten.
|
||||
Am Ende eines Knotens ist ein Zeiger auf den nächsten enthalten.
|
||||
\begin{figure}[H]
|
||||
\begin{center}
|
||||
\includegraphics[scale=1.0]{pics/bstern.png}
|
||||
\caption{B*-Baum Aufbau}
|
||||
\end{center}
|
||||
\end{figure}
|
||||
\textbf{Merke:}\\
|
||||
Beim Löschen von Werten bleibt der gleiche Diskriminator in inneren
|
||||
Knoten enthalten.
|
||||
\subsubsection{Löschen}
|
||||
Entsteht durch das Löschen ein Unterlauf?
|
||||
\begin{itemize}
|
||||
\item Nein:\\Entferne Satz aus Blatt
|
||||
\item Ja:\\
|
||||
Mische das Blatt mit einem Nachbarknoten. Ist die
|
||||
Summe der Einträge in beiden Knoten größer als 2k?
|
||||
\begin{itemize}
|
||||
\item Nein:\\
|
||||
Fass beide Blätter zu einem Blatt zusammen. Falls Unterlauf
|
||||
in Vaterknoten entsteht: Misch die inneren Knoten analog
|
||||
\item Ja:\\
|
||||
Teil die Sätze neu auf beide Knoten auf, so dass ein Knoten
|
||||
jeweils die Hälfte der Sätze übernimmt. Der Diskriminator ist
|
||||
zu aktualisieren.
|
||||
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\subsection{Vergleich}
|
||||
\begin{itemize}
|
||||
\item BBaum:
|
||||
\begin{itemize}
|
||||
\item keine Redundanz
|
||||
\item lesen von Baum Inorder nur mit Stack von Höhe h
|
||||
\item Gergingerer Verzweigungsgrad $\rightarrow$ größere Höhe
|
||||
\item einige wenige Sätze (root) mit 1 Blockzugirff
|
||||
\end{itemize}
|
||||
\item $\text{B}^*$Baum:
|
||||
\begin{itemize}
|
||||
\item Schlüsselwerte teilweise redundant
|
||||
\item Kette von Blattknoten liefert alle Sätze nach Reihenfolge sortiert
|
||||
\item hohe Verzweigung der inneren Knoten $\rightarrow$ geringe Höhe
|
||||
\item für alle Blöcke müssen h Sätze gelesen werden
|
||||
\item Schlüsselwerte der inneren Knoten müssen nicht in den
|
||||
Datensätzen vorkommen
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\subsection{Bitmap Index}
|
||||
\textbf{B-Bäume (und Hashing) machen nur Sinn bei hoher Selektivität! ($\approx 5\%$)}
|
||||
Lege für jeden Schlüsselwert eine Bitliste an. Bitwert 1 bedeutet, der
|
||||
Schlüssel hat im Satz den Wert zu dem die Liste gehört. 0 bedeutet er hat keinen anderen Wert.\\
|
||||
Gut bei Wertigkeiten bis ca. 500. Hilft bei einfacher und effizienter
|
||||
Verknüpfung.
|
||||
|
||||
\subsection{Primär- und Sekundär-Organisation}
|
||||
\textbf{Primär-Organisation}:\\
|
||||
Bedeutung: Speicherung der Sätze selbst.
|
||||
|
||||
\textbf{Sekundär-Organisation}:\\
|
||||
Bedeutung: verweist nur auf Sätze, die nach beliebigen anderen Kriterien
|
||||
abgespeichert werden. Ist allerdings nur möglich, wenn Primärorganisation
|
||||
Direktzugriff auf einzelnen Satz haben.
|
||||
|
||||
$\rightarrow$ B-Baum/$\text{B}^*$Baum als Sekundär Organsiation (Di);
|
||||
auch gestreute Speicherung als Sekundär Organsiation möglich (Buckets
|
||||
[Schlüsseltwer,Satzadresse] Paare)
|
39
idb_skript/Einfuehrung.tex
Normal file
@ -0,0 +1,39 @@
|
||||
\section{Einführung}
|
||||
\subsection{Basiswissen}
|
||||
\begin{enumerate}
|
||||
\item {Warum ein Datenbanksystem benutzen?
|
||||
\begin{itemize}
|
||||
\item vielseitig verwendbar
|
||||
\item Mehrbenutzerbetrieb
|
||||
\item redundanzfrei
|
||||
\item ausfallsicher
|
||||
\item leistungsfähig
|
||||
\end{itemize}
|
||||
}
|
||||
\item {Wozu dient Schichtenbildung in der Softwarearchitektur?
|
||||
\begin{itemize}
|
||||
\item Höhere Ebenen werden einfacher, weil sie tiefere benutzen können
|
||||
\item Änderungen in höheren Ebenen haben keinen Einfluss auf tiefere
|
||||
\item tiefere Ebenen können getestet werden, bevor höhere lauffähig sind
|
||||
\item Optimierungen von unteren Ebenen
|
||||
\end{itemize}
|
||||
Schichtenmodell:
|
||||
\begin{figure}[H]
|
||||
\begin{center}
|
||||
\includegraphics[scale=0.6]{pics/schichten.png}
|
||||
\caption{Schichtenübersicht}
|
||||
\end{center}
|
||||
\end{figure}
|
||||
|
||||
}
|
||||
\item { Was tut eine Schicht:
|
||||
\begin{itemize}
|
||||
\item Realisiert einen bestimmten Dienst, den sie der Schnittstelle nach oben zur Verfügung stellt
|
||||
\item Nimmt Dienste der darunter liegenden Schicht in Anspruch
|
||||
\item Verbirgt darunter liegende Schicht vollständig und muss daher alle erforderlichen Funktionen anbieten
|
||||
\end{itemize}
|
||||
}
|
||||
\item { Was bedeutet Datenunabhängigkeit einer Anwendung:\\
|
||||
Speichern und Wiedergewinnen von persistenten Daten
|
||||
ohne Kenntnis der Details der Speicherung.}
|
||||
\end{enumerate}
|
113
idb_skript/IDB.tex
Normal file
@ -0,0 +1,113 @@
|
||||
\listfiles
|
||||
\documentclass[12pt,a4paper]{scrartcl}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[ngerman]{babel}
|
||||
\usepackage{graphicx}
|
||||
\usepackage{amsmath}
|
||||
\usepackage{amssymb}
|
||||
\usepackage{amsfonts}
|
||||
\usepackage{lmodern}
|
||||
\usepackage{a4wide}
|
||||
\usepackage{psfrag}
|
||||
\usepackage{colortbl}
|
||||
\usepackage{color}
|
||||
\usepackage{textcomp}
|
||||
\usepackage{cancel}
|
||||
\usepackage[pdfborder={0 0 0}, colorlinks=true, filecolor=blue, linkcolor=blue, citecolor=blue, urlcolor=blue]{hyperref}
|
||||
\usepackage{float}
|
||||
\usepackage{listings}
|
||||
\usepackage{lstautogobble}
|
||||
\usepackage{datetime}
|
||||
\usepackage{wrapfig}
|
||||
\newcommand{\RM}[1]{\MakeUppercase{\romannumeral #1{.}}}
|
||||
\definecolor{dkgreen}{rgb}{0,0.6,0}
|
||||
\definecolor{gray}{rgb}{0.5,0.5,0.5}
|
||||
\definecolor{mauve}{rgb}{0.58,0,0.82}
|
||||
\lstset{
|
||||
basicstyle=\footnotesize, % the size of the fonts that are used for the code
|
||||
breakatwhitespace=false, % sets if automatic breaks should only happen at whitespace
|
||||
breaklines=true, % sets automatic line breaking
|
||||
captionpos=b, % sets the caption-position to bottom
|
||||
commentstyle=\color{dkgreen}, % comment style
|
||||
frame=single, % adds a frame around the code
|
||||
keywordstyle=\color{blue}, % keyword style
|
||||
language=sql, % the language of the code
|
||||
mathescape=true,
|
||||
autogobble,
|
||||
numbers=left % where to put the line-numbers; possible values are (none, left, right)
|
||||
%title=\lstname % show the filename of files included with \lstinputlisting; also try caption instead of title
|
||||
}
|
||||
\setcounter{secnumdepth}{4}
|
||||
\setcounter{tocdepth}{4}
|
||||
\setlength{\parindent}{0pt}
|
||||
% wrapping environment for pic in paragraphs
|
||||
\usepackage{floatflt}
|
||||
% Einruecken nach newline via '//' unterbinden
|
||||
\setlength{\parindent}{0pt}
|
||||
|
||||
\makeatletter
|
||||
\renewcommand\paragraph{%
|
||||
\@startsection{paragraph}{4}{0mm}%
|
||||
{-\baselineskip}%
|
||||
{.5\baselineskip}%
|
||||
{\normalfont\normalsize\bfseries}}
|
||||
\makeatother
|
||||
|
||||
%==INFOBOXEN=========================================
|
||||
%idee: http://tex.stackexchange.com/a/66822
|
||||
\usepackage[tikz]{bclogo}
|
||||
\definecolor{YellowGreen}{rgb}{0.603922,0.803922,0.196078}
|
||||
%\renewcommand\bcStyleTitre[1]{\large\textcolor{black}{#1}}
|
||||
%textbox{Titel}{Text}
|
||||
\newcommand{\textbox}[2]{%
|
||||
\begin{bclogo}[couleur=YellowGreen,logo =, arrondi=0.2,barre=none]{#1}%
|
||||
\vspace*{10pt}%
|
||||
#2%
|
||||
\end{bclogo}
|
||||
}%
|
||||
%textonlybox{Text}
|
||||
\newcommand{\textonlybox}[1]{%
|
||||
\begin{bclogo}[couleur=YellowGreen,logo =, arrondi=0.2,barre=none]{#1}
|
||||
\end{bclogo}
|
||||
}%
|
||||
%----------------------------------------------------
|
||||
|
||||
\title{IDB Skript}
|
||||
\date{\today ~- \currenttime ~Uhr}
|
||||
\begin{document}
|
||||
\maketitle
|
||||
\noindent{Dieses Skript zur Vorlesung Implementierung von
|
||||
Datenbanksystemen im Wintersemester 2013/14 wurde von
|
||||
untenstehenden Studenten erarbeitet. Es ist somit
|
||||
offensichtlich inoffiziell und erhebt weder einen
|
||||
Anspruch auf Korrektheit noch auf Vollständigkeit.
|
||||
}
|
||||
|
||||
\begin{description}
|
||||
\item[Christian Bay] christian.bay@studium.fau.de
|
||||
\end{description}
|
||||
|
||||
\vfill
|
||||
|
||||
\noindent {
|
||||
\textbf{\footnotesize Dieses Skript ist keine offizielle
|
||||
Veröffentlichung des Lehrstuhls 6 am Department Informatik der
|
||||
Friedrich-Alexander-Universität Erlangen-Nürnberg.}
|
||||
}
|
||||
|
||||
\newpage
|
||||
|
||||
\tableofcontents
|
||||
\listoffigures
|
||||
\newpage
|
||||
\include{./Einfuehrung}
|
||||
\include{./Saetze}
|
||||
\include{./BBaum}
|
||||
\include{./Puffer}
|
||||
\include{./Programmschnittstellen}
|
||||
\include{./Speicherung}
|
||||
\include{./Anfrageverarbeitung}
|
||||
\include{./Relationale_Operatoren}
|
||||
\include{./Transaktionen}
|
||||
|
||||
\end{document}
|
18
idb_skript/Makefile
Normal file
@ -0,0 +1,18 @@
|
||||
PDF = IDB
|
||||
|
||||
all: $(PDF)
|
||||
|
||||
continuous: $(PDF).continuous
|
||||
|
||||
%.continuous: %.pdf
|
||||
latexmk -jobname=$(@:%.continuous=%) -pvc -pdf $(@:%.continuous=%).tex
|
||||
|
||||
$(PDF): $(PDF).pdf
|
||||
|
||||
%.pdf: %.tex
|
||||
latexmk -jobname=$(@:%.pdf=%) -pdf $<
|
||||
|
||||
clean:
|
||||
latexmk -c -f
|
||||
|
||||
.PHONY: all clean $(PDF) continuous
|
56
idb_skript/Programmschnittstellen.tex
Normal file
@ -0,0 +1,56 @@
|
||||
\section{Programmschnittstellen}
|
||||
Vor- und Nachteile:\\
|
||||
Programmzugriff:
|
||||
\begin{itemize}
|
||||
\item Keine SQL Injection nötig
|
||||
\item Kompakt
|
||||
\item spezieller Übersetzer nötig
|
||||
\end{itemize}
|
||||
Unterprogrammaufruf
|
||||
\begin{itemize}
|
||||
\item Optimierung und Typprüfung
|
||||
\item SQL Injection möglich
|
||||
\item Aufwändig für Programmierer
|
||||
\end{itemize}
|
||||
\subsection{SQL Anfrage}
|
||||
Aufruf einer SQL Anfrage mit Index:
|
||||
\begin{lstlisting}[language=java]
|
||||
RecordFile index = new KeyedRecordFile("KNr","r");
|
||||
TID tid = index.read.Key(23);
|
||||
RecordFile saetze = new DirectRecord(Kunden", "r");
|
||||
Record ergebnis = saetze.read(tid);
|
||||
print(ergebnis.toString());
|
||||
\end{lstlisting}
|
||||
Aufruf einer SQL Anfrage ohne Index:
|
||||
\begin{lstlisting}[language = java]
|
||||
RecordFile saetze = new DirectRecordFile("Kunden","r");
|
||||
Record ergebnis;
|
||||
while (saetze.hasNext()){
|
||||
ergebnis = saetze.next();
|
||||
if(ergebnis.getKNr() == 23){
|
||||
print(ergebnis);
|
||||
break;
|
||||
}
|
||||
}
|
||||
\end{lstlisting}
|
||||
|
||||
\subsection{SQL Schnittstelle}
|
||||
\begin{enumerate}
|
||||
\item Verbindung aufbauen
|
||||
\begin{lstlisting}[language=java]
|
||||
Connection DriverManager.connect(username, password, database)
|
||||
\end{lstlisting}
|
||||
\item Methode um eine Anfrage auszuführen
|
||||
\begin{lstlisting}[language=java]
|
||||
Handle Connection.executeQuery (String query);
|
||||
\end{lstlisting}
|
||||
\item Methode um zu prüfen, ob es weitere Ergebnisse gibt
|
||||
\begin{lstlisting}[language=java]
|
||||
Boolean Handle.hasNext();
|
||||
\end{lstlisting}
|
||||
\item Methode um überhaupt an Ergebnisse zu kommen
|
||||
%TODO das soll vermutlich weder vom Typ Boolean sein, noch hasNext() heißen
|
||||
\begin{lstlisting}[language=java]
|
||||
Boolean Handle.hasNext();
|
||||
\end{lstlisting}
|
||||
\end{enumerate}
|
61
idb_skript/Puffer.tex
Normal file
@ -0,0 +1,61 @@
|
||||
\section{Puffer}
|
||||
Frame = Im HS vorgesehener Platz zur Aufnahme eines Blocks $\rightarrow$ normalerweise so groß wie Block
|
||||
|
||||
Bei Zugriff auf Blöcke im HS müssen diese ggf eingelagert werden.
|
||||
\subsection{Ersetzungsstrategie}
|
||||
\begin{itemize}
|
||||
\item wählt den zu verdrängenden Block aus
|
||||
\item Ziel: Minimierung von physischen Zugriffen
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection{FIFO}
|
||||
Block der am längsten im Puffer ist wird ersetzt.\\ $\rightarrow$ ungünstig
|
||||
da häufig benutzte Blöcke gerade im Puffer bleiben sollen
|
||||
|
||||
\subsubsection{LFU (least frequently used)}
|
||||
Block auf den am seltensten zugegriffen wird ersetzt.
|
||||
\begin{itemize}
|
||||
\item $-$ für sequentielles Lesen nicht brauchbar
|
||||
\item $-$ hat ein Block einmal wieder zugegriffen bleibt der lange erhalten
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection{LRU (least recently used)}
|
||||
\begin{itemize}
|
||||
\item bewertetes Alter seit dem letzten Zugriff
|
||||
\item quasi verkettete Liste aller Blöcke im Puffer, wo bei Verdrängung letzter Block der Kette ersetzt wird
|
||||
\end{itemize}
|
||||
\begin{figure}[H]
|
||||
\begin{center}
|
||||
\includegraphics[scale=0.7]{pics/lru.png}
|
||||
\caption{LRU}
|
||||
\end{center}
|
||||
\end{figure}
|
||||
\subsubsection{Clock}
|
||||
LRU Verhalten mit einfacher Implementierung.
|
||||
\textbf{Prinzip}:
|
||||
\begin{itemize}
|
||||
\item Benutzt(Dirty)-Bit eines Blocks im Puffer wird bei Zugriff auf
|
||||
1 gesetzt
|
||||
\item bei Verdrängung zyklischer Suche mit dem Auswahlzeiger:
|
||||
\begin{itemize}
|
||||
\item Falls Benutzt Bit = 1, wird es auf 0 gesetzt $\rightarrow$ Zeiger wandert zum nächsten Block
|
||||
\item Falls Benutzt Bit = 0, Block wird ersetzt
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Dienste einer Pufferverwaltung}
|
||||
Einkapselung der Pufferverwaltung:
|
||||
\begin{lstlisting}[language=C]
|
||||
char * Buffer::fix (BlockFile File, int BlockNo, char Mode);
|
||||
\end{lstlisting}
|
||||
\begin{itemize}
|
||||
\item Block ist vor Verdrängung geschützt
|
||||
\item \textbf{Mode} gibt an welcher Block nur gelesen oder auch
|
||||
geändert werden soll
|
||||
\end{itemize}
|
||||
\begin{lstlisting}
|
||||
void Buffer::unix (char * BufferAddresse)
|
||||
\end{lstlisting}
|
||||
\begin{itemize}
|
||||
\item gibt Block im Puffer zur Ersetzung frei
|
||||
\end{itemize}
|
196
idb_skript/Relationale_Operatoren.tex
Normal file
@ -0,0 +1,196 @@
|
||||
\section{Relationale Operatoren}
|
||||
\subsection{Allgemein}
|
||||
Die grundsätzliche Aufgabe besteht darin die logischen Operatoren
|
||||
(SEL(),PROJ(),JOIN(),\ldots) durch \textbf{Planoperatoren} zu ersetzen.\\
|
||||
\textbf{Teilaufgaben}:
|
||||
\begin{itemize}
|
||||
\item Erkennung gemeinsamer Teilbäume (notwendig: Zwischenspeicherung
|
||||
von Ergebnisrelation)
|
||||
\item {Bestimmung der Verknüpfungsreihenfolge bei Verbundoperationen:
|
||||
\begin{itemize}
|
||||
\item Ziel: minimale Kosten für die Operationsfolge
|
||||
\item Heuristik: Minimierung der Größe der Zwischenergebnisse,
|
||||
d.h. kleinsten Relationen immer zuerst verknüpfen
|
||||
\end{itemize}
|
||||
}
|
||||
\item Gruppierung von direkt benachbarten Operatoren zu einem einzelnen Planoperator (z.B. Verbund mit Selektion)
|
||||
\end{itemize}
|
||||
\subsection{Planoperatoren}
|
||||
SQL erlaubt Anfragen über k-Relationen:
|
||||
\begin{itemize}
|
||||
\item Ein Variablen Ausdrücke (eine Relation)
|
||||
\item Zwei Variablen Ausdrücke (zwei Relationen)
|
||||
\item k-Variablen Ausdrücke (zerlegt in Ein- und Zwei Variablen Ausdrücke)
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection{Selektion}
|
||||
\begin{itemize}
|
||||
\item Nutzung eines \textbf{Scan}-Operators\\
|
||||
Definition von Start- und Stoppbedingungen sowie Suchargumenten
|
||||
\item Index Scan $\rightarrow$ Auswahl des kostengünstigsten Index
|
||||
\item Relationen Scan
|
||||
\end{itemize}
|
||||
\subsubsection{Projektion}
|
||||
\begin{itemize}
|
||||
\item meist in Kobination mit Verbund, Selektion und Sortierung
|
||||
\item auch als eigener Planoperator
|
||||
\end{itemize}
|
||||
\subsubsection{Sortierung}
|
||||
\begin{itemize}
|
||||
\item erforderlich bei \textbf{order by}
|
||||
\item beschleunigt ggf Joins
|
||||
\item Duplikateleminierung (\textbf{distinct})
|
||||
\end{itemize}
|
||||
\subsubsection{Joins}
|
||||
Joins werden in \textbf{binäre} Verbunde gegliedert. Bei $n$ Verbunden
|
||||
sind $n!$ Reihenfolgen möglich. Die optimale Reihenfolge ist abhängig von
|
||||
\begin{itemize}
|
||||
\item Planoperatoren
|
||||
\item passenden Sortierordnungen
|
||||
\item Größe der Operanden usw
|
||||
\end{itemize}
|
||||
Verbundoperationen sind sehr häufig und auch teuer $\rightarrow$ Optimierung.\\
|
||||
Typisch sind \textbf{Gleichverbunde}.
|
||||
Standartszenario für Verbunde:
|
||||
\begin{lstlisting}
|
||||
select * from R,S
|
||||
where R.VA $\Theta$ S.VA // Verbundpraedikat
|
||||
// $\Theta \in \{=, >, <, \neq, \geq, \leq\}$
|
||||
and P(R.SA) // lokale Selektion
|
||||
and P(S.SA) // VA = Verbundattribut
|
||||
// SA = Selektionsattribut
|
||||
|
||||
\end{lstlisting}
|
||||
\paragraph{Nested Loop Verbund}
|
||||
|
||||
Annahmen:\\
|
||||
Sätze in R und S sind nicht nach Verbundsattributen geordnet.\\
|
||||
Es sind keine Indexstrukturen $I_R(VA)$ und $I_S(VA)$ vorhanden.
|
||||
\begin{lstlisting}
|
||||
Scan ueber $S$; //aeussere Schleife
|
||||
fuer jeden Satz s, fuer den $P(s.SA)$ gilt:
|
||||
Scan ueber $R$; //innere Schleife
|
||||
fuer jeden Satz r,
|
||||
fuer den P(r.SA) AND (r.VA $\Theta$ s.VA) gilt:
|
||||
uebernimm kombinierten Satz (r,s)
|
||||
in das Ergebnis;
|
||||
\end{lstlisting}
|
||||
Komplexität: $\mathcal O(N^2)$
|
||||
|
||||
\paragraph{Sort-Merge Verbund}
|
||||
|
||||
|
||||
Zweiphasiger Algorithmus:\\
|
||||
|
||||
Phasen:
|
||||
\begin{enumerate}
|
||||
\item Sortierung von R und S nach R.VA und S.VA, dabei Eliminierung nicht benötigter Tupel (durch Prüfung von P(R.SA) oder P(S.SA))
|
||||
\item schritthaltende Scans über R- und S-Relationen mit Durchführung des Verbundes bei r.VA=s.VA
|
||||
\end{enumerate}
|
||||
|
||||
Komplexität: $\mathcal O(N \log N)$
|
||||
\begin{figure}[H]
|
||||
\begin{center}
|
||||
\includegraphics[scale=0.7]{pics/merge_sort_join.png}
|
||||
\caption{Merge Sort Verbund}
|
||||
\end{center}
|
||||
\end{figure}
|
||||
|
||||
\paragraph{Hash Verbund}
|
||||
Spezialisierung für \textbf{Gleichverbund}.
|
||||
Da der Hauptspeicher immer größer ist, lassen sich Zwischenergebnisse
|
||||
besser ausnutzen.\\
|
||||
Idee:
|
||||
\begin{itemize}
|
||||
\item Tupel der einen Relation im HS ablegen, so dass sie über VerbundAttribut schnell gefunden werden können
|
||||
\item Tupel der anderen Relation sequenziell durchlaufen und mit Wert
|
||||
des VerbundAttributs die passenden Verbundpartner im HS aufsuchen
|
||||
\item Organisation der Tupel im HS über \textbf{Hashing}
|
||||
\end{itemize}
|
||||
Einfachster Fall: \textbf{Classic Hashing}:\\
|
||||
Funktionsweise:\\
|
||||
Äußere Schleife
|
||||
\begin{itemize}
|
||||
\item Abschnittweise lesen der kleineren Relation R
|
||||
\item Relation wird in $p$ Abschnitte aufgeteilt, die alle in HS passen
|
||||
\item Aufbau einer Hash Tabelle mit $\text{h}_\text{A}($r.VA$)$
|
||||
\end{itemize}
|
||||
Innere Schleife
|
||||
\begin{itemize}
|
||||
\item Überprüfung für jeden Satz von S mit P(S.SA) $\rightarrow$
|
||||
ebenfalls mit Hashing
|
||||
\item wenn sich Verbundpartner in dieser Adresse befindet, Durchführung des Verbundes
|
||||
\end{itemize}
|
||||
Komplexität: $\mathcal O(p \times N)$. Da Verbundpartner S $p$-mal gelesen werden muss.
|
||||
\begin{figure}[H]
|
||||
\begin{center}
|
||||
\includegraphics[scale=0.8]{pics/hash_join.png}
|
||||
\caption{Hash Verbund}
|
||||
\end{center}
|
||||
\end{figure}
|
||||
Problem ist, dass S $p$-mal durchlaufen werden muss. Daher die Idee
|
||||
S analog zu R zu partitionieren.\\
|
||||
Stichwort Simple Hashing.
|
||||
|
||||
\subsection{Anfrageoptimierung}
|
||||
Ziel:\\$\rightarrow$ Ermittlung des \textit{kostengünstigsten}
|
||||
Auswertungsweges
|
||||
|
||||
Zentrales Problem:
|
||||
\begin{itemize}
|
||||
\item globales Optimieren hat hohe Komplexität (NP-Schwer zur Laufzeit)
|
||||
\item Einsatz von Heuristiken, da nicht alles nötige Wissen immer vorhanden ist
|
||||
\end{itemize}
|
||||
Optimierungsziel:
|
||||
\begin{itemize}
|
||||
\item Maximierung des Outputs bei gegeben Ressoucren
|
||||
\item Minimierung der Resourcennutzung
|
||||
\end{itemize}
|
||||
Die Wichtigsten Kostenarten sind:
|
||||
\begin{itemize}
|
||||
\item Berechnungskosten (CPU)
|
||||
\item I/O Kosten (Anzahl physischer Referenzen)
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection{Ausführungsplan}
|
||||
Ziel ist es eine möglichst guten Ausführungsbaum zu erstellen.
|
||||
Problematisch ist die riesige Anzahl an Möglichkeiten mit steigender
|
||||
Komplexität der Anfrage (z.B. Query mit 15 Verbunden $10^{70}$ Möglichkeiten).\\
|
||||
Diese Vielfalt entsteht durch verschiedene Implementierungen der Planoperatoren und der Operationsreihenfolgen.
|
||||
|
||||
$\rightarrow$ \textbf{Ziel der Plangenerierung}:
|
||||
\begin{itemize}
|
||||
\item finden von Plänen gelingt immer schnell
|
||||
\item mit möglichst wenig generierten Plänen auskommen
|
||||
\end{itemize}
|
||||
Unterschiedliche Strategieklassen:
|
||||
\begin{itemize}
|
||||
\item voll enumerativ
|
||||
\item beschränkt enumerativ
|
||||
\item zufallsgesteuert
|
||||
\end{itemize}
|
||||
|
||||
\paragraph{Kostenformeln}
|
||||
\begin{itemize}
|
||||
\item{ gewichtetes Ma"s für I/O und CPU Belastung:\\
|
||||
C = \#physische-Seitenzugriffe + W $\times$ \#Aufrufe-des Zugriffsystems}
|
||||
\item{ CPU-bound : höherer I/O-, geringerer CPU Aufwand:\\
|
||||
$\text{W}_{\text{CPU}}$ = \#Instr-pro-Aufruf-des-Zugriffsystems /\\ \#Instr-pro-I/O-Vorgang
|
||||
}
|
||||
\item{ I/O-bound : geringere I/O-, höherer CPU Aufwand:\\
|
||||
$\text{W}_{\text{IO}}$ = \#Instr-pro-Aufruf-des-Zugriffsystems /\\ (\#Instr-pro-I/O-Vorgang + Zugriffzeit $\times $ MIPS-Ratte)
|
||||
}
|
||||
\end{itemize}
|
||||
|
||||
\paragraph{Selektivitätsabschätzung}
|
||||
Der \textbf{Selektivitätsfaktor} beschreibt den erwarteten Anteil an
|
||||
Tupeln, die ein Prädikat p erfüllen.\\
|
||||
Diese Trefferate gibt auch an, inwiefern eine vorhandene Indexstruktur
|
||||
die Laufzeit reduzieren.
|
||||
\begin{figure}[H]
|
||||
\begin{center}
|
||||
\includegraphics[scale=1.0]{pics/trefferrate.png}
|
||||
\caption{Qualitatives Zugriffsdiagramm}
|
||||
\end{center}
|
||||
\end{figure}
|
||||
Nur bei sehr geringen Trefferraten lohnt sich ein Index Scan!
|
61
idb_skript/Saetze.tex
Normal file
@ -0,0 +1,61 @@
|
||||
\section{Sätze}
|
||||
\subsection{Allgemein}
|
||||
Warum wurden Sätze eingeführt? \\
|
||||
Sätze abstrahieren von Blöcken. Blöcke sind Hardware spezifisch.
|
||||
Sie haben unterschiedliche Längen und die Aufgabe von Einheiten von
|
||||
Platte und HS zu transportieren. Daher hat man eine anwendungspezifische
|
||||
Einheit eingeführt, die Daten zusammenfasst.\\
|
||||
\subsection{Satzadresse}
|
||||
Eine Satzadresse ist ein Bezeichner unter der man einen einzelnen Satz wiederfinden kann. Sie wird als stabil bezeichnet, wenn sich beim
|
||||
verschieben des Satzes die Adresse nicht ändert.
|
||||
$\rightarrow$ Neue Schicht über Blöcke
|
||||
\subsection{Wechselpuffertechnik}
|
||||
Optimierungsmöglichkeit bei sequenziellen Dateien.
|
||||
Man verwendet \textit{zwei} Blockpuffer.\\
|
||||
Anwendung beim
|
||||
\begin{itemize}
|
||||
\item Lesen: während Sätze in Puffer 1 gelesen werden \textbf{gleichzeitig} nächsten Block von Platte in Puffer 2 lesen
|
||||
\item Schreiben: wenn Puffer 1 voll, \textbf{asynchron} auf Platte schreiben und gleichzeitig Puffer 2 zur Aufnahme weiterer Sätze verwenden
|
||||
\end{itemize}
|
||||
\subsection{Satzzugriff über Schlüsselwerte}
|
||||
\subsection{Normales Hashing}
|
||||
Man möchte nun Sätze und deren Inhalt nicht nur über
|
||||
die Satzadresse wiederfinden, sondern auch über \textbf{inhaltliche Kriterien}.
|
||||
\textbf{Schlüssel} definieren ein oder mehrere Felder eines Satzes, über
|
||||
das man den Satz wiederfinden kann.
|
||||
|
||||
Lösung dafür ist \textbf{Hashing} der Sätze nach Schlüssel.
|
||||
|
||||
Kollisionen verhindern:
|
||||
\begin{itemize}
|
||||
\item Open Addressing (ausweichen auf Nachbar Buckets)
|
||||
\begin{itemize}
|
||||
\item $+$ kein zusätzlicher Speicherplatz erforderlich
|
||||
\item $-$ beim Suchen findet man im Bucket auch Überläufer
|
||||
\item $-$ beim löschen Überläufer zurückholen
|
||||
\item $-$ in Nachbarbuckets werden ggf weitere Überläufe erzeugt
|
||||
\end{itemize}
|
||||
\item Overflow Buckets
|
||||
\begin{itemize}
|
||||
\item Anlegen spezieller Überlauf Buckets für jeden Bucket
|
||||
\begin{itemize}
|
||||
\item $-$ zusätzlicher Speicherplatz erforderlich
|
||||
\item $+$ keine Mischung von sätzen
|
||||
\item $+$ keine Beeinträchtigung der Nachbarbuckets
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\subsubsection{Bewertung}
|
||||
\begin{itemize}
|
||||
\item sehr schneller Zugriff über Schlüssel (1 bis 2 Blockzugriffe)
|
||||
\item gestreute Speicherung kann nur nach \textbf{einem} Schlüssel erfolgen
|
||||
\item Speicherplatz muss um voraus belegt werden
|
||||
\end{itemize}
|
||||
\subsection{Virtuelles Hashing}
|
||||
Vorteile vom virtuellen Hashing ggü. normalen Hashing:\\
|
||||
Das normale Hashing ist nicht erweiterbar, d.h. man muss den gesamten
|
||||
Speicher im voraus belegen. Dadurch kommt man in Platznot oder verschwendet zuviel.
|
||||
Beim linearen Hashing versucht man durch kontinuierliche Reorganisation
|
||||
Überlaufprobleme zu vermeiden.
|
||||
|
||||
Beschreibung von Dateizustand:
|
125
idb_skript/Speicherung.tex
Normal file
@ -0,0 +1,125 @@
|
||||
\section{Speicherung von Tupeln und Relationen}
|
||||
\subsection{Ziele}
|
||||
\begin{itemize}
|
||||
\item Relationen mit Mitteln der darunter implementierten Schichten sichern
|
||||
\item Anfragen (SQL) möglichst effizient auswerten
|
||||
\end{itemize}
|
||||
\subsection{Speicherung von Tupeln in Sätzen}
|
||||
\subsubsection{Aufbau von Sätzen}
|
||||
\begin{itemize}
|
||||
\item Sätze sind aus \textbf{Feldern} zusammengesetzt (Name, Typ, Länge)
|
||||
\item \textbf{Systemkatalog}\\Informationen über Felder und Reihenfolge
|
||||
\end{itemize}
|
||||
\subsubsection{Satztyp}
|
||||
\begin{itemize}
|
||||
\item Menge von Sätzen mit gleicher Struktur $\rightarrow$ einmalige
|
||||
Beschreibung im Systemkatalog
|
||||
\item beim Speichern eines Satzes wird ihm ein Satztyp zugeordnet
|
||||
\item Länge der Sätze zumeist variabel
|
||||
\end{itemize}
|
||||
\textbf{Annahme: Reihenfolge der Felder egal}
|
||||
|
||||
\subsubsection{Anforderungen}
|
||||
\textbf{Speicherplatzeffizienz}:
|
||||
\begin{itemize}
|
||||
\item variable Länge
|
||||
\item undefinierte Werte nicht speichern
|
||||
\item Hilfsstrukturen minimieren
|
||||
\end{itemize}
|
||||
|
||||
\textbf{direkter Zugriff auf Felder}:
|
||||
\begin{itemize}
|
||||
\item ohne vorher andere Felder lesen zu müssen
|
||||
\item direkt zur Anfangs-Byte-Position innerhalb des Satzes
|
||||
\end{itemize}
|
||||
|
||||
|
||||
\textbf{Flexibilität}:
|
||||
\begin{itemize}
|
||||
\item Hinzufügen von Feldern bei allen Sätzen
|
||||
\item Löschen eines Feldes aus allen Sätzen
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection{Speicherungsstruktur im Satz}
|
||||
Der Satz wird in zwei logische Teile untergliedert. Einer beinhaltet
|
||||
alle Felder fester Länge und der andere alle der variablen.
|
||||
Mit Katalogdaten und Längenangaben im Satz, lässt sich \textbf{flexibel}
|
||||
und \textbf{direkt} auf die Felder zugreifen.
|
||||
|
||||
\begin{figure}[H]
|
||||
\begin{center}
|
||||
\includegraphics[scale=1.0]{pics/satz_speicherstruktur.png}
|
||||
\caption{Variable Satz Speicherstruktur}
|
||||
\end{center}
|
||||
\end{figure}
|
||||
Würden man alle Felder mit den Zeiger erreichen, wäre das Speicherplatzverschwendung.
|
||||
So sind alle Felder fester Größe direkt erreichbar.
|
||||
\textbox{Speicheurngsstruktur in Sätzen}{
|
||||
Blatt 9 Aufgabe 2 üben.
|
||||
}
|
||||
\subsection{Speicherung von Relationen}
|
||||
\subsubsection{Spaltenweise Speicherung (C-Store)}
|
||||
\begin{itemize}
|
||||
\item Auf das Lesen hin optimiert. Gut für Auswertung
|
||||
großer Datenmengen
|
||||
\item Nur Attribute lesen, die gebraucht werden
|
||||
\item kompakte Speicherung der Attributwerte
|
||||
\end{itemize}
|
||||
\textbf{Prototyp}
|
||||
\begin{itemize}
|
||||
\item speichert Sammlung von Spaltengruppen
|
||||
über mehrere Sätze verteilt
|
||||
\item Sortierschlüssel ist ein Attribut
|
||||
\item Gruppen von Spalten = Projektion
|
||||
\item Speicherung
|
||||
\begin{itemize}
|
||||
\item \textbf{Schreibspeicher} für schnelles Einfügen und Ändern von Tupeln
|
||||
\item \textbf{Lesespeicher} für umfangreiche Analysen
|
||||
\end{itemize}
|
||||
\item Änderung durch Löschen und Einfügen durch Tuple Mover
|
||||
\end{itemize}
|
||||
\textbf{Projektionen}
|
||||
\begin{itemize}
|
||||
\item Die Projektionen besitzen ein oder mehrere Attribute aus einer logischen
|
||||
Tablle (ggf durch Fremdschlüssel auch Attribute aus anderen Tabellen)
|
||||
\item Duplikate bleiben erhalten
|
||||
\item Als Sortierschlüssel wird eines der Attribute hergenommen
|
||||
\end{itemize}
|
||||
\textbf{Komprimierungen}
|
||||
Abhängig von zwei Eigenschaften der Spalte:
|
||||
\begin{itemize}
|
||||
\item Sortierung (nach der Spalte selbst) : ja/nein
|
||||
\item Anzahl der verschiedenen Werte: wenig/viel
|
||||
\end{itemize}
|
||||
\begin{enumerate}
|
||||
\item sortiert mit wenigen verschiedenen Werten:\\
|
||||
organisiert in einem B-Baum mit
|
||||
\begin{itemize}
|
||||
\item dichter Packung $\rightarrow$ alle Seiten voll (keine Änderungen!)
|
||||
\item und großen Seiten $\rightarrow$ geringe Höhe
|
||||
\end{itemize}
|
||||
\item unsortiert mit wenigen verschiedenen Werten:\\
|
||||
Offset-Indexe: B-Baum für Abbildung von Positiionen in einer Spalte auf die Werte in dieser Spaltebegin
|
||||
\item sortiert mit vielen verschiedenen Werten:\\
|
||||
\begin{itemize}
|
||||
\item B-Baum mit dichter Packung
|
||||
\item Delta Codierung: Differenzen zum Vorgänger speichern
|
||||
\end{itemize}
|
||||
\item unsortiert mit vielen verschiedenen Werten
|
||||
\begin{itemize}
|
||||
\item unkomprimiert
|
||||
\item B-Baum mit dichter Packung als sek. Organisation möglich
|
||||
\end{itemize}
|
||||
\end{enumerate}
|
||||
\subsubsection{Ausführung von Anfragen}
|
||||
\textbox{Schritte für Ausführung von Query:}{
|
||||
\begin{enumerate}
|
||||
\item Syntaxprüfung
|
||||
\item gibt es die Relation und Attribute
|
||||
\item wie heißt Datei zur Relation
|
||||
\item was für eine Datei ist das - direkt oder schlüsselbasiert
|
||||
\item gibt es passende Projektionen
|
||||
\item wo liegen die Verbund Indizes
|
||||
\item müssen Partitionen zusammgeführt werden
|
||||
\end{enumerate}
|
||||
}
|
342
idb_skript/Transaktionen.tex
Normal file
@ -0,0 +1,342 @@
|
||||
\section{Transaktionen}
|
||||
\subsection{Allgemein}
|
||||
\subsubsection{Was sind Transaktionen?}
|
||||
Transaktionen sind eine logische Arbeitseinheit, die mehrere
|
||||
DB Schritte zusammenfassen.\\
|
||||
Z.B. einfügen eines neuen Mitarbeiters besteht aus vielen kleinen
|
||||
DB Befehlen, bis Datenbank wieder konsistent ist
|
||||
|
||||
\subsubsection{Wofür sind sie gut?}
|
||||
Sie überleiten von einem konsistenten Zustand in den nächsten.
|
||||
Im Fehlerfall muss die Möglichkeit gegeben werden, wieder in
|
||||
einen konsistenten Zustand zu finden.
|
||||
Im Mehrfachbetrieb muss gewährleistet werden, dass keine
|
||||
Nebenläufigkeitsprobleme auftauchen.
|
||||
|
||||
\subsubsection{ACID Eigenschaften von Transaktionen:}
|
||||
\begin{itemize}
|
||||
\item \textbf{Atomic:} Alle Änderungen von TA werden aktiv oder keine
|
||||
\item \textbf{Consistency:} TA überführt DB von konsistent in konsistenten Zustand
|
||||
\item \textbf{Isolation:} TA wird nicht von anderer TA beeinflusst
|
||||
\item \textbf{Durability:} Änderungen sind Dauerhaft in DB übernommen
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Konsistenzen:}
|
||||
\subsubsection{Physische Konsistenz:}
|
||||
Alle Speicherungsstrukturen sind korrekt. Alle TID's stimmen etc.
|
||||
|
||||
\subsubsection{Logische Konsistenz:}
|
||||
Setzt Physische Konsistenz voraus.\\
|
||||
Korrektheit der Dateninhalte.\\
|
||||
Alle Bedingungen des Datenmodells und alle Benutzerdefinierten
|
||||
Bedingungen sind erfüllt (Assertions).
|
||||
|
||||
\subsection{Synchronisation}
|
||||
\subsubsection{Zustandsdiagramm TA}
|
||||
\begin{figure}[H]
|
||||
\begin{center}
|
||||
\includegraphics[scale=0.6]{pics/TA_status.png}
|
||||
\caption{Transaktionszustände}
|
||||
\end{center}
|
||||
\end{figure}
|
||||
|
||||
\subsubsection{Anomalien ohne Synchronisation}
|
||||
\begin{itemize}
|
||||
\item \textbf{lost updates}\\
|
||||
$r_1(x) r_2(x) w_1(x) w_2(x)$
|
||||
\item Abhängigkeiten von nicht freigegeben Änderungen
|
||||
\begin{itemize}
|
||||
\item \textbf{dirty read}\\
|
||||
$w_1(x)r_2(x)a_1 c_2$\\
|
||||
Änderung wird noch nicht freigegeben (ggf abgebrochen) aber trotzdem gelesen
|
||||
\item \textbf{dirty write}\\
|
||||
$w_1(x)r_2(x)w_2(x)a_1 c_2$\\
|
||||
Änderung wird noch nicht freigegeben (ggf abgebrochen) aber trotzdem geschrieben
|
||||
\end{itemize}
|
||||
\item \textbf{Non Repeatable Read}\\
|
||||
$r_1(x)w_2(x)r_1(x)$\\
|
||||
T1 sieht beim erneuten lesen einen anderen Wert als zuvor
|
||||
\item \textbf{Phantom}\\
|
||||
$r_1(P)w_2(x in P)r_1(P)$\\
|
||||
Wie bei \textit{Non Repeatable Read} nur Prädikat statt einzelnes Element
|
||||
\end{itemize}
|
||||
\textit{Legende: c = commit, a = abort, w = write, r = read}
|
||||
\subsubsection{Serialisierung}
|
||||
Hintereinanderausführung aller TA's. Problem werden
|
||||
sehr große Wartezeiten. Allgemein ist deine Datenbank für Mehrbenutzerbetrieb
|
||||
ausgelegt, dies würde ad adsurdum geführt durch Serialisierung.
|
||||
Was tun im Fehlerfall
|
||||
|
||||
\subsubsection{Serialisierbarkeit}
|
||||
Ziel:\\TA's laufen \textit{verzahnt} ab, aber ihr Ergebnis gleicht dem eines seriellen
|
||||
Ablaufes.\\
|
||||
$\rightarrow$ Ein Schedule von TA's ist \textbf{serialisierbar}, wenn es einen äquivalten
|
||||
\textbf{seriellen} Ablauf gibt.
|
||||
|
||||
\subsubsection{Implementierung von Sperren}
|
||||
\textbf{Wann sperren?}\\
|
||||
Statisch:\\
|
||||
Alles sperren was evtl gebraucht wir (preclaiming)
|
||||
|
||||
Dynamisch:\\
|
||||
Zur Laufzeit von TA nach Bedarf sperren\\
|
||||
$\rightarrow$ Gefahr von Verklemmungen!
|
||||
|
||||
Sperrgranulat:\\
|
||||
Warum nicht Tupel:
|
||||
\begin{itemize}
|
||||
\item Nicht immer effizient, bei großen Mengen
|
||||
\item Phantom Tupel; es können nur bereits existente Tupel gesperrt werden.
|
||||
\end{itemize}
|
||||
Deshalb wird \textit{hierarchische Schachtelung} der Datenobjekte:\\
|
||||
\begin{figure}[H]
|
||||
\begin{center}
|
||||
\includegraphics[scale=0.8]{pics/sperrgranulat.png}
|
||||
\caption{Sperrgranulate}
|
||||
\end{center}
|
||||
\end{figure}
|
||||
|
||||
Für jedes Objekt kann man nun einen Sperrmodus vergeben.
|
||||
Andere TA können daran erkennen, ob sie ihre Aktion ausführen dürfen.
|
||||
\begin{figure}[H]
|
||||
\begin{center}
|
||||
\includegraphics[scale=0.6]{pics/komp_matrix.png}
|
||||
\caption{Kompatibilitätsmatrix}
|
||||
\end{center}
|
||||
\end{figure}
|
||||
Das Problem an dieser Art der Sperrung ist, dass
|
||||
\begin{itemize}
|
||||
\item Alle Nachfolgeknoten implizit mitgesperrt werden
|
||||
\item Alle Vorgängerknoten auch gesperrt werden müssen
|
||||
\end{itemize}
|
||||
Daher werden sogenannte \textbf{(Intention) Anwartschaftssperren} eingeführt:
|
||||
\begin{itemize}
|
||||
\item {IS Sperre:\\
|
||||
falls auf untergeordnete Objekte lesend zugegriffen wird}
|
||||
\item {IX Sperre:\\
|
||||
falls auf untergeordnete schreibend zugegriffen wird}
|
||||
\end{itemize}
|
||||
$\rightarrow$ Benutzung von Untersperre wird angezeigt, aber nochmal explizit weiter unten gesetzt!
|
||||
\paragraph{TOP-DOWN bei Sperre}
|
||||
\begin{itemize}
|
||||
\item Bevor ein Knoten mit S oder IS gesperrt werden darf, müssen alle Vorgänger
|
||||
in der Hierarchie im IX- oder im IS-Modus gesperrt worden sein.
|
||||
\item
|
||||
Bevor ein Knoten mit X oder IX gesperrt werden darf, müssen alle Vorgänger
|
||||
in der Hierarchie im IX-Modus gesperrt worden sein.
|
||||
\end{itemize}
|
||||
\paragraph{BOTTOM-UP bei Freigabe}
|
||||
\begin{itemize}
|
||||
\item Freigabe von unten nach oben
|
||||
\item kein Knoten darf entsperrt werden, wenn noch andere Nachfolger dieses Knotens
|
||||
gesperrt sind
|
||||
\end{itemize}
|
||||
Als Optimierung gibt es noch die \textbf{SIX} Sperre. Alles wird lesend gesperrt
|
||||
und eine Menge an Nachfolgern schreibend. Das lohnt sich z.B. wenn aus einer Relation
|
||||
nur wenige Tupel verändert werden.
|
||||
|
||||
\subsubsection{Probleme beim Sperren}
|
||||
\begin{itemize}
|
||||
\item Sperren muss sehr schnell gehen, da Anforderungen sehr hoch
|
||||
\item halten von Sperren bis TA-ende führt zu langen Wartezeiten
|
||||
\item Eigenschaften des Schemas können \glqq hotspots\grqq erzeugen
|
||||
\item {Optimierungen:
|
||||
\begin{itemize}
|
||||
\item Nutzung mehrere Objektversionen
|
||||
\item spezialisiertes Sperren
|
||||
\item Änderungen auf privaten Objektkopien
|
||||
\end{itemize}
|
||||
}
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection{Verklemmungen}
|
||||
Lösungsmöglichkeiten:
|
||||
\begin{itemize}
|
||||
\item{\textbf{Timout:}\\
|
||||
Transaktion nach bestimmter Wartezeit zurücksetzen.\\
|
||||
$\rightarrow$ problematisch Länge des Timeouts zu bestimmen
|
||||
}
|
||||
\item{\textbf{Verhütung (Prevention)}\\
|
||||
Durch Preclaiming (s.o.) keine Deadlock Verhinderung zur Laufzeit notwenig.}
|
||||
\item{\textbf{Vermeidung (Avoidance)}\\
|
||||
Potentielle Deadlocks im vorhinein erkennen und vermeiden\\
|
||||
$\rightarrow$ Laufzeitunterstützung notwendig
|
||||
}
|
||||
\item{\textbf{Erkennung (Detection)}\\
|
||||
Explizites führen eines Wartegraphen und darin Zyklensuche. Im Zyklus dann
|
||||
eine oder mehrere (am besten billigste) TA zurücksetzen.}
|
||||
\end{itemize}
|
||||
\textbox{Deadlock - nicht serialisierbarer Schedule}{
|
||||
Nicht serialisierbare Schedules, beschreibt Abläufe die zu
|
||||
keinem seriellen Ablauf äquivalent sind. Die somit zu Deadlocks führen.
|
||||
Führt man diese mit \textit{dynamischen} Sperren aus, muss es aber nicht
|
||||
zwangsläufig auch zu Deadlocks kommen!
|
||||
}
|
||||
\subsection{Recovery}
|
||||
\textbf{Recovery Klassen:}
|
||||
\begin{itemize}
|
||||
\item {Partial Undo (R1-Recover)
|
||||
\begin{itemize}
|
||||
\item nach Transaktionsfehler
|
||||
\item isoliertes und vollständiges Zurücksetzen der Daten
|
||||
in Anfangszustand
|
||||
\item beeinflusst andere TA nicht
|
||||
\end{itemize}
|
||||
}
|
||||
\item {Partial Redo (R2-Recover)
|
||||
\begin{itemize}
|
||||
\item nach Systemfehler (mit Verlust von HS)
|
||||
\item Wiederhlung aller verlorengegangenen Änderungen
|
||||
(waren nur im Puffer) von abgeschlossenen TA
|
||||
\end{itemize}
|
||||
}
|
||||
\item {Global Undo (R3-Recover)
|
||||
\begin{itemize}
|
||||
\item nach Systemfehler (mit Verlust von HS)
|
||||
\item Zurücksetzen aller durch Ausfall unterbrochenen TA
|
||||
\end{itemize}
|
||||
}
|
||||
\item {Global Redo (R4-Recover)
|
||||
\begin{itemize}
|
||||
\item nach Gerätefehler
|
||||
\item Einspielen von Archivkopie und nachvollziehen
|
||||
aller beendeten TA's
|
||||
\end{itemize}
|
||||
}
|
||||
\end{itemize}
|
||||
\subsubsection{Archivkopien}
|
||||
Arten:
|
||||
\begin{itemize}
|
||||
\item \glqq cold backup\grqq: DBS muss au"ser Betrieb sein
|
||||
\item \glqq hot backup\grqq: Beeinträchtigung des laufenden Betriebs
|
||||
\end{itemize}
|
||||
\subsubsection{Einbringstrategien}
|
||||
Wann werden geänderte Daten aus dem Puffer auf die Platte geschrieben?
|
||||
\begin{itemize}
|
||||
\item {STEAL:\\
|
||||
Bei Verdrängung aus dem Puffer, auch vor Ende der Transaktion}
|
||||
\item {NO STEAL:\\
|
||||
Frühestens am Ende der Transaktion $\rightarrow$ kein UNDO erfoderlich (aber großen Puffer)}
|
||||
|
||||
\item {FORCE:\\
|
||||
Spätestens am Ende der Transaktion $\rightarrow$ kein Partial Redo erfoderlich}
|
||||
|
||||
\item {NO FORCE:\\
|
||||
Erst bei Verdrängung aus dem Puffer}
|
||||
\end{itemize}
|
||||
Wie werden geänderte Daten aus dem Puffer auf Platte geschrieben?
|
||||
\begin{itemize}
|
||||
\item{ATOMIC:\\
|
||||
Indirekte Einbringstrategie.\\
|
||||
Ununterbrechbares Umschalten}
|
||||
\item{NOT ATOMIC:
|
||||
Direkte Einbringstrategie.\\
|
||||
Ist nicht ununterbrechbar.
|
||||
}
|
||||
\end{itemize}
|
||||
\subsubsection{Protokolldaten}
|
||||
Als Protollinformation zählt was über die Einbringungsstrategie hinaus
|
||||
benötigt wird, um nach einem Systemausfall den jüngsten konsisten Zustand
|
||||
wiederherzustellen.
|
||||
\begin{figure}[H]
|
||||
\begin{center}
|
||||
\includegraphics[scale=0.6]{pics/protokoll2.png}
|
||||
\caption{Protokollinformationen}
|
||||
\end{center}
|
||||
\end{figure}
|
||||
|
||||
\paragraph{Wann wird in Protokolldatei geschrieben?}
|
||||
\begin{itemize}
|
||||
\item{UNDO-Information:
|
||||
\begin{itemize}
|
||||
\item bevor die zugehörigen Änderungen in Datenbestand eingebracht werden
|
||||
\item sonst Rücksetzen unmöglich
|
||||
\end{itemize}
|
||||
}
|
||||
\item{REDO-Information:
|
||||
\begin{itemize}
|
||||
\item muss geschrieben sein (in tmp Log Datei und Archivdatei), bevor der Abschluss der TA
|
||||
an Programm bzw Benutzer gemeldet wird
|
||||
\item sonst Wiederherstellung nicht möglich
|
||||
\end{itemize}
|
||||
}
|
||||
\end{itemize}
|
||||
\subsubsection{Backward-/Forward Recovery}
|
||||
\begin{enumerate}
|
||||
\item{ Forward:\\
|
||||
Änderungen sind noch nicht in DB, aber schon in Log. Bevor
|
||||
diese auf DB geschrieben werden, wird ein Commit-Record in
|
||||
Log File geschrieben. Falls was schief geht und der Commit Record noch da ist, werden alle diese Änderungen wiederholt und ansonsten nichts getan, da alte Version noch in DB steht.}
|
||||
\item{ Backward:\\
|
||||
Ins Log kommt immer \textbf{alte} Version eines Wertes. Bei
|
||||
einem Commit wird gewartet bis alle neuen werte in DB stehen.
|
||||
Danach erst wird CommitRecord erstellt und eine Bestätigung
|
||||
signalisiert.
|
||||
Bei Verlust werden entweder alte Daten hergestellt oder nichts getan.}
|
||||
\end{enumerate}
|
||||
\paragraph{Vergleich}
|
||||
\begin{itemize}
|
||||
\item{ Forward Recovery: Hoher Speicherplatzbedarf! Daten werden erst nach Beendigung der TA in DB geschrieben und deswegen solange in Puffer behalten}
|
||||
\item{ Backward-Recovery: Hoher I/O Aufwand! Alle Änderungen müssen vor TA-Ende in Datenfiles stehen.}
|
||||
\end{itemize}
|
||||
\subsubsection{Undo-/Redo Logging}
|
||||
Verbesserung zu Backward-/Forward Recovery.
|
||||
\begin{figure}[H]
|
||||
\begin{center}
|
||||
\includegraphics[scale=0.8]{pics/protokoll.png}
|
||||
\caption{Physische Protokollierung}
|
||||
\end{center}
|
||||
\end{figure}
|
||||
Zustände vor bzw nach einer Änderungen werden protokolliert:
|
||||
\begin{itemize}
|
||||
\item alter Zustand: Before Image (BI) für UNDO
|
||||
\item neuer Zustand: After Image (AI) für REDO
|
||||
\item für jede veränderte Seite (3) wird jeweils eine
|
||||
vollständige Kopie vor (2) und nach (4) der Änderung in den Log
|
||||
geschrieben.\\
|
||||
$+$ schnelle Recovery\\
|
||||
$-$ hoher E/A Aufwand
|
||||
\end{itemize}
|
||||
\paragraph{Optimierungen}
|
||||
Um Log-Aufwand zu reduzieren nur geänderte \textbf{Teile einer Seite}
|
||||
protokollieren.\\
|
||||
Sammlung und Pufferung im HS:
|
||||
\begin{itemize}
|
||||
\item $+$ reduzierter E/A Aufwand
|
||||
\item $-$ komplexeres und zeitaufwändigeres Recovery\\
|
||||
Zurückspeichern gleicht eher dem Neu einfügen (freien Platz suchen, TID vergeben), da Stelle von wo Einträge stammen anderweitig genutzt werden können
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection{Sicherungspunkte}
|
||||
Ma"snahmen zur Begrenzung des REDO Aufwands nach Systemfehlern (alle
|
||||
erfolgreichen Änderungen die im Puffer verloren gegangen sind müssen wiederholt werden $\rightarrow$ nicht praktikabel!
|
||||
\paragraph*{Methoden}
|
||||
\begin{itemize}
|
||||
\item{ \textbf{Transaction-Oriented Checkpoint}\\
|
||||
Geänderte Seiten einer TA nach TA-ende sofort in DB bringen (siehe FORCE) $\rightarrow$ zu hohe Belastung}
|
||||
\item{ \textbf{ Transaction-Consisten Checkpoint}
|
||||
\begin{itemize}
|
||||
\item Einbringung aller Änderung erfolgreicher TA's
|
||||
\item Lesesperre auf ganzer DB zum Zeitpunkt des Sicherungspunktes
|
||||
\item Verzögerung von TA's
|
||||
\item Sicherungspunkt begrenzt Undo und Redo Recovery
|
||||
\end{itemize}
|
||||
}
|
||||
\item{ \textbf{Action-Consisten Checkpoint}
|
||||
\begin{itemize}
|
||||
\item Zum Zeitpunkt des Sicherungspunktes dürfen keine Änderunen aktiv sein
|
||||
\item Begünstigt nur Recovery, dafür kürzere Totzeit von System
|
||||
\end{itemize}
|
||||
}
|
||||
\end{itemize}
|
||||
\subsubsection{Allgemeine Restart Prozedur}
|
||||
\textbf{3-phasiger Ansatz}
|
||||
\begin{enumerate}
|
||||
\item Analyse Lauf\\
|
||||
Vom letzten Checkpoint bis zum Log Ende. Bestimmung von Gewinner und Verlierer TA's, sowie Seiten, die von ihnen geändert wurden
|
||||
\item Undo Lauf \\
|
||||
Rücksetzen der Verlierer TA's durch Rückwärtslesen des Logs bis zum BOT Satz der ältesten Verlierer TA
|
||||
\item Redo Lauf \\
|
||||
Vorwärtslesen des Logs (Startpunkt abhängig von Checkpoint Typ) und Änderungen der Gewinner TA's wiederholen
|
||||
\end{enumerate}
|
||||
|
BIN
idb_skript/pics/TA_status.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
idb_skript/pics/anfrageverarbeitung.png
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
idb_skript/pics/bbaumknoten.png
Normal file
After Width: | Height: | Size: 4.6 KiB |
BIN
idb_skript/pics/bstern.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
idb_skript/pics/clock.png
Normal file
After Width: | Height: | Size: 6.0 KiB |
BIN
idb_skript/pics/hash_join.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
idb_skript/pics/komp_matrix.png
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
idb_skript/pics/lru.png
Normal file
After Width: | Height: | Size: 6.9 KiB |
BIN
idb_skript/pics/merge_sort_join.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
idb_skript/pics/operatorbaum.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
idb_skript/pics/protokoll.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
idb_skript/pics/protokoll2.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
idb_skript/pics/satz_speicherstruktur.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
idb_skript/pics/schichten.png
Normal file
After Width: | Height: | Size: 108 KiB |
BIN
idb_skript/pics/sperrgranulat.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
idb_skript/pics/trefferrate.png
Normal file
After Width: | Height: | Size: 12 KiB |