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


16

我需要实现与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()本身中实现此功能?


3
听起来您想实现查询提示。一切都很好,但是您不应期望在PostgreSQL核心中接受更改,因为您不会将项目社区称为查询提示的忠实拥护者。如果您对此很认真,则需要阅读大量的查询计划程序代码,并且需要弄清楚如何将解析器中的提示向下传递给重写器并进入计划程序。我在这里看不到快速简单的答案。您最终想要做的是在计划器/优化器中强制选择特定的路径。
克雷格·林格

嗯,是的,他们对查询提示持怀疑态度。我已经阅读了计划程序的代码,看来GEQO将是最小化对现有核心所做的更改的一种方法。
user2761431 2014年

2
这是您要实现的,实现查询提示以强制联接排序的目标吗?如果是这样,请调查是否有人已经实施了它。您还应该考虑为什么需要它,为什么计划者首先做出错误的选择。考虑产生一个独立的测试用例并报告pgsql-performance。
克雷格·林格

3
pg_hint_planen.sourceforge.jp/projects/pghintplan,但我没有使用它。一个dba告诉我它正在9.2上运行。俄语中也有关于此的
ckorzhik 2014年

Answers:


1

无需弄乱GEKO的一种方法是使用CTE。

CTE是优化障碍,因此您可以按所需顺序将联接包装在CTE中,PG将被迫这样做。

例如,如果我们要强制数据库首先将t1与t2联接在一起,然后才与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之间的顺序。

希望能帮助到你 :)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.