如何操控PostgreSQL优化器的连接顺序?

我正在进行表连接顺序优化的工作。
在查询处理过程中,我想要获取由优化器生成的表连接顺序,并通过在PostgreSQL中使用自己的算法来更新它。
在查询处理过程中,我如何更新表连接顺序?
2个回答

你可以这样做,但需要一些技巧。
想象一下你得到了这个:
select ... from a, b, c, d, e ...

...这种类型的查询总是被重新排序。

但如果你这样做:

select ... from a JOIN b ... JOIN c JOIN d JOIN c ...

...然后PostgreSQL只会重新排序join_collapse_limit个表。您可以将此变量减小到一个较低的值,以强制PostgreSQL按照您的顺序进行排序;但是,我建议尽量避免这样做。
这应该只在本地使用SET LOCAL,并且您应该首先考虑为什么要改变连接顺序。
相关链接:由于极不准确的行估计导致的慢全文搜索

1当需要使用这样的技术时,一个表比另一个表大得多,而且很不可能改变这个事实。所以我想知道,为什么你建议要避免这种情况呢? - Federico Razzoli
你还可以通过from_collapse_limit参数来控制FROM子句中子查询的折叠,详见:https://www.postgresql.org/docs/14/runtime-config-query.html#GUC-FROM-COLLAPSE-LIMIT - ADJenks

还有一种使用提示(注释)来强制加入顺序的扩展。这个pg_hint_plan将帮助您获得首选顺序。


pg_hint_plan 看起来像是 Oracle 中的提示。但在这种情况下,该模块是由其他人开发而不是 Postgres 开发人员,这让我对在生产服务器上安装此模块不太有信心。 - EAmez