Como listar os índices de uma tabela do Postgres? [2 maneiras]

Nesse artigo você irá aprender a listar os indices de uma tabela do Postgres usando consulta ou o psql

Como listar os índices de uma tabela do Postgres? [2 maneiras]
🟢
Nível: Básico
Pré-requisitos: Conhecimentos básicos de linha de Banco de dados e Postgres.
TL;DR ↪ Se você precisar apenas dos comandos, clique aqui para rolar a página direto para o resumo TL;DR!

📖 Índice

Listar e exibir os índices de uma tabela no Postgres não é tão direta como em outros bancos de dados. Mas é simples de certa maneira.

O Postgres fornece uma view padrão chamada pq_indexes que retorna as informações de índices de todas as tabelas do banco.

Essa view padrão pq_indexes retorna 5 campos:

  • schemaname: Retorna o nome do schema que contem a tabela. Em geral, se você usar tudo padrão será "public" ou "pg_catalog";
  • tablename: Retorna o nome da tabela que contem o índice;
  • indexname: Retorna o nome do índice;
  • tablespace: Retorna o nome do tablespace se você utilizar, senão null;
  • indexdef: Retorna a definição do índice. Efetivamente o comando CREATE INDEX.

Como listar os índices de uma tabela no Postgres com um SELECT?

Para listar os índices de uma determinada tabela no Postgres você pode executar a seguinte consulta na view pg_indexes. Usando como exemplo a tabela "users".

SELECT * FROM pg_indexes WHERE tablename = 'nome_tabela'

/* Output */
schemaname	| tablename	    | indexname	             | tablespace	    | indexdef
------------+---------------+------------------------+------------------+------------------------------------------------------------------------------------
public	      users 	      users_email_unique	   null               CREATE UNIQUE INDEX users_email_unique ON public.users USING btree (email)
public	      users	          users_pkey		       null               CREATE UNIQUE INDEX users_pkey ON public.users USING btree (id)

Observe que a view retorna os comandos de CREATE INDEX, já prontinhos 🙂

CREATE UNIQUE INDEX users_email_unique ON public.users USING btree (email)
CREATE UNIQUE INDEX users_pkey ON public.users USING btree (id)

Como listar os índices de uma tabela no Postgres usando o psql?

Outra maneira simples de listar os índices de uma tabela no Postgres é psql (já falamos sobre ele aqui).

O primeiro passo é abrir o psql e conectar no seu servidor. Em seguida, você pode executar um  \l  para listar todos os bancos. Em seguida, execute um  \c nome_do_banco  para conectar no banco que deseja ver os índices.

/* Listar os bancos */

\l

/* Output */
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 200ok     | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres postgres=CTc/postgres
(4 rows)


/* Conectar em um banco Postgres */

\c 200ok

/* Output */
You are now connected to database "200ok" as user "postgres".


/* Listar todas as tabelas do banco Postgres */
\dt

/* Output */

         List of relations
 Schema | Name  | Type  |  Owner   
--------+-------+-------+----------
 public | users | table | postgres
(1 row)

Por fim, execute um  \d nome_tabela  para listar os detalhes de uma tabela do banco, incluindo os índices.

/* Detalhes de uma tabela do Postgres, incluindo os indices */
\d nome_tabela

/* Output */
                                Table "public.users"
      Column       |              Type              | Collation | Nullable | Default 
-------------------+--------------------------------+-----------+----------+---------
 id                | bigint                         |           | not null | 
 name              | character varying(255)         |           | not null | 
 email             | character varying(255)         |           | not null | 
 email_verified_at | timestamp(0) without time zone |           |          | 
 password          | character varying(255)         |           | not null | 
 remember_token    | character varying(100)         |           |          | 
 created_at        | timestamp(0) without time zone |           |          | 
 updated_at        | timestamp(0) without time zone |           |          | 
 nickname          | character varying(255)         |           |          | 
 cpf               | character varying(255)         |           |          | 
 profile_image     | character varying(255)         |           |          | 
 cover_image       | character varying(255)         |           |          | 
 whatsapp          | character varying(255)         |           |          | 
 twitter           | character varying(255)         |           |          | 
 youtube           | character varying(255)         |           |          | 
 discord           | character varying(255)         |           |          | 
 instagram         | character varying(255)         |           |          | 
 twitch            | character varying(255)         |           |          | 
 linkedin          | character varying(255)         |           |          | 
 spotify           | character varying(255)         |           |          | 
 steam             | character varying(255)         |           |          | 
 tumblr            | character varying(255)         |           |          | 
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)
    "users_email_unique" UNIQUE CONSTRAINT, btree (email)

Observe que a listagem de índices vem no final:

Indexes:
    "users_pkey" PRIMARY KEY, btree (id)
    "users_email_unique" UNIQUE CONSTRAINT, btree (email)

TL;DR | Resumo

# Usando consultas 
SELECT * FROM pg_indexes WHERE tablename = 'nome_tabela'

# Usando psql
\d nome_tabela

Espero que essa dica tenha sido útil, valeu!