Eu passei pela documentação e pelas perguntas anteriores do stackoverflow, mas não encontrei as úteis. Postgres versão 10.6
Mesmo para o índice apenas verifica os valores de idx_tup_fetch estão aumentando. Portanto, não consigo entender a diferença entre idx_tup_read e idx_tup_fetch.
Inicialmente o entendimento foi: idx_tup_read: registros correspondentes lidos do índice.
idx_tup_fetch: linhas ativas buscadas na tabela depois que os registros são correspondidos no índice. Portanto, meu entendimento é que, apenas para o índice, verifica-se, pois nenhum dado é obtido da tabela, portanto, isso não deve ser incrementado.
Mas quando fiz os testes, esse entendimento não é verdade.
postgres=> select * from pg_stat_all_indexes where indexrelname like 'test_monika_rank';
relid | indexrelid | schemaname | relname | indexrelname | idx_scan | idx_tup_read | idx_tup_fetch
-------+------------+------------+-------------+------------------+----------+--------------+---------------
16413 | 16418 | public | test_monika | test_monika_rank | 4 | 2 | 2
(1 row)
postgres=> select * from test_monika where rank=100;
id | name | rank
----+------+------
95 | | 100
(1 row)
postgres=> select * from pg_stat_all_indexes where indexrelname like 'test_monika_rank';
relid | indexrelid | schemaname | relname | indexrelname | idx_scan | idx_tup_read | idx_tup_fetch
-------+------------+------------+-------------+------------------+----------+--------------+---------------
16413 | 16418 | public | test_monika | test_monika_rank | 5 | 3 | 3
(1 row)
postgres=> select rank from test_monika where rank=100;
rank
------
100
(1 row)
postgres=> select * from pg_stat_all_indexes where indexrelname like 'test_monika_rank';
relid | indexrelid | schemaname | relname | indexrelname | idx_scan | idx_tup_read | idx_tup_fetch
-------+------------+------------+-------------+------------------+----------+--------------+---------------
16413 | 16418 | public | test_monika | test_monika_rank | 6 | 4 | 4
(1 row)
postgres=> select id from test_monika where rank=100;
id
----
95
(1 row)
postgres=> select * from pg_stat_all_indexes where indexrelname like 'test_monika_rank';
relid | indexrelid | schemaname | relname | indexrelname | idx_scan | idx_tup_read | idx_tup_fetch
-------+------------+------------+-------------+------------------+----------+--------------+---------------
16413 | 16418 | public | test_monika | test_monika_rank | 7 | 5 | 5
(1 row)
postgres=> select 1 from test_monika where rank=100;
?column?
----------
1
(1 row)
postgres=> select * from pg_stat_all_indexes where indexrelname like 'test_monika_rank';
relid | indexrelid | schemaname | relname | indexrelname | idx_scan | idx_tup_read | idx_tup_fetch
-------+------------+------------+-------------+------------------+----------+--------------+---------------
16413 | 16418 | public | test_monika | test_monika_rank | 8 | 6 | 6
(1 row)
idx_tup_read
é aumentado sempre que uma entrada de índice é lida.idx_tup_fetch
é aumentado sempre que uma varredura de índice busca uma entrada de tabela.Se a verificação somente de índice aumentar
idx_tup_fetch
, ela não será realmente somente de índice. O PostgreSQL teve que buscar as linhas da tabela de qualquer maneira apenas para verificar se elas estão visíveis ou não, uma informação que não está armazenada no índice.Você pode ver isso como "tuplas de heap buscadas" na
EXPLAIN (ANALYZE)
saída.A solução é
VACUUM
a tabela para que o mapa de visibilidade seja atualizado.