Skip to content
← Catalog atlas / pg_index

SYSTEM CATALOG · System catalog

pg_index

The catalog pg_index contains part of the information about indexes. The rest is mostly in pg_class.

First seen PG 9.0Last seen PG 19Columns 21

Checked column by column against a PostgreSQL 18.6 instance · Raw measurement record ↗

Columns PostgreSQL 18

pg_index
COLUMNTYPEDESCRIPTION
indexrelid oidNOT NULL The OID of the pg_class entry for this indexReferences:pg_class.oid
indrelid oidNOT NULL The OID of the pg_class entry for the table this index is forReferences:pg_class.oid
indnatts smallintNOT NULLDocumented as:int2 The total number of columns in the index (duplicates pg_class.relnatts); this number includes both key and included attributes
indnkeyatts smallintNOT NULLDocumented as:int2 The number of key columns in the index, not counting any included columns, which are merely stored and do not participate in the index semantics
indisunique booleanNOT NULLDocumented as:bool If true, this is a unique index
indnullsnotdistinct booleanNOT NULLDocumented as:bool This value is only used for unique indexes. If false, this unique index will consider null values distinct (so the index can contain multiple null values in a column, the default PostgreSQL behavior). If it is true, it will consider null values to be equal (so the index can only contain one null value in a column).
indisprimary booleanNOT NULLDocumented as:bool If true, this index represents the primary key of the table (indisunique should always be true when this is true)
indisexclusion booleanNOT NULLDocumented as:bool If true, this index supports an exclusion constraint
indimmediate booleanNOT NULLDocumented as:bool If true, the uniqueness check is enforced immediately on insertion (irrelevant if indisunique is not true)
indisclustered booleanNOT NULLDocumented as:bool If true, the table was last clustered on this index
indisvalid booleanNOT NULLDocumented as:bool If true, the index is currently valid for queries. False means the index is possibly incomplete: it must still be modified by INSERT/UPDATE operations, but it cannot safely be used for queries. If it is unique, the uniqueness property is not guaranteed true either.
indcheckxmin booleanNOT NULLDocumented as:bool If true, queries must not use the index until the xmin of this pg_index row is below their TransactionXmin event horizon, because the table may contain broken HOT chains with incompatible rows that they can see
indisready booleanNOT NULLDocumented as:bool If true, the index is currently ready for inserts. False means the index must be ignored by INSERT/UPDATE operations.
indislive booleanNOT NULLDocumented as:bool If false, the index is in process of being dropped, and should be ignored for all purposes (including HOT-safety decisions)
indisreplident booleanNOT NULLDocumented as:bool If true this index has been chosen as “replica identity” using ALTER TABLE ... REPLICA IDENTITY USING INDEX ...
indkey int2vectorNOT NULL This is an array of indnatts values that indicate which table columns this index indexes. For example, a value of 1 3 would mean that the first and the third table columns make up the index entries. Key columns come before non-key (included) columns. A zero in this array indicates that the corresponding index attribute is an expression over the table columns, rather than a simple column reference.References:pg_attribute.attnum
indcollation oidvectorNOT NULL For each column in the index key (indnkeyatts values), this contains the OID of the collation to use for the index, or zero if the column is not of a collatable data type.References:pg_collation.oid
indclass oidvectorNOT NULL For each column in the index key (indnkeyatts values), this contains the OID of the operator class to use. See pg_opclass for details.References:pg_opclass.oid
indoption int2vectorNOT NULL This is an array of indnkeyatts values that store per-column flag bits. The meaning of the bits is defined by the index's access method.
indexprs pg_node_tree Expression trees (in nodeToString() representation) for index attributes that are not simple column references. This is a list with one element for each zero entry in indkey. Null if all index attributes are simple references.
indpred pg_node_tree Expression tree (in nodeToString() representation) for partial index predicate. Null if not a partial index.

Columns marked "implicit" are not included in SELECT *; some early statistics views are completed from same-version source, and the extra provenance is shown in the column description.

Common system columns 6

System attributes PostgreSQL provides, normally not expanded by SELECT *. Kept separately so they are not mixed in with ordinary columns.

ColumnsTypeattnum
tableoidoid-6
cmaxcid-5
xmaxxid-4
cmincid-3
xminxid-2
ctidtid-1

Column evolution matrix

Hover a cell for the column type
PresentAdded / type or attribute changeRemoved
COLUMN9.09.19.29.39.49.59.610111213141516171819
indexrelid
indrelid
indnatts
indisunique
indisprimary
indimmediate
indisclustered
indisvalid
indcheckxmin
indisready
indkey
indclass
indoption
indexprs
indpred
indisexclusion
indcollation
indislive
indisreplident
indnkeyatts
indnullsnotdistinct

9.0 is the coverage baseline; a column already present in the baseline is not marked as added. The matrix aligns columns by name, so a rename appears as the old column removed and a new column added.

Evolution timeline

Changes between adjacent majors

PostgreSQL 15 ← 14

+ indnullsnotdistinct1 column description updates

PostgreSQL 11 ← 10

+ indnkeyatts5 column description updates

PostgreSQL 10 ← 9.6

2 column description updates

PostgreSQL 9.4 ← 9.3

+ indisreplident

PostgreSQL 9.3 ← 9.2

+ indislive1 column description updates

PostgreSQL 9.2 ← 9.1

1 column description updates

PostgreSQL 9.1 ← 9.0

+ indisexclusion+ indcollation~ indexprs: text → pg_node_tree~ indpred: text → pg_node_tree1 column description updates

Compare any two versions

Pick two versions to see added, removed, and retyped columns. The interactive comparison needs JavaScript; the evolution timeline reads fine without it.