PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Diferença de desempenho:condição colocada na cláusula INNER JOIN vs WHERE


A razão pela qual você está vendo uma diferença é devido ao plano de execução que o planejador está montando, isso é obviamente diferente dependendo da consulta (sem dúvida, deve estar otimizando as 2 consultas para serem iguais e isso pode ser um bug ). Isso significa que o planejador pensa que tem que trabalhar de uma maneira particular para chegar ao resultado em cada declaração.

Quando você fizer isso dentro do JOIN, o planejador provavelmente terá que selecionar na tabela, filtrar pela parte "True" e juntar os conjuntos de resultados. Eu imagino que esta é uma tabela grande e, portanto, muitos dados para examinar e não pode usar os índices com a mesma eficiência.

Eu suspeito que se você fizer isso em uma cláusula WHERE, o planejador está escolhendo uma rota que é mais eficiente (ou seja, com base em índice ou conjunto de dados pré-filtrado).

Você provavelmente poderia fazer a junção funcionar tão rápido (se não mais rápido) adicionando um índice nas duas colunas (não tenho certeza se colunas incluídas e vários índices de coluna ainda são suportados no Postgres).

Resumindo, o planejador tem o problema de escolher 2 rotas diferentes para chegar aos conjuntos de resultados, e uma delas não é tão eficiente quanto a outra. É impossível para nós saber quais são os motivos sem as informações completas da tabela e as informações EXPLAIN ANALYZE.

Se você quiser detalhes sobre por que sua consulta específica está fazendo isso, será necessário fornecer mais informações. No entanto, o motivo é o planejador escolher rotas diferentes.

Material de leitura adicional:

http://www.postgresql.org/docs/current/static/explicit-joins.html

Apenas desnatado, parece que o planejador do postgres não reordena as junções para otimizá-lo. tente alterar a ordem das junções em sua declaração para ver se você obtém o mesmo desempenho ... apenas um pensamento.