我需要实现一个符合Postgresql的GEQO功能的功能.据我所知,GEQO方法是将查询计划编码为整数字符串,GEQO随机生成这些可能的连接序列.资源 :
http://www.postgresql.org/docs/9.3/static/geqo-pg-intro.html
http://www.postgresql.org/docs/9.3/static/geqo-pg-intro.html
我的问题:如果我明确知道正确的连接序列,如何修改GEQO函数,这样我就不必搜索不同的连接序列.例如,如果我知道加入4种关系的最佳方式是4-1-3-2,我不需要检查其他排列.
关于如何在Postgresql中实现GEQO,没有任何好的材料. Postgresql仅提供了GEQO功能的整体视图,但没有解释太多.
或者我可以在不使用GEQO的情况下在standard_join_search()中实现此功能吗?
在没有使用GEKO的情况下,你可以做到这一点的一种方法就是使用CTE.
CTE是优化障碍,因此您可以按照您想要的顺序将连接包装在CTE中,并且PG将被强制执行此操作.
例如,如果我们想强制数据库首先用t2连接t1,然后只用t4,我们就可以运行如下命令:
explain with j1 as (select *,t1.c4 as t1c4 from t1 join t2 on (t1.c2=t2.id)),j2 as (select * from j1 join t4 on (t1c4=t4.id)) select * from j2;
这将导致:
QUERY PLAN ------------------------------------------------------------------------------- CTE Scan on j2 (cost=51485.00..67785.00 rows=815000 width=64) CTE j1 -> Hash Join (cost=3473.00..14521.00 rows=815000 width=40) Hash Cond: (t2.id = t1.c2) -> Seq Scan on t2 (cost=0.00..26.30 rows=1630 width=20) -> Hash (cost=1637.00..1637.00 rows=100000 width=20) -> Seq Scan on t1 (cost=0.00..1637.00 rows=100000 width=20) CTE j2 -> Hash Join (cost=289.00..36964.00 rows=815000 width=64) Hash Cond: (j1.t1c4 = t4.id) -> CTE Scan on j1 (cost=0.00..16300.00 rows=815000 width=44) -> Hash (cost=164.00..164.00 rows=10000 width=20) -> Seq Scan on t4 (cost=0.00..164.00 rows=10000 width=20) (13 rows)
这只是一个例子,你可以根据需要改变它 – 在任何情况下PG都不能改变不同CTE之间的顺序.
希望能帮助到你 :)