pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
GEQO模块把查询优化问题视为著名的旅行商问题(TSP)来处理。可能的查询计划被编码为整数串。每个串表示查询中从一个关系到下一个关系的连接顺序。例如,连接树
/\ /\ 2 /\ 3 4 1
会被编码为整数串 '4-1-3-2',这意味着先连接关系 '4' 和 '1',再连接 '3',最后连接 '2';其中 1、2、3、4 是PostgreSQL优化器内部的关系 ID。
PostgreSQL 中 GEQO 实现的具体特征包括:
采用稳态 GA(替换种群中适应度最低的个体,而不是整代替换),能够快速收敛到更优的查询计划。这对于在合理时间内处理查询至关重要;
采用边重组交叉,它特别适合在利用 GA 求解 TSP 时将边损失保持在较低水平;
不使用变异作为遗传操作符,因此无须借助修复机制来生成合法的 TSP 回路。
GEQO模块的部分内容改编自 D. Whitley 的 Genitor 算法。
GEQO模块使PostgreSQL查询优化器能够通过非穷举搜索有效支持大型连接查询。
为了改进遗传算法的参数设置,仍有一些工作要做。在文件src/backend/optimizer/geqo/geqo_main.c中的例程gimme_pool_size和gimme_number_generations里,我们必须为参数设置找到一种折中,以满足两个相互竞争的需求:
查询计划的最优性
计算时间
在当前实现中,每个候选连接序列的适应度都是通过从头运行标准规划器的连接选择和代价估算代码来估算的。只要不同候选使用了相似的连接子序列,就会有大量工作被重复执行。如果能保留子连接的代价估算,就可以显著加快这一过程。问题在于,必须避免为了保存这种状态而消耗不合理数量的内存。
从更基础的层面看,用一个为 TSP 设计的 GA 算法来解决查询优化问题是否合适,也并不明确。在 TSP 情况下,与任何子串(部分巡回)相关的代价都独立于巡回的其余部分,但对于查询优化显然并非如此。因此,边重组交叉是否是最有效的变异过程,仍然值得怀疑。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。