From 8c7e0463059d1f8a3e8a6cfb9becd61b7e67f4e4 Mon Sep 17 00:00:00 2001 From: Christian Bay Date: Thu, 13 Feb 2014 16:44:53 +0100 Subject: [PATCH] fertig --- BBaum.tex | 39 +++++++++++++++++++++++- IDB.tex | 2 ++ Programmschnittstellen.tex | 55 +++++++++++++++++++++++++++++++++ Puffer.tex | 61 +++++++++++++++++++++++++++++++++++++ pics/clock.png | Bin 0 -> 6097 bytes pics/lru.png | Bin 0 -> 7099 bytes 6 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 Programmschnittstellen.tex create mode 100644 Puffer.tex create mode 100644 pics/clock.png create mode 100644 pics/lru.png diff --git a/BBaum.tex b/BBaum.tex index 559316f..8749216 100644 --- a/BBaum.tex +++ b/BBaum.tex @@ -33,7 +33,7 @@ Pi = Zeiger auf Nachfolgeknoten \item finde direkten Vorgänger $\text{S}'$ und Nachfolger $\text{S}''$ \item Wähle dne 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} @@ -54,6 +54,24 @@ Am Ende eines Knotens ist ein Zeiger auf den nächsten enthalten am Ende. \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: @@ -73,3 +91,22 @@ Knoten enthalten. 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) diff --git a/IDB.tex b/IDB.tex index 03ae93d..e3b1b79 100644 --- a/IDB.tex +++ b/IDB.tex @@ -78,6 +78,8 @@ \include{./Einfuehrung} \include{./Saetze} \include{./BBaum} +\include{./Puffer} +\include{./Programmschnittstellen} \include{./Speicherung} \include{./Anfrageverarbeitung} \include{./Relationale_Operatoren} diff --git a/Programmschnittstellen.tex b/Programmschnittstellen.tex new file mode 100644 index 0000000..384ecb7 --- /dev/null +++ b/Programmschnittstellen.tex @@ -0,0 +1,55 @@ +\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 + \begin{lstlisting}[language=java] + Boolean Handle.hasNext(); + \end{lstlisting} +\end{enumerate} diff --git a/Puffer.tex b/Puffer.tex new file mode 100644 index 0000000..bca67c4 --- /dev/null +++ b/Puffer.tex @@ -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 (BlcokFile FIle, int BlockNo, char Mode); +\end{lstlisting} +\begin{itemize} + \item Block ist zur 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} diff --git a/pics/clock.png b/pics/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..011d660a67df11d662738eb093c4e724e15d5c8a GIT binary patch literal 6097 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 D#9Gm} literal 0 HcmV?d00001 diff --git a/pics/lru.png b/pics/lru.png new file mode 100644 index 0000000000000000000000000000000000000000..d3a830362a58ed1fcde8b051bf448bf970d840ba GIT binary patch literal 7099 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 jP#}t2$RSg`=a