PostgresGEQO 未来的实现任务

基本改进

改进查询处理完后的内存释放

在处理大 join (联接)查询时,用于基因查询优化的时间看来只是 Postgres 通过过程 MemoryContextFree(在文件 backend/utils/mmgr/mcxt.c 里)释放内存的 一小部分(fraction).跟踪调试显示释放内存的工作陷在文件 backend/utils/mmgr/oset.c 里的过程 OrderedElemPop 里的一个循环里了.在使用普通 Postgres 查询优化算法处理长的查询时也会产生这个问题.

改善基因算法参数设置

在文件 backend/optimizer/geqo/geqo_params.c 里的过程 gimme_pool_sizegimme_number_generations,我们在设置参数时不得不为两个竞争条件做出折衷:
    查询规划的优化

    计算处理时间

寻找解决整数溢出的更好的办法

在文件 backend/optimizer/geqo/geqo_eval.c 里的过程 geqo_joinrel_size,目前对防止 MAXINT 溢出的方法(hack)是把 Postgres 的整数值 rel->size to 设置为它的对数.对 backend/nodes/relation.h 里的 Rel 的变动显然将严重影响整个 Postgres 的实现.

寻找解决内存耗尽的办法

当一个查询里的关系超过 10 个时将导致内存的耗尽.在文件 backend/optimizer/geqo/geqo_eval.c里的过程 gimme_tree 是被递归调用的.可能我忘记了正确地释放某些东西了,但是我不知道是什么.当然 joinrel 数据结构随着更多的关系打包进入之后会越长越大.欢迎任何建议 :-(

参考

GEQ 算法的参考信息.

The Hitch-Hiker's Guide to Evolutionary ComputationJ鰎g Heitk鰐ter  David Beasley, InterNet resource, The Design and Implementation of the Postgres Query OptimizerZ. Fong, University of California, Berkeley Computer Science Department, Fundamentals of Database SystemsR. Elmasri and S. Navathe, The Benjamin/Cummings Pub., Inc..

comp.ai.genetic 上的FAQ可以在 Encore拿到.
文件 planner/Report.ps 在 'postgres-papers' 发布版里.