Pg_hint_plan: Force PostgreSQL a executar os planos de consulta do jeito que você quer
O que o pg_hint_plan oferece
- A extensão permite que os usuários influenciem o planejador do PostgreSQL em direção a planos específicos (joins, índices etc.) sem alterar o PostgreSQL principal.
- É visto como especialmente valioso para:
- Incidentes de produção de emergência quando o planejador escolhe um plano desastroso.
- Pesquisa/experimentação, quando você quer fixar algumas escolhas de plano enquanto deixa o planejador lidar com o resto.
- Migração de outros bancos de dados (por exemplo, via Babelfish) em que cargas de trabalho existentes dependem de hints.
Problemas práticos ao usá-lo
- A interface da tabela de hints é descrita como frágil:
- A correspondência é sensível a espaços em branco e pode falhar silenciosamente.
- O tratamento de parâmetros é desajeitado; ferramentas anteriores tornavam difícil iterar em consultas parametrizadas, embora versões mais novas do
psqlajudem.
- A extensão altera os custos do plano para “sugerir fortemente” um plano; se um plano com hint for impossível, o PostgreSQL ainda escolhe outra coisa.
Debate: hints são bons ou ruins?
- Preocupações:
- Hints podem congelar planos subótimos à medida que os dados e as versões do PostgreSQL evoluem.
- Desenvolvedores raramente revisitam consultas com hints; o acúmulo de cruft acontece.
- A postura da equipe principal de desenvolvimento (como descrita): é melhor melhorar estatísticas e o otimizador do que adicionar hints ao SQL.
- Contrapontos:
- A previsibilidade em produção costuma ser mais valiosa do que a otimalidade teórica; evitar regressões súbitas de plano é crítico.
- Estatísticas e configuração do planejador são complexas, globais e arriscadas; hints são localizados e mais fáceis de raciocinar para uma única consulta.
- As estatísticas e o otimizador do PostgreSQL têm fraquezas conhecidas em grande escala e com dados correlacionados ou enviesados; alguns problemas permanecem sem solução há anos.
- Hints são apresentados como “assembly inline”: ruins como padrão, inestimáveis para casos raros de borda.
Alternativas e abordagens de ajuste
- Remédios sugeridos sem hints:
VACUUM ANALYZE, autovacuum ajustado.- Aumentar os alvos de estatísticas por coluna ou usar estatísticas estendidas/customizadas.
- Ajustes de configuração do planejador (
join_collapse_limit, parâmetros de custo) limitados comSET LOCAL. - Mudanças de esquema/índice (índices compostos ou parciais) para dar melhor suporte às consultas frequentes.
Pontos de dor do planejador e exemplos
- Vários relatos de consultas com LIMIT + ORDER BY + WHERE escolhendo planos muito ruins, especialmente com colunas correlacionadas ou enviesadas.
- Há divergência sobre com que frequência ocorrem flips catastróficos de plano, mas há consenso de que eles acontecem, particularmente em tabelas muito grandes.
- Alguns argumentam que isso torna o PostgreSQL “perigoso” em produção sem uma forma confiável de fixar ou sobrescrever planos.