From ebc5d0bb5e4b5c63d976abd5370ad26247d2e04d Mon Sep 17 00:00:00 2001 From: Janis Hutz Date: Tue, 7 Jul 2026 16:37:09 +0200 Subject: [PATCH] [DMDB] Hashing --- .../dmdb/data-modelling-databases-summary.pdf | Bin 1050398 -> 1055897 bytes .../{00_b-trees => 01_b-trees}/00_b-trees.tex | 1 - .../{00_b-trees => 01_b-trees}/01_basics.tex | 0 .../02_operations.tex | 0 .../03_optimizations.tex | 0 .../{00_b-trees => 01_b-trees}/04_uses.tex | 0 .../02_indexing/02_hashing/00_hash-tables.tex | 54 ++++++++++++++++++ .../02_hashing/01_linear-hashing.tex | 11 ++++ .../02_indexing/02_hashing/02_in-postgres.tex | 17 ++++++ semester4/dmdb/parts/03_systems/main.tex | 18 ++++-- 10 files changed, 95 insertions(+), 6 deletions(-) rename semester4/dmdb/parts/03_systems/02_indexing/{00_b-trees => 01_b-trees}/00_b-trees.tex (92%) rename semester4/dmdb/parts/03_systems/02_indexing/{00_b-trees => 01_b-trees}/01_basics.tex (100%) rename semester4/dmdb/parts/03_systems/02_indexing/{00_b-trees => 01_b-trees}/02_operations.tex (100%) rename semester4/dmdb/parts/03_systems/02_indexing/{00_b-trees => 01_b-trees}/03_optimizations.tex (100%) rename semester4/dmdb/parts/03_systems/02_indexing/{00_b-trees => 01_b-trees}/04_uses.tex (100%) create mode 100644 semester4/dmdb/parts/03_systems/02_indexing/02_hashing/00_hash-tables.tex create mode 100644 semester4/dmdb/parts/03_systems/02_indexing/02_hashing/01_linear-hashing.tex create mode 100644 semester4/dmdb/parts/03_systems/02_indexing/02_hashing/02_in-postgres.tex diff --git a/semester4/dmdb/data-modelling-databases-summary.pdf b/semester4/dmdb/data-modelling-databases-summary.pdf index ac2a302275745359ef3975679305f0a5c367c164..c505a37175b6858eb1bef581f08fb1761638dbe0 100644 GIT binary patch delta 36391 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�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
)n)4PV}i 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 delta 30865 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 aU7unzTuCv>(Rlbdxp-0N=w#GnQT`W^+HXey diff --git a/semester4/dmdb/parts/03_systems/02_indexing/00_b-trees/00_b-trees.tex b/semester4/dmdb/parts/03_systems/02_indexing/01_b-trees/00_b-trees.tex similarity index 92% rename from semester4/dmdb/parts/03_systems/02_indexing/00_b-trees/00_b-trees.tex rename to semester4/dmdb/parts/03_systems/02_indexing/01_b-trees/00_b-trees.tex index 2e6bf68..fba8803 100644 --- a/semester4/dmdb/parts/03_systems/02_indexing/00_b-trees/00_b-trees.tex +++ b/semester4/dmdb/parts/03_systems/02_indexing/01_b-trees/00_b-trees.tex @@ -1,4 +1,3 @@ -\subsubsection{B+ Trees} \paragraph{B-Tree} In B-Trees of order $k$, each node (except the root) has between $k \div 2$ and $k$ child nodes. The root node has at least two children, unless it is also a leaf and any non-leaf node contains at exactly $k - 1$ keys. diff --git a/semester4/dmdb/parts/03_systems/02_indexing/00_b-trees/01_basics.tex b/semester4/dmdb/parts/03_systems/02_indexing/01_b-trees/01_basics.tex similarity index 100% rename from semester4/dmdb/parts/03_systems/02_indexing/00_b-trees/01_basics.tex rename to semester4/dmdb/parts/03_systems/02_indexing/01_b-trees/01_basics.tex diff --git a/semester4/dmdb/parts/03_systems/02_indexing/00_b-trees/02_operations.tex b/semester4/dmdb/parts/03_systems/02_indexing/01_b-trees/02_operations.tex similarity index 100% rename from semester4/dmdb/parts/03_systems/02_indexing/00_b-trees/02_operations.tex rename to semester4/dmdb/parts/03_systems/02_indexing/01_b-trees/02_operations.tex diff --git a/semester4/dmdb/parts/03_systems/02_indexing/00_b-trees/03_optimizations.tex b/semester4/dmdb/parts/03_systems/02_indexing/01_b-trees/03_optimizations.tex similarity index 100% rename from semester4/dmdb/parts/03_systems/02_indexing/00_b-trees/03_optimizations.tex rename to semester4/dmdb/parts/03_systems/02_indexing/01_b-trees/03_optimizations.tex diff --git a/semester4/dmdb/parts/03_systems/02_indexing/00_b-trees/04_uses.tex b/semester4/dmdb/parts/03_systems/02_indexing/01_b-trees/04_uses.tex similarity index 100% rename from semester4/dmdb/parts/03_systems/02_indexing/00_b-trees/04_uses.tex rename to semester4/dmdb/parts/03_systems/02_indexing/01_b-trees/04_uses.tex diff --git a/semester4/dmdb/parts/03_systems/02_indexing/02_hashing/00_hash-tables.tex b/semester4/dmdb/parts/03_systems/02_indexing/02_hashing/00_hash-tables.tex new file mode 100644 index 0000000..3e95e98 --- /dev/null +++ b/semester4/dmdb/parts/03_systems/02_indexing/02_hashing/00_hash-tables.tex @@ -0,0 +1,54 @@ +\paragraph{Hashing in Databases} +Hashing is a very common operation in many systems, including databases. +Many internal data structures, such as buffer caches and lock tables, are implemented as hash tables. +Some operators also use hashing to speed things up, such as hash join and group by operators. + +It can also be used as an indexing and partitioning strategy. + +Hashing is on the other side compared to B+ trees when it comes to the trade-off between storage and compute, +by using more compute, it can save on storage space requirements. + + +\paragraph{Hash Tables} +There are many hashing functions with strong properties, but in databases, the hash function has to be very cheap, as it is used very often. + +Perfect hash functions do exist, but they need a hash table that is as big as the cardinality of the attributes, +so for 4 byte keys, it needs a 4 GB table. +Thus, to save on storage, we use a hash table that is smaller than that. +If we were to choose it too small, there would be too many collisions, if it is chosen too large, then we waste lots of space. + +Collisions may also occur when the index key is not \texttt{UNIQUE}, and thus it could be that multiple tuples have the same key. + +That may lead you to think, why not grow it if we have a collision. That is a valid idea, but growing hash tables is expensive, thus should be avoided. + +Another shortcoming of hash indexes is that it only supports \bi{point queries}, i.e. it only works for the primary key, but barely anything else. + + +\paragraph{Collisions} +A way to handle collisions safely is to use \bi{chaining}. When a collision occurs, we add another entry in a linked list. +If these lists are reasonably short, then it is reasonably efficient. We can also already reserve space for the linked lists to speed things up, +if we expect (many) collisions to occur. + +Another option is to use \bi{open addressing}. Here, when a collision occurs, we look for an empty slot in the hash table using some rule. +Here, two ways of achieving this are covered in the course: +\begin{itemize} + \item \bi{Linear probing}, where we go to the next slot(s) and place the attribute there + \item \bi{Cuckoo hashing}, where we use several hash functions and move to the next one, if we have a collision with the first, and so on +\end{itemize} + + +\paragraph{Extensible Hashing} +When the hash table is full, in a basic system, we would need to create a new, larger hash table with more buckets (typically double the number) and then rehash all existing items. +This of course is very expensive both computationally and in terms of memory accesses, as we do lots of random accesses, which leads to cache misses. + +This is where extensible comes in. It is based on sharing buckets and unsharing them when needed. +These hash table buckets are mapped into blocks and initially several buckets share the same block + +Then, when a bucket gets full, we split the bucket and move entries as needed into a new bucket. + +In \bi{local sharing}, the size of a table can be doubled without immediately adding more space, allowing for more splitting. +We simply increase the number of buckets and the degree of sharing and split the buckets as they become full. + +Again, if we initially provide more space than needed, we can allow for the first growth to happen without disruption. + +We want (ideally) to have two page lookups to access an item, so we typically have a lookup in the bucket directory and the data block and they both can grow independently. diff --git a/semester4/dmdb/parts/03_systems/02_indexing/02_hashing/01_linear-hashing.tex b/semester4/dmdb/parts/03_systems/02_indexing/02_hashing/01_linear-hashing.tex new file mode 100644 index 0000000..c9b6472 --- /dev/null +++ b/semester4/dmdb/parts/03_systems/02_indexing/02_hashing/01_linear-hashing.tex @@ -0,0 +1,11 @@ +\paragraph{Linear hashing} +Here, a split pointer is used to indicate which bucket will be split in case of overflow. +When it occurs, we chain the block that overflows, split the bucket indicated by the pointer and move the pointer. + +This allows for a gradual increase in the size of the table and the idea is to gradually redistribute the data. +We always split on the pointer, even if the overflow is elsewhere. The pointer will eventually reach a bucket with chains +and when the bucket is split, the data is reorganized. + +This has the advantage that the directory (i.e. the list of buckets) grows page by page, instead of doubling. + +When all buckets have been split, start fresh. diff --git a/semester4/dmdb/parts/03_systems/02_indexing/02_hashing/02_in-postgres.tex b/semester4/dmdb/parts/03_systems/02_indexing/02_hashing/02_in-postgres.tex new file mode 100644 index 0000000..8142564 --- /dev/null +++ b/semester4/dmdb/parts/03_systems/02_indexing/02_hashing/02_in-postgres.tex @@ -0,0 +1,17 @@ +\paragraph{In Postgres} +PostgreSQL uses a variation of linear (overflow) hashing and extensible hashing (with doubling). +Buckets are initially allocated in groups with powers of two. Overflows are captured in overflow pages (like in linear hashing). +When a split occurs, we do not allocate all the pages, but a fraction of them. + +These ideas can be combined in many different ways. + +\paragraph{When to use} +For memory structures: +\begin{itemize} + \item For shared resources (System Global Area) + \item Database Buffer Cache for I/O + \item Redo log buffer for recovery + \item For large memory pools +\end{itemize} + +Then of course, it can be used for a hash join, for the \texttt{SELECT DISTINCT} function and for aggregation (\texttt{GROUP BY}). diff --git a/semester4/dmdb/parts/03_systems/main.tex b/semester4/dmdb/parts/03_systems/main.tex index 47d2556..96026e3 100644 --- a/semester4/dmdb/parts/03_systems/main.tex +++ b/semester4/dmdb/parts/03_systems/main.tex @@ -22,10 +22,18 @@ \newpage \subsection{Indexing} \input{parts/03_systems/02_indexing/00_access-methods.tex} -\input{parts/03_systems/02_indexing/00_b-trees/00_b-trees.tex} -\input{parts/03_systems/02_indexing/00_b-trees/01_basics.tex} -\input{parts/03_systems/02_indexing/00_b-trees/02_operations.tex} -\input{parts/03_systems/02_indexing/00_b-trees/03_optimizations.tex} -% \input{parts/03_systems/02_indexing/00_b-trees/} + +\subsubsection{B+ Trees} +\input{parts/03_systems/02_indexing/01_b-trees/00_b-trees.tex} +\input{parts/03_systems/02_indexing/01_b-trees/01_basics.tex} +\input{parts/03_systems/02_indexing/01_b-trees/02_operations.tex} +\input{parts/03_systems/02_indexing/01_b-trees/03_optimizations.tex} +% \input{parts/03_systems/02_indexing/01_b-trees/} + +\subsubsection{Hashing} +\input{parts/03_systems/02_indexing/02_hashing/00_hash-tables.tex} +\input{parts/03_systems/02_indexing/02_hashing/01_linear-hashing.tex} +\input{parts/03_systems/02_indexing/02_hashing/02_in-postgres.tex} +% \input{parts/03_systems/02_indexing/02_hashing/} % \input{parts/03_systems/02_indexing/} % \input{parts/03_systems/}