mirror of
https://github.com/postgres/postgres.git
synced 2025-08-18 12:22:09 +03:00
Indexes with INCLUDE columns and their support in B-tree
This patch introduces INCLUDE clause to index definition. This clause specifies a list of columns which will be included as a non-key part in the index. The INCLUDE columns exist solely to allow more queries to benefit from index-only scans. Also, such columns don't need to have appropriate operator classes. Expressions are not supported as INCLUDE columns since they cannot be used in index-only scans. Index access methods supporting INCLUDE are indicated by amcaninclude flag in IndexAmRoutine. For now, only B-tree indexes support INCLUDE clause. In B-tree indexes INCLUDE columns are truncated from pivot index tuples (tuples located in non-leaf pages and high keys). Therefore, B-tree indexes now might have variable number of attributes. This patch also provides generic facility to support that: pivot tuples contain number of their attributes in t_tid.ip_posid. Free 13th bit of t_info is used for indicating that. This facility will simplify further support of index suffix truncation. The changes of above are backward-compatible, pg_upgrade doesn't need special handling of B-tree indexes for that. Bump catalog version Author: Anastasia Lubennikova with contribition by Alexander Korotkov and me Reviewed by: Peter Geoghegan, Tomas Vondra, Antonin Houska, Jeff Janes, David Rowley, Alexander Korotkov Discussion: https://www.postgresql.org/message-id/flat/56168952.4010101@postgrespro.ru
This commit is contained in:
@@ -23,6 +23,7 @@ PostgreSQL documentation
|
||||
<synopsis>
|
||||
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] <replaceable class="parameter">name</replaceable> ] ON [ ONLY ] <replaceable class="parameter">table_name</replaceable> [ USING <replaceable class="parameter">method</replaceable> ]
|
||||
( { <replaceable class="parameter">column_name</replaceable> | ( <replaceable class="parameter">expression</replaceable> ) } [ COLLATE <replaceable class="parameter">collation</replaceable> ] [ <replaceable class="parameter">opclass</replaceable> ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )
|
||||
[ INCLUDE ( <replaceable class="parameter">column_name</replaceable> [, ...] ) ]
|
||||
[ WITH ( <replaceable class="parameter">storage_parameter</replaceable> = <replaceable class="parameter">value</replaceable> [, ... ] ) ]
|
||||
[ TABLESPACE <replaceable class="parameter">tablespace_name</replaceable> ]
|
||||
[ WHERE <replaceable class="parameter">predicate</replaceable> ]
|
||||
@@ -143,6 +144,56 @@ CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] <replaceable class=
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><literal>INCLUDE</literal></term>
|
||||
<listitem>
|
||||
<para>
|
||||
The optional <literal>INCLUDE</literal> clause specifies a
|
||||
list of columns which will be included as a non-key part in the index.
|
||||
Columns listed in this clause cannot also be present as index key columns.
|
||||
The <literal>INCLUDE</literal> columns exist solely to
|
||||
allow more queries to benefit from <firstterm>index-only scans</firstterm>
|
||||
by including the values of the specified columns in the index. These values
|
||||
would otherwise have to be obtained by reading the table's heap.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
In <literal>UNIQUE</literal> indexes, uniqueness is only enforced
|
||||
for key columns. Columns listed in the <literal>INCLUDE</literal>
|
||||
clause have no effect on uniqueness enforcement. Other constraints
|
||||
(<literal>PRIMARY KEY</literal> and <literal>EXCLUDE</literal>) work
|
||||
the same way.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Columns listed in the <literal>INCLUDE</literal> clause don't need
|
||||
appropriate operator classes; the clause can contain non-key index
|
||||
columns whose data types don't have operator classes defined for
|
||||
a given access method.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Expressions are not supported as included columns since they cannot be
|
||||
used in index-only scans.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Currently, only the B-tree index access method supports this feature.
|
||||
In B-tree indexes, the values of columns listed in the
|
||||
<literal>INCLUDE</literal> clause are included in leaf tuples which
|
||||
are linked to the heap tuples, but are not included into pivot tuples
|
||||
used for tree navigation. Therefore, moving columns from the list of
|
||||
key columns to the <literal>INCLUDE</literal> clause can slightly
|
||||
reduce index size and improve the tree branching factor.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Indexes with columns listed in the <literal>INCLUDE</literal> clause
|
||||
are also called <quote>covering indexes</quote>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><replaceable class="parameter">name</replaceable></term>
|
||||
<listitem>
|
||||
@@ -729,13 +780,22 @@ Indexes:
|
||||
<title>Examples</title>
|
||||
|
||||
<para>
|
||||
To create a B-tree index on the column <literal>title</literal> in
|
||||
To create a unique B-tree index on the column <literal>title</literal> in
|
||||
the table <literal>films</literal>:
|
||||
<programlisting>
|
||||
CREATE UNIQUE INDEX title_idx ON films (title);
|
||||
</programlisting>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
To create a unique B-tree index on the column <literal>title</literal>
|
||||
and included columns <literal>director</literal> and <literal>rating</literal>
|
||||
in the table <literal>films</literal>:
|
||||
<programlisting>
|
||||
CREATE UNIQUE INDEX title_idx ON films (title) INCLUDE (director, rating);
|
||||
</programlisting>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
To create an index on the expression <literal>lower(title)</literal>,
|
||||
allowing efficient case-insensitive searches:
|
||||
|
Reference in New Issue
Block a user