Fui informado de que a USING
construção (em vez de ON
) na FROM
cláusula de SELECT
consultas pode introduzir barreiras de otimização em certos casos.
Quero dizer esta palavra-chave:
SELECT * A partir de um JUNTE-SE A USAR (a_id)
Apenas em casos mais complexos.
Contexto: este comentário a esta pergunta .
Eu uso muito isso e nunca notei nada até agora. Eu ficaria muito interessado em um caso de teste demonstrando o efeito ou quaisquer links para mais informações. Meus esforços de pesquisa ficaram vazios.
A resposta perfeita seria um caso de teste para mostrar USING (a_id)
com desempenho inferior quando comparado à cláusula de junção alternativa ON a.a_id = b.a_id
- se isso realmente acontecer.
postgresql
performance
optimization
join
select
Erwin Brandstetter
fonte
fonte
USING
é um pouco mais rápido - pois resulta em uma coluna a menos na matriz de resultados. Suas descobertas datam de 2005 e 2008. Suponho que todos os problemas foram corrigidos até agora. No entanto , vejo uma possível limitação: JOINs comUSING
pode ter que ser aplicado em ordem , pois a coluna de junção resultante é um produto conjunto. Assim, potencialmente limitando opções na reordenação de JOINs.id
como nome da coluna.Respostas:
Erwin: Concordo com a idéia de que USAR causando pedidos rígidos poderia criar muitos casos extremos onde os planos ideais seriam descartados. Recentemente, ajudei alguém que tinha algo parecido com isso em sua consulta:
No caso dele, o pior desses blocos de junção estava causando uma junção de loop aninhada por cerca de 200 mil linhas, cerca de 20 mil vezes (faça as contas) e, como as chaves não podiam ser pressionadas para os índices, era uma varredura seqüencial. Isso significava que a consulta geral levou cerca de 3 horas para ser executada devido a alterações no plano em cascata. Ao distribuir a junção esquerda, as teclas podem ser pressionadas e a consulta é executada em questão de segundos. É claro que isso não é exatamente equivalente, e é por isso que o planejador não pode tratá-los como equivalentes e, por isso, ficou imaginando esse plano como uma junção de hash e depois fazendo um loop aninhado, o que era dolorosamente lento.
Sempre que você força rigidamente as junções a serem executadas em uma determinada ordem, você introduz casos em que as principais informações do filtro ainda não estão disponíveis na execução do plano e, portanto, o que pode ser possível fazer posteriormente em uma rápida verificação de índice / junção de hash pode ser necessário ser muito mais lento em uma varredura aninhada / loop aninhada e, embora o fragmento acima não seja imediatamente equivalente, ele mostra o mesmo problema.
fonte