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:
LEFT JOIN (
a
JOIN b ON a.id = b.a_id
JOIN c ON b.c_id = c.id
) ON a.id = something.a_id
LEFT JOIN (
table1 t1
JOIN table2 t2 ON t1.some_field = t2.other_field
JOIN talbe3 t3 ON t2.yafield = t3.something_else
) ON ....
repeat a few more times
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.
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.