Il a été porté à mon attention que la USING
construction (au lieu de ON
) dans la FROM
clause de SELECT
requête pourrait introduire des barrières d'optimisation dans certains cas.
Je veux dire ce mot clé:
SELECT * De JOIN b USING (a_id)
Juste dans des cas plus complexes.
Contexte: ce commentaire à cette question .
J'utilise beaucoup cela et je n'ai jamais rien remarqué jusqu'à présent. Je serais très intéressé par un cas de test démontrant l'effet ou des liens vers des informations supplémentaires. Mes efforts de recherche ont été vides.
La réponse parfaite serait un test à démontrer USING (a_id)
avec des performances inférieures par rapport à la clause de jointure alternative ON a.a_id = b.a_id
, si cela peut réellement se produire.
postgresql
performance
optimization
join
select
Erwin Brandstetter
la source
la source
USING
peu plus rapide , car il en résulte une colonne de moins dans la matrice de résultats. Vos conclusions remontent à 2005 et 2008. Je suppose que tous les problèmes ont été résolus à ce jour. Cependant , je vois une limite possible: ilUSING
peut être nécessaire d’ appliquer des joints avec ordre , car la colonne de jointure résultante est un produit joint. De ce fait, limitant potentiellement les options de réorganisation des JOIN.id
comme nom de colonne.Réponses:
Erwin: Je suis d’accord avec l’idée que le fait d’utiliser un ordre rigide pourrait bien créer de nombreux cas extrêmes dans lesquels les plans optimaux seraient exclus. J'ai récemment aidé quelqu'un qui avait quelque chose comme ça dans sa requête:
Dans son cas, le pire de ces blocs de jointure provoquait une jointure de boucle imbriquée sur environ 200 000 lignes, environ 20 000 fois (calculez le calcul), et puisque les clés ne pouvaient pas être déplacées vers les index, il s'agissait d'un balayage séquentiel. Cela signifiait que la requête globale prenait environ 3 heures à s'exécuter en raison de modifications du plan en cascade. En distribuant la jointure gauche, les clés peuvent être enfoncées et la requête exécutée en quelques secondes. Bien sûr, cela n’est pas exactement équivalent, c’est pourquoi le planificateur ne peut pas les traiter comme équivalents. Il a donc été laissé en place ce plan comme une jointure de hachage, puis une boucle imbriquée, qui était douloureusement lente.
Chaque fois que vous forcez de manière rigide les jointures à passer dans un certain ordre, vous introduisez des cas dans lesquels les informations de filtre de clé peuvent ne pas être encore disponibles lors de l'exécution du plan, et que vous pouvez donc faire ultérieurement dans une jointure d'index rapide / jointure de hachage. Il se peut que vous deviez effectuer beaucoup plus lentement une analyse imbriquée de boucle / séquentielle. Ainsi, bien que le fragment ci-dessus ne soit pas immédiatement équivalent, il présente le même problème.
la source