Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes15kdownloads
hash-intro.html77 linesDownload Raw Back to html
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>72.1. Overview</title><link rel="stylesheet" type="text/css" href="stylesheet.css" /><link rev="made" href="pgsql-docs@lists.postgresql.org" /><meta name="generator" content="DocBook XSL Stylesheets Vsnapshot" /><link rel="prev" href="hash-index.html" title="Chapter 72. Hash Indexes" /><link rel="next" href="hash-implementation.html" title="72.2. Implementation" /></head><body id="docContent" class="container-fluid col-10"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="5" align="center">72.1. Overview</th></tr><tr><td width="10%" align="left"><a accesskey="p" href="hash-index.html" title="Chapter 72. Hash Indexes">Prev</a> </td><td width="10%" align="left"><a accesskey="u" href="hash-index.html" title="Chapter 72. Hash Indexes">Up</a></td><th width="60%" align="center">Chapter 72. Hash Indexes</th><td width="10%" align="right"><a accesskey="h" href="index.html" title="PostgreSQL 16.3 Documentation">Home</a></td><td width="10%" align="right"> <a accesskey="n" href="hash-implementation.html" title="72.2. Implementation">Next</a></td></tr></table><hr /></div><div class="sect1" id="HASH-INTRO"><div class="titlepage"><div><div><h2 class="title" style="clear: both">72.1. Overview <a href="#HASH-INTRO" class="id_link">#</a></h2></div></div></div><p>3  <span class="productname">PostgreSQL</span>4  includes an implementation of persistent on-disk hash indexes,5  which are fully crash recoverable. Any data type can be indexed by a6  hash index, including data types that do not have a well-defined linear7  ordering. Hash indexes store only the hash value of the data being8  indexed, thus there are no restrictions on the size of the data column9  being indexed.10 </p><p>11  Hash indexes support only single-column indexes and do not allow12  uniqueness checking.13 </p><p>14  Hash indexes support only the <code class="literal">=</code> operator,15  so WHERE clauses that specify range operations will not be able to take16  advantage of hash indexes.17 </p><p>18  Each hash index tuple stores just the 4-byte hash value, not the actual19  column value. As a result, hash indexes may be much smaller than B-trees20  when indexing longer data items such as UUIDs, URLs, etc. The absence of21  the column value also makes all hash index scans lossy. Hash indexes may22  take part in bitmap index scans and backward scans.23 </p><p>24  Hash indexes are best optimized for SELECT and UPDATE-heavy workloads25  that use equality scans on larger tables. In a B-tree index, searches must26  descend through the tree until the leaf page is found. In tables with27  millions of rows, this descent can increase access time to data. The28  equivalent of a leaf page in a hash index is referred to as a bucket page. In29  contrast, a hash index allows accessing the bucket pages directly,30  thereby potentially reducing index access time in larger tables. This31  reduction in "logical I/O" becomes even more pronounced on indexes/data32  larger than shared_buffers/RAM.33 </p><p>34  Hash indexes have been designed to cope with uneven distributions of35  hash values. Direct access to the bucket pages works well if the hash36  values are evenly distributed. When inserts mean that the bucket page37  becomes full, additional overflow pages are chained to that specific38  bucket page, locally expanding the storage for index tuples that match39  that hash value. When scanning a hash bucket during queries, we need to40  scan through all of the overflow pages. Thus an unbalanced hash index41  might actually be worse than a B-tree in terms of number of block42  accesses required, for some data.43 </p><p>44  As a result of the overflow cases, we can say that hash indexes are45  most suitable for unique, nearly unique data or data with a low number46  of rows per hash bucket.47  One possible way to avoid problems is to exclude highly non-unique48  values from the index using a partial index condition, but this may49  not be suitable in many cases.50 </p><p>51  Like B-Trees, hash indexes perform simple index tuple deletion. This52  is a deferred maintenance operation that deletes index tuples that are53  known to be safe to delete (those whose item identifier's LP_DEAD bit54  is already set). If an insert finds no space is available on a page we55  try to avoid creating a new overflow page by attempting to remove dead56  index tuples. Removal cannot occur if the page is pinned at that time.57  Deletion of dead index pointers also occurs during VACUUM.58 </p><p>59  If it can, VACUUM will also try to squeeze the index tuples onto as60  few overflow pages as possible, minimizing the overflow chain. If an61  overflow page becomes empty, overflow pages can be recycled for reuse62  in other buckets, though we never return them to the operating system.63  There is currently no provision to shrink a hash index, other than by64  rebuilding it with REINDEX.65  There is no provision for reducing the number of buckets, either.66 </p><p>67  Hash indexes may expand the number of bucket pages as the number of68  rows indexed grows. The hash key-to-bucket-number mapping is chosen so that69  the index can be incrementally expanded. When a new bucket is to be added to70  the index, exactly one existing bucket will need to be "split", with some of71  its tuples being transferred to the new bucket according to the updated72  key-to-bucket-number mapping.73 </p><p>74  The expansion occurs in the foreground, which could increase execution75  time for user inserts. Thus, hash indexes may not be suitable for tables76  with rapidly increasing number of rows.77 </p></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="hash-index.html" title="Chapter 72. Hash Indexes">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="hash-index.html" title="Chapter 72. Hash Indexes">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="hash-implementation.html" title="72.2. Implementation">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 72. Hash Indexes </td><td width="20%" align="center"><a accesskey="h" href="index.html" title="PostgreSQL 16.3 Documentation">Home</a></td><td width="40%" align="right" valign="top"> 72.2. Implementation</td></tr></table></div></body></html>
codekingpro/portable-devtools · Team Ai