Encontrar as consultas mais caras (pg_stat_statements: tempo total e médio)
PostgreSQLDesempenhoComando
-- By total time: queries consuming the most server time
SELECT queryid,
calls,
round(total_exec_time::numeric, 1) AS total_ms,
round(mean_exec_time::numeric, 2) AS mean_ms,
round(stddev_exec_time::numeric, 2) AS stddev_ms,
round((100 * total_exec_time / sum(total_exec_time) OVER ())::numeric, 1) AS pct_total,
rows / NULLIF(calls, 0) AS rows_per_call,
left(regexp_replace(query, '\s+', ' ', 'g'), 120) AS query
FROM pg_stat_statements
WHERE dbid = (SELECT oid FROM pg_database WHERE datname = current_database())
ORDER BY total_exec_time DESC
LIMIT 20;
-- By mean time per call: individually slow queries
SELECT queryid,
calls,
round(mean_exec_time::numeric, 2) AS mean_ms,
round(max_exec_time::numeric, 2) AS max_ms,
round(mean_plan_time::numeric, 2) AS mean_plan_ms,
left(regexp_replace(query, '\s+', ' ', 'g'), 120) AS query
FROM pg_stat_statements
WHERE calls >= 50
ORDER BY mean_exec_time DESC
LIMIT 20;O que faz
Lista as consultas normalizadas que mais consomem tempo do servidor no banco atual, com sua participação no total; a segunda consulta lista as mais lentas por chamada.
Quando usar
Primeira parada quando a carga de CPU/IO sobe ou usuários relatam 'o banco está lento'; para decidir por onde o tuning deve começar.
Atenção
O pg_stat_statements não coleta nada até ser adicionado a shared_preload_libraries, o servidor ser reiniciado e CREATE EXTENSION ser executado no banco. Os valores são cumulativos desde o último reset. Um stddev_ms alto em relação ao mean_ms indica que o plano ou a distribuição dos dados varia entre as chamadas. mean_plan_time só é preenchido com pg_stat_statements.track_planning = on (padrão off; habilitá-lo adiciona overhead). Ver os textos de consulta de outros usuários exige superusuário ou a role pg_read_all_stats.
Relacionados
- Encontrar as consultas que geram I/O de disco, arquivos temporários e WAL (pg_stat_statements)
- Zerar as estatísticas do pg_stat_statements (todas ou de uma única consulta)
- Registrar os planos de execução de consultas lentas com auto_explain
- Ler um plano em profundidade com EXPLAIN (ANALYZE, BUFFERS, SETTINGS, WAL)
- Detectar regressões de plano por queryid (comparação de snapshots do pg_stat_statements)
- Verificar a capacidade de consulta paralela e o uso atual de workers