跳转至

计划枚举

主要讨论的是逻辑计划到物理计划的转化。对于单表而言,需要考虑如何进行数据结构、索引的选择;对于多表而言,如何决定它们的处理先后顺序也是需要考虑的。

数据库需要枚举出来各种计划,然后通过成本预测和动态规划,从而选择最优的计划。

1.单表查询

考虑的第一点是如何对表进行访问。常见的方法有:

  • 顺序扫描,永远是最后的选择。
  • 二分查找,用于有序数据。
  • 索引扫描,又涉及到如何选择索引。对于OLTP场景而言,可以通过简单的启发式搜索。

其次,对于多个条件,如何根据其选择性进行条件排序。

2.多表查询

多表查询结合单表查询需要考虑的问题,枚举的顺序常为:

  • 枚举顺序:表之间的处理顺序。此时,可以对明显不应该的选择进行剪枝,如应该选择规模更小的表作为Outer Table。

15445-14

  • 枚举算法:在处理表的时候使用什么算法。

15445-15

  • 枚举访问方式

15445-16

3.动态规划

由于需要枚举的问题规模较大,因此需要使用动态规划来见优化枚举的时间开销。

由于Join的顺序对结果不影响,因此可以选择任意路径得到结果。

如下图,每个节点代表了一种状态,其转移路径的权值为预估成本。

15445-13

对于更大规模的问题,Postgres采用的方式是利用遗传算法进行方案枚举。