Temos um servidor PostgreSQL 9.5 ocupado com tráfego semelhante ao OLTP, onde os pg_stat_all_tables.idx_scan
valores aumentam com uma taxa considerável enquanto estamos tendo problemas de desempenho.
Isso ( idx_scan
aumentar) realmente significa que
- o sistema está realmente executando muitas varreduras completas por meio de índices (ou seja, lendo todo o índice do disco, se ainda não estiver no cache), ou
- o sistema está realmente obtendo apenas algumas tuplas ("linhas") desses índices (ou seja, usando o índice conforme pretendido)?
Se a opção 1 for verdadeira, como descobrir como colocar o sistema no estado 2? Preciso de alguns índices adicionais ou algumas das minhas consultas são ruins? Todas as consultas obtêm um bom desempenho enquanto o sistema está sob carga baixa, mas durante uma carga muito alta praticamente qualquer consulta pode ter um tempo de execução inesperadamente ruim.
(A documentação em https://www.postgresql.org/docs/current/monitoring-stats.html diz apenas "Número de verificações de índice iniciadas nesta tabela".)
Sempre que um índice é usado, isso conta como uma varredura de índice. Não há contador separado para varreduras de índice completo. Você pode comparar idx_scan com idx_tup_fetch e ver como todas as linhas são retornadas do índice por varredura em média. Mas qual é o ponto? Na maioria das vezes, ele busca o número de linhas necessário para fazer o trabalho que você atribuiu. Talvez você esteja perdendo um índice que poderia fazer o trabalho melhor, mas olhar para essa estatística não dirá que esse é o caso, nem informará qual índice hipotético poderia ser.
Eu faço muita investigação de desempenho e quase nunca olho para esses valores, a menos que esteja tentando ajustar/depurar o autovac.
EXPLAIN (ANALYZE, BUFFERS)
,pg_stat_statements
,auto_explain
são as ferramentas certas para o trabalho.