PostgreSQL – Índices das tabelas. Está faltando algum?

PostgreSQL – Índices das tabelas. Está faltando algum?

Essa dica vai principalmente para os DBAs. O PostgreSQL tem uma consulta muito interessante que nos ajuda a melhorar o desempenho do banco de dados.


Essa query mostra quais consultas estão ou não usando os índices da tabela. Com isso, poderemos identificar alguma tabela que precisa de um índice para melhorar seu desempenho nas consultas.
Veja a query abaixo.

 

SELECT * from pg_stat_user_tables
ORDER BY relname;

 

Vamos as definições das colunas.
relid é o id do objeto no banco de dados. Cada tabela, índice, função, etc tem seu id.
schemaname é o nome do esquema do banco de dados. Tem DBAs que gostam de dividir as tabelas em esquemas como financeiro, patrimonio, rh, etc.
relname é o nome da tabela.
seq_scan é a quantidade de consultas que foram feitas na tabela que não utilizaram índices.
seq_tup_read é a quantidade de registros retornadas por essas consultas.
idx_scan mostra a quantidade de consultas que foram realizadas que utilizaram os índices da tabela.
idx_tup_fetch é a quantidade de registros retornadas pelas pesquisas realizadas por índices.
n_tup_ins é a quantidade de registros inseridos na tabela.
n_tup_upd é a quantidade de registros que sofreram alterações (update) na tabela.
n_tup_del é a quantidade de registros que foram excluídas da tabela.

Bom, no geral a regra é a seguinte, se você tem uma tabela que tem muitos registros (mais de 1000) e tem muitas consultas sem índices (seq_tup_read), então isso pode ser um problema. Essa tabela pode estar precisando de um índice para que as consultas passem a ser feitas utilizando-as e retornando registros mais rapidamente. Um outro ponto importante é que campos nulos não fazem parte de índices, ou seja, se você fizer uma consulta com uma cláusula where onde uma determinada coluna seja nula, então essa consulta não usará índice, aumentando essa estatística. O ideal nesse caso é você utilizar de um valor neutro, como 0 (zero) ou -1.
Se você encontrar esse tipo de situação em uma tabela, analise-a com calma e veja as possibilidade de consultas utilizando JOIN e WHERE com essa tabela. Crie índices e sempre que puder opte por campos do tipo INTEGER. Isso aumenta o desempenho e passa a ser melhor notado conforme o banco vai crescendo.

Se você não fez essa consulta ainda, faça um teste e verifique suas tabelas. Muitas vezes temos surpresas achando que todas as tabelas estão com os índices necessários.

About the Author

Casado, pai de família, autodidata e amante de tecnologia. Especialista em PHP, MySQL e PostgreSQL, certificado em RedHat e formando em Gestão de TI.

Deixar um comentário

Seu endereço de email não será publicado.