五 [译]数据库是如何工作查询管理器( 七 )


现实中的优化器
[ 可以到下一部分,这里不太重要 ]
但,所有的叽里呱啦都是非常理论化的 。因为我是开发者而不是研究员,我喜欢具体的例子 。
我们来看看 优化器是如何工作的 。这是一个很轻型的数据库,所以他使用优化器基于贪心算法+额外规则来限制可能性数量
等一下,我们已经看过这个算法了 。多么地巧合,从3.8.0版本(发布于2015年)开始,使用『N最近邻居』贪婪算法来搜寻最佳查询计划
接下来,让我看看其他的优化器是如何工作的 。IBM 的 DB2 看起来和其他企业级别的数据库一样,我会关注 DB2 是因为我切换到大数据之前,最后使用的数据库 。
如果我们看它的官方文档,我们了解到 DB2 的优化器允许你使用7中不同级别的优化:
对关联使用动态规划
我们可能看到 DB2 使用贪心算法和动态规划。当然,由于查询优化是数据库的主要功能,它们不会分享他们用的启发算法 。
仅供参考,默认的级别是 5。默认的优化器使用下面的特性:
考虑各种的访问方式,含列表预取(list,注:我们将会看这是什么),index (注:一种对索引的特殊操作),和物化查询表路由 。
默认情况下,DB2 对关联顺序使用受限制启发的动态规划算法
查询计划缓存
由于创建查询计划会花很多时间,所以绝大部分数据库会存储 *查询计划的缓存* 避免没有必要的重复计算 。这是个大话题啊,因为数据需要知道什么时间要更新过时的计划 。解决这问题的想法是设置阈值,当统计表的改动超过某个阈值,就会从将这个表从缓存中清除
查询执行器
在这阶段,我们有优化器的执行计划了 。这计划会被编译成一个可执行代码 。然后,如果有足够的资源(内存,CPU)就会通过查询执行器执行 。在这计划中的操作(JOIN,SORT BY...)可能会串行或者并行执行;这取决于执行器 。为了获取和写入数据,查询执行器会和数据管理器互相配合,这就是这篇文章下一部分要讲的