对PostgreSQL的GEQO(遗传查询优化)的修改
发布时间:2020-12-13 16:22:57 所属栏目:百科 来源:网络整理
导读:我需要实现一个符合PostgreSQL的GEQO功能的功能.据我所知,GEQO方法是将查询计划编码为整数字符串,GEQO随机生成这些可能的连接序列.资源 : http://www.postgresql.org/docs/9.3/static/geqo-pg-intro.html 我的问题:如果我明确知道正确的连接序列,如何修改G
我需要实现一个符合PostgreSQL的GEQO功能的功能.据我所知,GEQO方法是将查询计划编码为整数字符串,GEQO随机生成这些可能的连接序列.资源 :
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之间的顺序. 希望能帮助到你 :) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |