# 60.3.PostgreSQL中的遗传查询优化(GEQO)

60.3.1. 使用GEQO生成可能的计划

60.3.2. PostgreSQL GEQO的未来实施任务

GEQO模块处理查询优化问题时,就像处理著名的旅行商问题(TSP)一样。可能的查询计划被编码为整数字符串。每个字符串表示从一个查询关系到下一个查询关系的连接顺序。例如,连接树

   /\
  /\ 2
 /\ 3
4  1

由整数字符串“4-1-3-2”编码,这意味着首先连接关系“4”和“1”,然后是“3”,然后是“2”,其中1、2、3、4是PostgreSQL优化器中的关系ID。

PostgreSQL中GEQO实现的具体特征如下:

  • a的用法稳态GA(替换群体中最不合适的个体,而不是整代替换)允许快速收敛到改进的查询计划。这对于在合理的时间内处理查询至关重要;

  • 使用边缘复合交叉特别适用于通过遗传算法求解TSP时保持较低的边缘损失;

  • 不推荐使用突变作为遗传算子,因此不需要修复机制来生成合法的TSP旅行。

    GEQO模块的部分内容改编自D.Whitley的Genitor算法。

    GEQO模块允许PostgreSQL查询优化器通过非穷举搜索有效地支持大型连接查询。

# 60.3.1.使用GEQO生成可能的计划

GEQO规划流程使用标准规划器代码生成扫描个人关系的计划。然后使用遗传方法制定加入计划。如上所示,每个候选连接计划由一个连接基本关系的序列表示。在初始阶段,GEQO代码只是随机生成一些可能的连接序列。对于考虑的每个连接序列,将调用标准planner代码来估计使用该连接序列执行查询的成本。(对于连接序列的每个步骤,都会考虑所有三种可能的连接策略;并且所有最初确定的关系扫描计划都可用。估计成本是这些可能性中最便宜的。)估计成本较低的连接序列被认为比成本较高的连接序列“更适合”。遗传算法丢弃最不合适的候选。然后,通过组合更合适的候选基因来生成新的候选基因——也就是说,通过使用已知低成本连接序列的随机选择部分来创建新序列以供考虑。重复该过程,直到考虑到预设数量的连接序列;然后使用搜索过程中任何时候找到的最佳计划生成完成的计划。

这一过程本质上是不确定的,因为在最初的群体选择和随后的最佳候选者“突变”过程中都会进行随机选择。为了避免所选计划发生意外变化,每次运行GEQO算法时,都会用当前值重新启动随机数生成器盖库_种子参数设置。只要蛤蟆籽如果其他GEQO参数保持不变,那么将为给定的查询生成相同的计划(以及其他计划器输入,如统计数据)。要尝试不同的搜索路径,请尝试更改蛤蟆籽.

# 60.3.2.PostgreSQL GEQO的未来实施任务

改进遗传算法参数设置仍需努力。存档src/backend/optimizer/geqo/geqo_main。C例行公事给我泳池大小给我多少代,我们必须为参数设置找到折衷方案,以满足两个相互竞争的要求:

  • 查询计划的最优性

  • 计算时间

    在当前的实现中,通过从头开始运行standard planner的连接选择和成本估算代码来估计每个候选连接序列的适合度。由于不同的候选者使用相似的连接子序列,大量工作将被重复。通过保留子联接的成本估算,这可以大大加快速度。问题是要避免在保持这种状态时花费不合理的内存量。

    在更基本的层面上,目前尚不清楚使用为TSP设计的GA算法来解决查询优化是否合适。在TSP的情况下,与任何子字符串(部分遍历)相关的成本独立于遍历的其余部分,但对于查询优化来说,这肯定不是真的。因此,边缘重组交叉是否是最有效的变异过程值得怀疑。