Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

60.3. Genetic Query Optimization (GEQO) in PostgreSQL #

60.3.1. 使用生成可能的计划GEQO
60.3.2. PostgreSQL 的未来实现任务GEQO

GEQO模块将查询优化问题视作众所周知的旅行商问题(TSP)。可能的查询计划编码为整数字符串。每个字符串表示从查询中一个关系到另一个关系的连接顺序。例如,连接树

   /\
  /\ 2
 /\ 3
4  1

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

PostgreSQL 中的特定GEQO实现特征是

巡回。GEQO中的各部分

GEQO模块改编自 D. Whitley 的 Genitor 算法。

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

GEQO60.3.1. 使用生成可能的计划GEQO计划流程使用标准规划程序代码为单个关系的扫描生成计划。然后使用遗传方法开发联接计划。如上所示,每个候选联接计划都由一个序列表示,用于联接基本关系。在初始阶段,

代码仅仅是随机生成一些可能的联接序列。对于考虑的每个联接序列,都将调用标准规划程序代码来估计使用该联接序列执行查询的成本。(对于联接序列的每个步骤,都将考虑所有三个可能的联接策略;并且所有最初确定的关系扫描计划都可用。估计的成本是这些可能性中最便宜的。)估计成本较低的联接序列被认为更适应成本较高的联接序列。遗传算法舍弃最不适应的候选者。然后通过组合更适应的候选者的基因(即,通过使用已知低成本联接序列的随机选择的各个部分来创建新的序列以供考虑)来生成新的候选者。这个过程一直重复,直到考虑了预设数量的联接序列为止;然后在搜索期间任何时间找到的最佳联接序列用于生成最终计划。

由于在初始种群选择和随后对最佳候选者的变异中进行的随机选择,此流程本质上是不确定性的。为了避免所选计划的意外更改,GEQO 算法的每次运行都会使用当前 geqo_seed 参数设置重新启动其随机数生成器。只要 geqo_seed 和其他 GEQO 参数保持固定,就会针对给定的查询(以及其他规划程序输入,例如统计信息)生成相同的计划。要尝试不同的搜索路径,请尝试更改 geqo_seedGEQO #

仍然需要对遗传算法参数设置进行提高。在文件 src/backend/optimizer/geqo/geqo_main.c 中,例程 gimme_pool_sizegimme_number_generations,我们必须找到一个折中参数设置以满足两个竞争需求

  • 查询计划的最优性

  • 计算时间

在当前实现中,通过从头运行标准规划器的联接选择和成本估算代码来估算每个候选联接序列的适应度。在一定程度上,不同的候选者会使用类似的联接子序列,因此会出现大量重复的工作。通过保留子联接的成本估算,可以显著加快这一过程。问题在于避免在保留该状态时浪费不合理大量的内存。

在更基本的层面上,尚不清楚是否适合使用专为 TSP 设计的 GA 算法解决查询优化问题。在 TSP 案例中,与任何子字符串(部分旅行)关联的成本与旅行的其余部分无关,但这对于查询优化肯定不是真的。因此值得怀疑的是,边缘重组交叉是否是最佳突变过程。