From c9f7e3a4b1d19e3025dad74045c522e21b1f25c6 Mon Sep 17 00:00:00 2001 From: Christian Bay Date: Tue, 11 Feb 2014 20:28:21 +0100 Subject: [PATCH] Speicherung angefangen. Bilderordner sortiert. --- .gitignore | 2 + IDB.tex | 1 + Speicherung.tex | 82 +++++++++++++++++++- Transaktionen.tex | 10 +-- TA_status.png => pics/TA_status.png | Bin komp_matrix.png => pics/komp_matrix.png | Bin protokoll.png => pics/protokoll.png | Bin protokoll2.png => pics/protokoll2.png | Bin pics/satz_speicherstruktur.png | Bin 0 -> 21898 bytes sperrgranulat.png => pics/sperrgranulat.png | Bin 10 files changed, 89 insertions(+), 6 deletions(-) rename TA_status.png => pics/TA_status.png (100%) rename komp_matrix.png => pics/komp_matrix.png (100%) rename protokoll.png => pics/protokoll.png (100%) rename protokoll2.png => pics/protokoll2.png (100%) create mode 100644 pics/satz_speicherstruktur.png rename sperrgranulat.png => pics/sperrgranulat.png (100%) diff --git a/.gitignore b/.gitignore index e0e6f7d..1371594 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ *.fls +*.lof +*.swp* *.pdf *.aux *.out diff --git a/IDB.tex b/IDB.tex index 7072382..376aba4 100644 --- a/IDB.tex +++ b/IDB.tex @@ -60,6 +60,7 @@ \begin{document} \tableofcontents +\listoffigures \newpage \include{./Speicherung} \include{./Transaktionen} diff --git a/Speicherung.tex b/Speicherung.tex index 2c4e643..46f5d4b 100644 --- a/Speicherung.tex +++ b/Speicherung.tex @@ -1 +1,81 @@ -\section{Speicherung} +\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 im 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} + +\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 nach Attribut sortiert + \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 +\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 hergenohmen +\end{itemize} diff --git a/Transaktionen.tex b/Transaktionen.tex index 1c00f75..246e7fc 100644 --- a/Transaktionen.tex +++ b/Transaktionen.tex @@ -35,7 +35,7 @@ Bedingungen sind erfüllt (Assertions). \subsubsection{Zustandsdiagramm TA} \begin{figure}[H] \begin{center} - \includegraphics[scale=0.6]{TA_status.png} + \includegraphics[scale=0.6]{pics/TA_status.png} \caption{Transaktionszustände} \end{center} \end{figure} @@ -91,7 +91,7 @@ Warum nicht Tupel: Deshalb wird \textit{hierarchische Schachtelung} der Datenobjekte:\\ \begin{figure}[H] \begin{center} - \includegraphics[scale=0.8]{sperrgranulat.png} + \includegraphics[scale=0.8]{pics/sperrgranulat.png} \caption{Sperrgranulate} \end{center} \end{figure} @@ -100,7 +100,7 @@ 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]{komp_matrix.png} + \includegraphics[scale=0.6]{pics/komp_matrix.png} \caption{Kompatibilitätsmatrix} \end{center} \end{figure} @@ -240,7 +240,7 @@ benötigt wird, um nach einem Systemausfall den jüngsten konsisten Zustand wiederherzustellen. \begin{figure}[H] \begin{center} - \includegraphics[scale=0.6]{protokoll2.png} + \includegraphics[scale=0.6]{pics/protokoll2.png} \caption{Protokollinformationen} \end{center} \end{figure} @@ -283,7 +283,7 @@ wiederherzustellen. Verbesserung zu Backward-/Forward Recovery. \begin{figure}[H] \begin{center} - \includegraphics[scale=0.8]{protokoll.png} + \includegraphics[scale=0.8]{pics/protokoll.png} \caption{Physische Protokollierung} \end{center} \end{figure} diff --git a/TA_status.png b/pics/TA_status.png similarity index 100% rename from TA_status.png rename to pics/TA_status.png diff --git a/komp_matrix.png b/pics/komp_matrix.png similarity index 100% rename from komp_matrix.png rename to pics/komp_matrix.png diff --git a/protokoll.png b/pics/protokoll.png similarity index 100% rename from protokoll.png rename to pics/protokoll.png diff --git a/protokoll2.png b/pics/protokoll2.png similarity index 100% rename from protokoll2.png rename to pics/protokoll2.png diff --git a/pics/satz_speicherstruktur.png b/pics/satz_speicherstruktur.png new file mode 100644 index 0000000000000000000000000000000000000000..d62fbb0929df26d18a24a6d0fb80a7271eb7b40f GIT binary patch literal 21898 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