HypopG é uma extensão pós -gresql que adiciona suporte para índices hipotéticos.
Um índice hipotético - ou virtual - é um índice que realmente não existe e, portanto, não custa CPU, disco ou qualquer recurso para criar. Eles são úteis para saber se os índices específicos podem aumentar o desempenho para consultas problemáticas, pois você pode saber se o PostgreSQL usará esses índices ou não sem precisar gastar recursos para criá -los.
Para informações mais completas, consulte a documentação oficial.
Para outras informações gerais, você também pode consultar esta postagem no blog.
sudo make installCREATE EXTENSION hypopg; 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 soltar a extensão e criá -la novamente para obter a nova versão.
Nota: Os índices hipotéticos estão contidos em um único back -end. Portanto, se você adicionar vários índices hipotéticos, as conexões simultâneas que EXPLAIN não serão incomodadas por seus índices hipotéticos.
Assumindo um caso de teste simples:
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)
A maneira mais fácil de criar um índice hipotético é usar as funções hypopg_create_index com uma instrução CREATE INDEX regular como arg.
Por exemplo:
rjuju=# SELECT * FROM hypopg_create_index('CREATE INDEX ON hypo (id)');
Nota: Algumas informações da instrução CREATE INDEX serão ignoradas, como o nome do índice, se fornecido. Algumas das informações ignoradas serão tratadas em um lançamento futuro.
Você pode verificar os índices hipotéticos disponíveis em seu próprio back -end:
rjuju=# SELECT * FROM hypopg_list_indexes ;
indexrelid | index_name | schema_name | table_name | am_name
------------+-------------------------------+-------------+------------+---------
50573 | <50573>btree_hypo_id | public | hypo | btree
Se o comando CREATE INDEX que você deseja usar também precisar de cotar, o uso da sintaxe de citação do dólar será recomendado. Por exemplo:
rjuju=# SELECT * FROM hypopg_create_index($$CREATE INDEX ON hypo (id) WHERE val = 'line 1'$$);
Se você precisar de mais informações técnicas sobre os índices hipotéticos, a função hypopg() retornará os índices hipotéticos de maneira semelhante ao catálogo do sistema pg_index .
E agora, vamos ver se sua declaração EXPLAIN anterior usaria esse í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)
Obviamente, EXPLAIN apenas sem ANALYZE usará índices hipotéticos:
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 back -end, você pode usar a função hypopg_drop_index(indexrelid) com o OID que o hypopg_list_indexes View retorna e ligue para hypopg_reset() para remover tudo de uma só vez ou apenas fechar sua conexão atual.
Continuando com o caso acima, você pode hide existing indexes , mas deve usar hypopg_reset() para limpar os efeitos anteriores de outros índices no início.
Crie dois índices reais e Explique EXPLAIN :
rjuju=# SELECT hypopg_reset();
rjuju=# CREATE INDEX ON hypo(id);
rjuju=# CREATE INDEX ON hypo(id, val);
rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
----------------------------------------------------------------------------------
Index Only Scan using hypo_id_val_idx on hypo (cost=0.29..8.30 rows=1 width=13)
Index Cond: (id = 1)
(2 rows)
O plano de consulta está usando o índice hypo_id_val_idx . Use hypopg_hide_index(oid) para ocultar um dos índices:
rjuju=# SELECT hypopg_hide_index('hypo_id_val_idx'::REGCLASS);
rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
-------------------------------------------------------------------------
Index Scan using hypo_id_idx on hypo (cost=0.29..8.30 rows=1 width=13)
Index Cond: (id = 1)
(2 rows)
O plano de consulta está usando o outro índice hypo_id_idx agora. Use hypopg_hide_index(oid) para ocultá -lo:
rjuju=# SELECT hypopg_hide_index('hypo_id_idx'::REGCLASS);
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)
E agora o plano de consulta muda de volta para a Seq Scan . Use hypopg_unhide_index(oid) para restaurar o índice:
rjuju=# SELECT hypopg_unhide_index('hypo_id_idx'::regclass);
rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
-------------------------------------------------------------------------
Index Scan using hypo_id_idx on hypo (cost=0.29..8.30 rows=1 width=13)
Index Cond: (id = 1)
(2 rows)
Obviamente, você também pode ocultar índices hipotéticos:
rjuju=# SELECT hypopg_create_index('CREATE INDEX ON hypo(id)');
rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
------------------------------------------------------------------------------------
Index Scan using "<12659>btree_hypo_id" on hypo (cost=0.04..8.05 rows=1 width=13)
Index Cond: (id = 1)
(2 rows)
rjuju=# SELECT hypopg_hide_index(12659);
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)
Você pode verificar quais índices estão ocultos usando hypopg_hidden_indexes() ou hypopg_hidden_indexes View:
rjuju=# SELECT * FROM hypopg_hidden_indexes();
indexid
---------
526604
526603
12659
(3 rows)
rjuju=# SELECT * FROM hypopg_hidden_indexes;
indexrelid | index_name | schema_name | table_name | am_name | is_hypo
------------+----------------------+-------------+------------+---------+---------
12659 | <12659>btree_hypo_id | public | hypo | btree | t
526603 | hypo_id_idx | public | hypo | btree | f
526604 | hypo_id_val_idx | public | hypo | btree | f
(3 rows)
Para restaurar todos os índices existentes, você pode usar a função hypopg_unhide_all_indexes() . Observe que a funcionalidade para ocultar índices existentes se aplica apenas ao comando Explicar na sessão atual e não afetará outras sessões.