Como instalar e usar a extensão HypoPG no PostgreSQL para criar índices hipotéticos

Armando Couto 🇧🇷
programming to live
5 min readApr 27, 2022
Evening_tao no Freepik

Como você chegou a este texto, provavelmente já sabe que o PostgreSQL é um dos gerenciadores de bancos de dados mais utilizados. Isso se deve muito provavelmente ao fato de ser muito confiável para criar e manter bases de dados muito densas e complexas.

Sendo assim, precisamos conhecer o maior número possível de ferramentas e extensões que, aliados ao uso do PostgreSQL, podem facilitar nossa vida.

A extensão que trouxe hoje é a HypoPG, que com certeza vai ajudar você em projetos com grande volume de informações.

Ao usar essa extensão, você pode criar índices hipotéticos que permitem fazer uma espécie de “simulação” sem tomar espaço da sua máquina. Muito útil, não?

Foi pensando nisso, que escrevi este artigo. Aqui você vai ler um pouco mais sobre essa extensão do HypoPG, além de conferir um passo a passo de instalação, atualização e uso do HypoPG para criar índices hipotéticos.

HypoPG e índices hipotéticos

HypoPG é uma extensão do PostgreSQL que dá suporte para criar índices hipotéticos.

Um índice hipotético é um índice que, na verdade, não existe. Logo, não usa espaço da CPU, do disco nem precisa de outro recurso para ser criado.

O índice hipotético leva esse nome justamente por se tratar de uma “hipótese”, digamos assim. Serve para saber se índices específicos podem aumentar o desempenho de consultas problemáticas. Assim, você pode saber se o PostgreSQL usará esses índices ou não sem ter que gastar recursos para criá-los.

Você pode ler mais sobre o Hypo acessando a documentação oficial.

captura de tela do postgresql hypo ph instalação e índices hipotéticos

Agora que você já sabe o que é o HypoPG, vamos ao tutorial! Nele, você encontrará os tópicos abaixo:

  • Instalando o HypoPG
  • Atualizando a extensão
  • Criando índices hipotéticos com o HypoPG

Caso já tenha feito a instalação, fique à vontade para pular para o último tópico.

Antes de começar, confira se o seu PostgreSQL é a versão 9.2 ou versões acima dessa. Assim, evitamos que haja erro de compatibilidade.

Você também precisará dos header files do PostgreSQL para realizar a instalação.

Dito isso, vamos lá!

1 — Instalando o HypoPG

Primeiro, baixe o código fonte do HypoPG. Você pode baixá-lo clicando aqui ou pode digitar o código abaixo no seu terminal.

wget https://github.com/HypoPG/hypopg/archive/master.zip

Extraia o arquivo .zip e abra o terminal no diretório em que se encontra o arquivo descompactado.

Começaremos, então, a compilação e instalação do HypoPG.

No seu terminal digite:

make
sudo make install

Feito! O HypoPG já está instalado. Agora você pode acessá-lo em todos os bancos de dados em que for precisar dele, basta usar o comando a seguir:

CREATE EXTENSION hypopg;

2 — Atualizando a extensão

Observe que o HypoPG não fornece scripts de atualização de extensão, pois não há dados salvos em nenhum dos objetos criados. Portanto, você precisa primeiro descartar a extensão e criá-la novamente para obter a nova versão.

3 — Criando índices hipotéticos com o HypoPG

Inicialmente, vale lembrar que os índices hipotéticos estão contidos em um único back-end.

Isso quer dizer que se você adicionar vários índices hipotéticos, suas conexões simultâneas em explain’ não serão afetadas pelos seus índices hipotéticos.

Caso você não esteja familiarizado, o explain’ é usado para exibir os detalhes do plano de execução do planejador do PostgreSQL, isto é, para saber que rota o banco de dados vai seguir para executar uma consulta.

Vejamos o caso teste simples abaixo:

rjuju=# CREATE TABLE hypo AS SELECT id, 'line ' || id AS val FROM generate_series(1,10000) id;
rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
-------------------------------------------------------
Seq Scan on hypo (cost=0.00..180.00 rows=1 width=13)
Filter: (id = 1)
(2 rows)

O jeito mais tranquilo de criar um índice hipotético é usar as funções hypopg_create_index com um ‘create index’ normal como argumento.

Confira o exemplo:

rjuju=# SELECT * FROM hypopg_create_index('CREATE INDEX ON hypo (id)');

Algumas informações do ‘create index’ serão ignoradas, assim como o nome do índice, se houver um nome. Algumas das informações ignoradas serão corrigidas em uma futura versão da extensão.

Tudo feito, é chegada a hora de checar se o índice hipotético que criamos está disponível para uso.

Coloque o comando a seguir no seu terminal:

rjuju=# SELECT * FROM hypopg_list_indexes ;
indexrelid | indexname | nspname | relname | amname
-----------+-------------------------------------------+---------+---------+--------
205101 | <41072>btree_hypo_id | public | hypo | btree

Se precisar de mais informações técnicas sobre o índice hipotético, a função hypopg() vai retornar o índice hipotético de um jeito parecido a um catálogo do sistema pg_index.

Agora veremos se o comando ‘explain’ usaria tal índice:

rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
------------------------------------------------------------------------------------
Index Scan using <41072>hypo_btree_hypo_id on hypo (cost=0.29..8.30 rows=1 width=13)
Index Cond: (id = 1)
(2 rows)

Atenção! Só os comandos ‘explain’ sem a opção ‘analyse’ utilizarão os índices hipotéticos. Isso porque o ‘analyse’ faz o ‘explain’ ser realmente executado, e não apenas planejado.

rjuju=# EXPLAIN ANALYZE SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
-------------------------------------------------------------------------------------------------
Seq Scan on hypo (cost=0.00..180.00 rows=1 width=13) (actual time=0.036..6.072 rows=1 loops=1)
Filter: (id = 1)
Rows Removed by Filter: 9999
Planning time: 0.109 ms
Execution time: 6.113 ms
(5 rows)

Para remover os índices hipotéticos do seu back-end, você pode primeiro listar todos os índices com a função identificadora de objetos: hypopg_list_indexes. Depois de selecionado o índice desejado, pode removê-lo com o comando hypopg_drop_index(indexrelid).

Você pode, ainda, usar a função hypopg_reset() para remover todos de uma vez, ou só fechar sua conexão atual.

Conclusão

Como já vimos, os índices hipotéticos são muito úteis porque são hipotéticos. Um pouco redundante, eu sei, mas de fato essa é sua utilidade. Eles não usam espaço do disco porque são virtuais e, por isso, você pode aferir se os índices específicos vão gerar algum problema.

Você leu a respeito da função do HypoPG nos bancos de dados e conseguiu seguir um tutorial para criar índices hipotéticos no seu terminal. Além disso, se familiarizou com códigos específicos dessa extensão que certamente vão ajudar em projetos muito complexos.

Bem, se você chegou até aqui espero que tenha sanado suas dúvidas. Ah, não esqueça de avaliar este texto nas palminhas. Até mais!

--

--