pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
对于大型 join 查询,遗传查询优化所花费的计算时间似乎只是 Postgres 通过例程 MemoryContextFree(文件 backend/utils/mmgr/mcxt.c)释放内存所用时间的一个小分数。调试显示它卡在了例程 OrderedElemPop(文件 backend/utils/mmgr/oset.c)的一个循环中。使用普通 Postgres 查询优化算法处理长查询时也会出现同样的问题。
在文件 backend/optimizer/geqo/geqo_params.c 的例程 gimme_pool_size 和 gimme_number_generations 中,我们必须为参数设置找到一种折中,以满足两个相互竞争的需求:
查询计划的最优性
计算时间
在文件 backend/optimizer/geqo/geqo_eval.c 的例程 geqo_joinrel_size 中,目前对 MAXINT 溢出的临时做法是把 Postgres 整数值 rel->size 设为其对数。对 backend/nodes/relation.h 中 Rel 的修改肯定会对整个 Postgres 实现产生严重影响。
当查询涉及的关系超过 10 个时可能发生内存耗尽。在文件 backend/optimizer/geqo/geqo_eval.c 中,例程 gimme_tree 会被递归调用。也许我忘了正确释放某些东西,但我不知道是什么。当然,join 的 rel 数据结构会随着装进去的关系越来越多而不断增长。欢迎建议 :-(
GEQ 算法的参考信息。
The Hitch-Hiker's Guide to Evolutionary Computation . InterNet resource .
The Design and Implementation of the Postgres Query Optimizer . University of California, Berkeley Computer Science Department .
Fundamentals of Database Systems . The Benjamin/Cummings Pub., Inc. .
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。