基于动态规划的优化器
Posted 数据库备忘录
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于动态规划的优化器相关的知识,希望对你有一定的参考价值。
我们已经做了以下这三个专题
论文:Access Path Selection in a Relational Database Management System
出处:vldb79
近期的文章,我们会对数据库的优化器展开一个专题。
这篇论文是第一个关系型数据库IBM System R的优化器实现细节。优化器的输入是之前parser输出的AST语法树。输出是可以执行的物理执行计划。
单表扫描:关系表扫描是一个很重要的sql执行算子,我们具体扫描时是按照顺序扫描还是采用某个索引进行扫描?
两表JOIN:A join B时,是采用什么种类的join方案?nested-loop join,hash join,index join,sort-merge join等等。
多表JOIN:多个表join时,谁先谁后有个顺序问题,这是一个NP难的问题(假设n个表join,join顺序则有O(n!)种)。如此多的join方案中选取一种执行代价最优的方案是一个很难的算法问题。
bombehub,公众号:数据库系统原理
优化器同时需要结合“Database Catalog”内的数据,对查询的代价进行估计。这部分数据在中文中有很多叫法:数据字典、元数据、系统表等。
数据结构
下面两幅图展示了一个4路join的sql语句所对应的graph结构。
动态规划算法的例子
以system r为代表的很多优化器都采用的是动态规划的算法。主要步骤是依次从小到大,枚举出所有的物理执行计划,从中根据估计的代价选择最优的计划。
步骤1:针对每个关系表,枚举出所有物理计划,然后剪枝得到每个关系表的最优物理计划。
步骤2:根据单表的最优计划,枚举出两表join的计划,并计算出代价最优的两两join的物理计划。
步骤3:枚举并得到3表join的计划,并剪枝得到最优三表join的物理计划
依此类推,得到4张表的最优物理join计划。
敲黑板:上述表格一共有(2^4-1=15)行。
树形表述
上述用表格表述的步骤,用原型图表示过程如下:
枚举所有两两join的case
基于代价剪枝
基于两两join的结果,枚举所有三表join的case
基于代价剪枝
继续基于代价剪枝
参考资料:
https://bigdata.uni-saarland.de/datenbankenlernen/14516original.pdf
https://www.youtube.com/watch?v=zcdfPb92pvs&list=PLC4UZxBVGKtcZgLCrIUenuano53pbPpf1&index=6
https://bigdata.uni-saarland.de/datenbankenlernen/
https://15721.courses.cs.cmu.edu/spring2020/slides/19-optimizer1.pdf
http://db.in.tum.de/teaching/ws1819/queryopt/slides/chapter3.pdf?lang=en
以上是关于基于动态规划的优化器的主要内容,如果未能解决你的问题,请参考以下文章