\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
\usepackage[ngerman]{babel}
\usepackage{tabularx}
\usepackage{graphicx}
\usepackage{listings}

\newcommand{\cmd}[1]{\texttt{#1}}
\setlength{\parindent}{0mm}
\begin{document}
	\section{Allgemeine Informationen}
	\subsection*{What's this}
Dies ist eine studentische, prüfungsschwierigkeit immitierende Aufgabenzusammenfassung die Themen der Vorlesung IDB. Es handelt sich insbesondere nicht um einen sogenannten "Braindump". Die Aufgaben orientieren sich an den Aufgaben in der ursprünglichen Klausur insofern, dass hier zum Beipsiel anstatt der Frage 'Sind Kühe Lila?' die Frage 'Machen Kuehe Schokolade?' steht. Auf beide Fragen ist die Antwort: Nein, du schaust zuviel Milkawerbung.

	\subsection*{Maintaining}
	Der Latex-Source dieses PDFs wird auf \textit{https://gitlab.cs.fau.de/ik15ydit/latexandmore} (ein Account ist noetig) maintain't, es wurde aber urspruenglich von einer anderen Person erstellt, die jedoch anonym bleiben moechte. Da die Aufgaben alle neu formuliert und konzipiert wurden, kann es sein, dass uns an einigen Stellen Fehler Unterlaufen sind. Solltet ihr solche Fehler finden oder generell Anmerkungen haben koennt ihr mit einem Account auf \textit{gitlab.cs.fau.de} eine Issue aufmachen oder einen Pullrequest stellen.
	

	\section*{Aufgabe 1: Ankreuzen}

		\subsubsection*{a) Was gilt in einer sequentielle Satzdatei?}
			\begin{itemize}\itemsep0em
				\item Jeder Satz in der Datei kann verkleinert werden
				\item Es koennen Wahlfrei Saetze aus der Datei gelesen werden.
				\item Die Datei kann um einen Satz am Ende erweitert werden
				\item Jeder Satz in der Datei kann vergroessert werden
				\item Die Datei kann als ganzes ueberschrieben werden
				\item An jeder Stelle in der Datei kann ein Satz eingefuegt werden
			\end{itemize}

		\subsubsection*{b) Was gilt fuer Bloecke, Seiten und Saetze}
			\begin{itemize}\itemsep0em
				\item Blöcke können kleiner als Sätze sein
				\item Seiten sind immer größer als Sätze
				\item Sätze können kleiner als Blöcke sein
				\item Sätze sind immer kleiner als Seiten
				\item Seiten sind immer größer als Blöcke
				\item Blöcke koennen größer als Seiten sein
			\end{itemize}

		\subsubsection*{c) Was ist der Systemkatalog, wofuer wird er verwendet. Nenne mindestens drei Beipiele was dort normalerweise gespeichert wird.}
			\vspace{3cm}

		\subsubsection*{d) Wieviele Indirektionen koennen beim Zugriff auf einen Satz ueber seine TID maximal auftreten, wenn der Satz komplett in einer Seite gespeichert ist?}
		\vspace{4cm}
		\subsubsection*{e) Welches Problem kann beim folgenden Vorgehen auftreten?}
		In einder Datenbank wird eine Sperre fuer ein Datenobjekt angefordert sobald das erste mal auf dieses Datenobjekt zugegeriffen wird und wieder freigegeben, sobald dieses Datenobjekt nicht mehr genutzt wird.
		\newpage
		\vspace{3cm}
		\section*{Aufgabe 2: SQL etc.}
		\vspace{1cm}
		\subsubsection*{a) Erklaeren sie kurz den Begriff "Grenztrefferrate".}
		\vspace{3cm}
		\subsubsection*{b) Was sind Planoperatoren und wie werden sie ausgewaehlt?}
		\newpage	
		\subsection*{c) Optimiere folgenden Operatorengraph, Zwischenschritte geben keine Extrapunkte.}
		\includegraphics[scale=0.7]{operatorengraph.png}
		\newpage

		\newpage
		\subsection*{d) Schauen sie sich diese zwei SQL-Codeabschnitte an:}
			\begin{verbatim}
			CREATE VIEW Bierampel AS
			SELECT x.beerrating, y.winerating x.year
			FROM Rel_1 x JOIN Rel_2 y ON x.ID = y.ID
			WHERE x.selector = 42;
			\end{verbatim}
			%\vspace{2mm}
			\hrule
			\begin{verbatim}
			SELECT year, AVG(winerating)
			FROM Bierampel
			GROUP BY year
			HAVING COUNT(*) > 4;
			\end{verbatim}

			\subsubsection*{i) Zeichne einen nicht optimierten Operatorengraphen}
\vspace{6cm}

			\subsubsection*{ii) Zeichnen sie den optimierten Operatorengraphen. (auch die View muss optimiert sein)}

		\newpage

		\section*{Aufgabe 3: Schichtenmodell}
			Ordnen Sie ein, falsche Einordnung gibt Punktabzug:

			\begin{itemize}\itemsep0em
				\item Speicherstrukturen
				\item Optimierung von SQL-Anfrage
				\item append(Datei, Blockanzahl)
				\item Freispeicherliste
				\item write(TID)
				\item Kanalkommandos
				\item B-Baum
				\item Schattenspeicher
				\item fix(File,BlockNo,mode)
				\item Ausführungsplanerstellung
				\item Lineares-Hashing
				\item mengenorientierte DB-Schnittstelle
			\end{itemize}

		\newpage

		\includegraphics[width=17cm]{idb-2015w-3.pdf}


		\newpage


		\section*{Aufgabe 4: Puffer}
			\subsection*{a)}
				Aus der Vorlesung sind die Funktionen der Pufferschnittstelle bekannt. Ergaenzen sie den folgenden Programmablauf mit ensprechenden Funktionsaufrufen aus dieser Scchnittstelle.
Fehlerbehandlung sowie Behandlung von fragmentierten Saetzen ist nicht notwendig. 
\texttt{struct tid} hat die Felder \texttt{block_no} und \texttt{index}.


\begin{lstlisting}[language=c,tabsize=4]
static char *read(char* segment_identifier, struct tid tid) {


    char* page_in_main_memory :=


    if (indirection(page_in_main_memory, tid.index)){


		char* tid_indirected = getIndirection(page_in_main_memory, tid.index);


		page_in_main_memory =


		tid = tid_indirected;
		
		
	}


    char* final := special_memcpy(page_in_main_memory, tid.index);


    return final;
}
\end{lstlisting}

		\subsection*{b)}
			Bestimme die LRU-Stacktiefenverteilung fuer die folgende Zugriffsfolge. Vorgehen muss nachvollziehbar sein, markieren sie das Endergebniss gut sichtbar.

			Zugriffsfolge: 4, 2, 2, 1, 4, 1, 1, 2, 4

		\newpage



		\section*{Aufgabe 5: Koksing}

		Es gilt die gleiche Hashfunktionen $h_j(k) = k$ mod($2^jq$); $j=0,1,...$ wie in der Vorlesung und die anfangs Bucketanzahl $q$ = 2. Bucketgroesse $b$ ist $2$, geplittet wird immer wenn ein Wert in einen Overflow-Bucket geschrieben werden muss. Gewuenscht ist nur das Endergebnis, die Teilaufgaben sind voneinander unabhaenig.


		\subsection*{a)}
			In die folgende Hashtabelle soll die Zahl 32 eingefuegt werden.
			Hashfunktionen die gerade benutzt werden:
			\begin{itemize}\itemsep0em
				\item vor Einfügen: $h_0(k), h_1(k)$
				\item nach Einfügen: \underline{\hspace{3cm}}
			\end{itemize}


			\begin{tabularx}{15cm}{|X|X|X|X|X|X|X|X|X|}
				\hline
				Pointer &   & p &   &   &   &   &   &  \\
				\hline
				Bucket & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7\\
				\hline
				Feld 1 & 16 &   &   &   &   &   &   &\\
				\hline
				Feld 2 & 10 &   &   &   &   &   &   &\\
				\hline
			\end{tabularx}
			\vspace{5mm}\\
			Overflowbuckets:\\

			\begin{tabularx}{15cm}{|X|X|X|X|X|X|X|X|X|}
				\hline
				Feld 1 &   &   &   &   &   &   &   &\\
				\hline
				Feld 2 &   &   &   &   &   &   &   &\\
				\hline
			\end{tabularx}


		\subsection*{b)}
			In die folgende Hashtabelle soll die Zahl 36 eingefuegt werden.
			Hashfunktionen die gerade benutzt werden:
			\begin{itemize}\itemsep0em
				\item vor Einfügen: $h_0(k)$
				\item nach Einfügen: \underline{\hspace{3cm}}
			\end{itemize}


			\begin{tabularx}{15cm}{|X|X|X|X|X|X|X|X|X|}
				\hline
				Pointer & p &   &   &   &   &   &   &  \\
				\hline
				Bucket & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7\\
				\hline
				Feld 1 & 12 & 9 &   &   &   &   &   &\\
				\hline
				Feld 2 & 36 & 1 &   &   &   &   &   &\\
				\hline
			\end{tabularx}
			\vspace{5mm}\\
			Overflowbuckers:\\

			\begin{tabularx}{15cm}{|X|X|X|X|X|X|X|X|X|}
				\hline
				Feld 1 &   &   &   &   &   &   &   &\\
				\hline
				Feld 2 &   &   &   &   &   &   &   &\\
				\hline
			\end{tabularx}

\newpage


		\subsection*{c) [4 Punkte]}
			In die folgende Hashtabelle soll die Zahl 20 eingefuegt und danach die Zahl 7 werden.
			Hashfunktionen die gerade benutzt werden:
			\begin{itemize}\itemsep0em
				\item vor Einfügen: $h_1(k), h_2(k)$
				\item nach Einfügen: \underline{\hspace{3cm}}
			\end{itemize}


			\begin{tabularx}{15cm}{|X|X|X|X|X|X|X|X|X|}
				\hline
				Pointer &   &   & v &   &   &   &   &  \\
				\hline
				Bucket & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7\\
				\hline
				Feld 1 &   & 3 & 4 & 14 &   &   &   &\\
				\hline
				Feld 2 &   & 11 &   & 43 &   &   &   &\\
				\hline
			\end{tabularx}
			\vspace{5mm}\\
			Overflowbuckets:\\
			
			\begin{tabularx}{15cm}{|X|X|X|X|X|X|X|X|X|}
				\hline
				Feld 1 &   &   &   &   &   &   &   &\\
				\hline
				Feld 2 &   &   &   &   &   &   &   &\\
				\hline
			\end{tabularx}

	\newpage

	\section*{Aufgabe 6: B-Baum}
		\includegraphics[width=18cm]{btree.png}
		
		\vspace{1cm}

		\subsection*{a)}
			Füge den Schlüssel 5 ein und zeichne den Baum.

		\newpage


		\subsection*{b)}
			Füge den Schlüssel 25 ein (in den urspruenglichen Baum).

			\vspace{10cm}

		\subsection*{c)}
			Löschen sie die Wurzel des urspruenglichen Baumes.

		\newpage


	\section*{Aufgabe 7: C-Store}

		\subsubsection*{a) Wie werden Attributswerte in C-Store gespeichert? (Kurzer Umriss)}
		\vspace{3cm}


		\subsubsection*{b) Anhand welcher Eigenschaften von Attributen werden Komprimierungsverfahren in C-Store ausgewaehlt?}
			\vspace{3cm}

		\subsubsection*{c) Wieviele Attribute, aus wie vielen verschiedenen logischen Tabellen, kann eine C-Store-Projektion maximal enthalten? (Keine Begruendung)}

\vspace{3cm}

		\subsubsection*{d) Wie koennen Zeichenketten extrem Platzsparend gespeichert werden?}
\vspace{3cm}
		\subsubsection*{e) In wie vielen C-Store Projektionen kann ein Attribut maximal enthalten sein? (Keine Begruendung)}
\vspace{3cm}
		\subsubsection*{f) Kreuze *nicht* korrekte Aussagen an: (0-5)}
			\begin{itemize}\itemsep0em
				\item der Storage Key wird fuer alle Attibute mitgespeichert
				\item der Storage Key ist fuer alle Attributswerte eines Tupels gleich
				\item der Storage Key laesst sich aus der Speicherposition des Attibutwertes berechnen
				\item ein Verbund-Index ordnet einen Storage Key einer Projektion den einer anderen Projektion zu
				\item mindestes einer der Schluessel einer Projektion ist in allen anderen Tabellen enthalten
			\end{itemize}

	\section*{Aufgabe 8: Keiner will Backup, alle wollen Restore}
		\subsubsection*{a) Zeichnen sie einen Abhaengigkeitsgraphen zum folgenden Ablauf. Kanten muessen mit dem/den Objekt(en) durch das/die sie entstanden sind (also A,B oder C) gekennzeichnet werden.}

			w2(B), r1(C), w3(C), r1(A), w1(A), w2(B), r3(B), r3(A), w3(A), w2(B)\\
			
			\hspace{4cm}\includegraphics[width=10cm]{transaktionen-template.pdf}


		\subsection*{b) Ist der Graph oben serialisierbar? Warum bzw. Warum nicht?}
			\vspace{3cm}

		\subsection*{d) Was gilt bei Transaction-Oriented Checkpoints? (multiple choice)}
			\begin{itemize}\itemsep0em
				\item Redo-Recovery nötig, aber durch Checkpoint begrenzt.
				\item Undo-Recovery nötig, aber durch Checkpoint begrenzt.
				\item Keinerlei Redo-Recovery nötig.
				\item Keinerlei Undo-Recovery nötig.
				\item Redo-Recovery nicht durch Checkpoint begrenzt.
				\item Undo-Recovery nicht durch Checkpoint begrenzt.
			\end{itemize}
			
		\subsection*{c) Was gilt bei Action-Consistent Checkpoints (multiple choice)}
			\begin{itemize}\itemsep0em
				\item Redo-Recovery nötig, aber durch Checkpoint begrenzt.
				\item Undo-Recovery nötig, aber durch Checkpoint begrenzt.
				\item Keinerlei Redo-Recovery nötig.
				\item Keinerlei Undo-Recovery nötig.
				\item Redo-Recovery nicht durch Checkpoint begrenzt.
				\item Undo-Recovery nicht durch Checkpoint begrenzt.
			\end{itemize}

	\newpage

		\subsection*{c) Was gilt bei Transaction-Consistent Checkpoints (multiple choice)}
			\begin{itemize}\itemsep0em
				\item Redo-Recovery nötig, aber durch Checkpoint begrenzt.
				\item Undo-Recovery nötig, aber durch Checkpoint begrenzt.
				\item Keinerlei Redo-Recovery nötig.
				\item Keinerlei Undo-Recovery nötig.
				\item Redo-Recovery nicht durch Checkpoint begrenzt.
				\item Undo-Recovery nicht durch Checkpoint begrenzt.
			\end{itemize}


	\newpage


	\section*{Aufgabe 9: Sperren}
			Geben sie an in welcher Reihenfolge Sperren angefordert werden, und, sollte eine Sperre nicht moegliche sein, kennzeichnen sie diese. Sie muessen nach einer nicht moeglichen Sperre nicht weitermachen. Teilaufgaben sind unabhaengig voneinander. Die Organisation der Daten sieht so aus:\\
			
		\hspace{4cm}\includegraphics[width=10cm]{idb-2015w-9.pdf}

		\subsection*{a)}
			Existierende Sperren:\\\\
			\begin{tabular}{|l|l|l|}
				\hline
				Datenobjekt & Sperre\\
				\hline
				R & IS\\
				\hline
				B1 & S\\
				\hline
				T & IS\\
				\hline
			\end{tabular}\\
			\vspace{1cm}\\
			Transaktion fordert X-Sperre fuer B1 an:\\


	\newpage

		\subsection*{b)}
			Existierende Sperren anderer Transaktionen:\\\\
			\begin{tabular}{|l|l|l|}
				\hline
				Datenobjekt & Sperre\\
				\hline
				L & SIX\\
				\hline
				T & IX\\
				\hline
			\end{tabular}
			\vspace{1cm}

			Transaktion fordert X-Sperre fuer A1 an:\\
			\vspace{4cm}

		\subsection*{c)}
			Existierende Sperren anderer Transaktionen:\\\\
			\begin{tabular}{|l|l|l|}
				\hline
				Datenobjekt & Sperre\\
				\hline
				T & IS\\
				\hline
				T & IX\\
				\hline
				B2 & S\\
				\hline
				L & IS\\
				\hline
				R & IS\\
				\hline
				A2 & S\\
				\hline
			\end{tabular}
			\vspace{1cm}
			
			Transaktion fordert S-Sperre fuer A2 an:\\
\newpage
	\section*{Aufgabe 10: Inner Join}
			\begin{minipage}[t]{8cm}
				Relation R\\
				\begin{tabular}{|l|l|}
					\hline
					x & y\\
					\hline
					0 & F\\
					\hline
					4 & G\\
					\hline
					13 & A\\
					\hline
					8 & F\\
					\hline
					2 & B\\
					\hline
					1 & C\\
					\hline
				\end{tabular}
			\end{minipage}			
			\begin{minipage}[t]{5.5cm}
				Relation S\\
				\begin{tabular}{|l|l|}
					\hline
					x & y\\
					\hline
					13 & C\\
					\hline
					2 & U\\
					\hline
					6 & Z\\
					\hline
					8 & D\\
					\hline
					4 & A\\
					\hline
					0 & B\\
					\hline
					29 & W\\
					\hline
				\end{tabular}
			\end{minipage}
			\vspace{1cm}
			
			Mache einen Hash-Verbund Inner Join mit S.x = R.x, die 
			Zwischenergebnisse der einzelnen Schritte (also das Ergebnis 
			\textbf{nach} einem Schritt) muessen angegeben werden. Hashfunktion 
			ist $h(k) = k mod 2$. Ein Bucket fasst maximal 2 Tupel, verwenden 
			Sie keine Überlaufbuckets. Ist die Hash-Tabelle gefüllt kann die 
			verbleibende Relation in einem Schritt sequentiell durchlaufen 
			werden.\\\hrule \vspace{1cm}
			
% Beim Lesen: So lange Tupel aus R (der kleineren Relation) in die Hashtabelle 
% eintragen bis wir deren Limit erreicht haben (aka wir bräuchten ein 
% Überlaufbucket, das ist ja aber nicht erlaubt). Beim ersten Lesen kommen wir 
% also bis einschließlich (13, A), stände hier eine 14 kämen wir nur bis (4, G) 
% und hätten somit mehr als 2 Abschnitte.

% Beim Probing: Die komplette Relation S durchlaufen (die Frage ob das mit 
% mehreren oder einem Blockzugriff geht bleibt offen). Jeden Treffer in die 
% Ergebnisrelation eintragen.

% Da beim Lesen nur die Hashtabelle und beim Probing nur die Ergebnisrelation 
% geändert werden kann man die andere Vorlage jeweils weglassen.

		\textbf{1. Lesen}\\
		
		Hashtabelle:\\
		\begin{tabularx}{5cm}{|X|X|}
			\hline
			0 & 1\\
			\hline
			\rule{0pt}{2cm} & \\
			\hline
		\end{tabularx}

		\vspace{1cm}
\newpage
		\textbf{2. Probing}\\

		Ergebnisrelation:\\
		\begin{tabularx}{10cm}{|X|X|X|X|}
			\hline
			S.x & S.y & R.x & R.y\\
			\hline
			\rule{0cm}{25mm} & & & \\
			\hline
		\end{tabularx}
		\vspace{1cm}

		\textbf{3. Lesen}\\
		Hashtabelle:\\
		\begin{tabularx}{5cm}{|X|X|}
			\hline
			0 & 1\\
			\hline
			\rule{0pt}{2cm} & \\
			\hline
		\end{tabularx}
		
		\vspace{1cm}
		
		\textbf{4. Probing}\\

		Ergebnisrelation:\\
		\begin{tabularx}{10cm}{|X|X|X|X|}
			\hline
			S.x & S.y & R.x & R.y\\
			\hline
			\rule{0cm}{50mm} & & & \\
			\hline
		\end{tabularx}
		\vspace{1cm}

\end{document}
