# pg_index The `pg_index` system catalog table contains part of the information about indexes. The rest is mostly in [pg_class_internal](./pg_class_internal.md). Table 1. `pg_catalog.pg_index` | column | type | references | description | | :--------------- | :--------- | :----------------------------- | :----------------------------------------------------------- | |`indexrelid`| oid| pg_class.oid| The OID of the pg_class entry for this index |`indrelid`| oid |pg_class.oid| The OID of the pg_class entry for the table this index is for |`indnatts`| smallint || The number of columns in the index (duplicates pg_class.relnatts) |`indnkeyatts`| smallint || The number of key columns in the index |`indisunique`| boolean ||If true, this is a unique index |`indisprimary`| boolean || If true, this index represents the primary key of the table. (`indisunique` should always be true when this is true.) |`indisexclusion`| boolean || If true, this index supports an exclusion constraint |`indimmediate`| boolean || If true, the uniqueness check is enforced immediately on insertion (irrelevant if `indisunique` is not true) |`indisclustered`| boolean || If true, the table was last clustered on this index via the `CLUSTER`s command |`indisvalid`| boolean ||If true, the index is currently valid for queries. False means the index is possibly incomplete: it must still be modified by `INSERT/UPDATE`s operations, but it cannot safely be used for queries. |`indcheckxmin`| boolean || 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`| boolean || If true, the index is currently ready for inserts. False means the index must be ignored by `INSERT/UPDATE` operations |`indislive`| boolean || If false, the index is in process of being dropped, and should be ignored for all purposes |`indisreplident`| boolean || If true this index has been chosen as "replica identity" using `ALTER TABLE ... REPLICA IDENTITY USING INDEX ...` |`indkey`| int2vector | pg_attribute.attnum| 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 key. A zero in this array indicates that the corresponding index attribute is an expression over the table columns, rather than a simple column reference. |`indcollation`| oidvector || For each column in the index key, this contains the OID of the collation to use for the index. |`indclass`| oidvector |pg_opclass.oid| For each column in the index key this contains the OID of the operator class to use |`indoption`| int2vector || This is an array of `indnatts` 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.