对PostgreSQL的GEQO(遗传查询优化)的修改

前端之家收集整理的这篇文章主要介绍了对PostgreSQL的GEQO(遗传查询优化)的修改前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要实现一个符合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之间的顺序.

希望能帮助到你 :)

猜你在找的Postgre SQL相关文章