Eu tenho uma consulta que está levando 40 segundos para ser executada nos 80ms que deveria se postgres onde filtrar a chave primária em vez de fazer uma varredura sequencial. Eu tenho que forçar o postgres a filtrar o Ãndice definindo o sinalizador acima.
Ter que colocar isso no UDF parece um truque para mim, quero dizer, não é razoável IMO que o planejador de consulta esteja escolhendo uma varredura seq em vez de um filtro indexado. A maior parte da minha experiência com SQL está fora do SQL Server e nunca experimentei planejar mal essas otimizações básicas.
Editar: Para qualquer pessoa interessada, o tempo de execução da consulta caiu de 80 ms para 27 ms com 9,2, holly molley.
enable_seqscan=true não faz o que você pensa. Ele apenas permite que o planejador escolha isso. Não força.
Observe que deve estar ativado de qualquer maneira. As varreduras sequenciais são muito menos dispendiosas no PostgreSQL do que no MySQL, pois elas verificam em ordem fÃsica. Muitas vezes eles são o plano mais barato.
Não o defina globalmente, isso levaria a planos de consulta terrÃveis. Mas existem casos de uso sensatos para
enable_seqscan=False
. Cito o manual aqui :Portanto, se, por algum motivo, o planejador continuar escolhendo uma varredura sequencial em que outro tipo de varredura seria mais rápido, essa pode ser a sua correção feia - apenas para esta consulta . Se nenhuma outra rota estiver disponÃvel, o Postgres ainda usará uma varredura sequencial.
É claro que, na maioria dos casos, você está apenas encobrindo o problema subjacente - o planejador não deve estar tão errado para começar. Você pode querer começar a descobrir o que há de errado em sua configuração. Está
autovacuum
ativado (padrão), entãoANALYZE
é executado em suas tabelas automaticamente? tente um manualOu ainda:
começar com. Então leia o capÃtulo sobre Planner Cost Constants e procure palavras-chave como
random_page_cost
aqui ou em SO ...Suas configurações provavelmente estão muito erradas. Os padrões empacotados dificilmente são bons para bancos de dados maiores.