J'ai besoin d'implémenter une fonctionnalité conforme à la fonctionnalité GEQO de PostgreSQL. Je comprends que l'approche GEQO consiste à coder les plans de requête sous forme de chaînes entières et GEQO génère ces séquences de jointure possibles au hasard. Source: http://www.postgresql.org/docs/9.3/static/geqo-pg-intro.html
Ma question: comment modifier la fonction GEQO si je connais définitivement la bonne séquence de jointure, pour ne pas avoir à rechercher différentes séquences de jointure. Par exemple, si je savais que la meilleure façon de rejoindre les 4 relations est le 4-1-3-2, je n'ai pas besoin de vérifier d'autres permutations.
Il n'y a pas de bons matériaux sur la façon dont GEQO est implémenté dans PostgreSQL. PostgreSQL ne donne qu'une vue d'ensemble de la fonctionnalité GEQO mais n'explique pas grand-chose.
Ou pourrais-je obtenir cette fonctionnalité dans le standard_join_search () lui-même sans utiliser GEQO?
la source
Réponses:
Une façon de le faire sans avoir besoin de jouer avec GEKO est d'utiliser CTE.
Les CTE sont des barrières d'optimisation, vous pouvez donc envelopper les jointures à l'intérieur des CTE dans l'ordre que vous souhaitez et PG sera obligé de le faire.
Par exemple, si nous voulons forcer la base de données à rejoindre d'abord t1 avec t2 et ensuite seulement avec t4, nous pourrions exécuter quelque chose comme:
Cela se traduira par:
Ceci est juste un exemple, vous pouvez le changer selon vos besoins - en tout cas, PG ne peut pas changer l'ordre entre les différents CTE.
J'espère que cela aide :)
la source