CMU高度なDBシステム - クエリオプティマイザの実装

概要

最適化モジュールは、図1に示す位置にあり、

 

だから、目的があるに最適化を行います

最低のすべての「正しい」実施計画「コスト」を検索

だからここでは最初に明確なコンセプト、「正しい」、リレーショナル代数同等のは、同じ結果セットを生成しなければならない;ので、すべてが等価変換があることを前提に最適化する必要があります

しかし、同値のセット、それが実行計画のすべての同値のセットは、非常に大きくなりますので、あなたが徹底的NP完全問題になりたい場合は質問がある、であるが、探索空間を制限し、検索効率を向上させるために「検索アルゴリズム」を検討する必要があります

クエリコストを関与する多くの要因があるので、同等のコレクションでは、どのようにどのような作業のコストを定義し、計算する、「コスト」、実行計画を選択するかは、非常に困難です

 

物理的および論理的な計画案

違いは、簡単に言えば、論理的な計画は、「何をすべきか」と言う、物理的な計画は「やるか」と言うことです

OLAPの最適化は、OLTPは、一般的に、比較的単純なクエリことから、通常は大きな意義であり、通常は検索引数可能

 

デザイン決定

ポイントを検討する必要があるの設計にオプティマイザ?

最適サイズ

単一のクエリの最適化、主に研究され、現在のように、単一のクエリまたは複数のクエリの最適化に基づいて、明らかに、より良いでしょうクエリの数が、はるかに大きくなり探索空間に基づいて、

動的最適化の最適化対静的

今の主流は、静的な最適化がされ、より理想主義的な、しかし、困難実装するとデバッグの動的最適化、ハイブリッドモードでは、エラーになりますが閾値を超え、選択再最適化

プリペアドステートメントの最適化

この場合は、時間が経過した場合に、別のパラメータは、それによって結合の順序に影響を与え、スクリーニング率に影響を与える、パラメータ化され

.. 2は、複数のプランを生成し、バケットのパラメータを、パラメータ上のバケットが選択された各計画で立ち下がる;. 3がパラメータ計画の平均値を用いて生成され、三つの溶液の種類毎に1つの再最適化が存在します

プラン・スタビリティ

時には、ユーザーが同じクエリ実行の安定性を懸念しています

所以就算你的优化器99%的情况下比原来的好很多,但是会有1%的bad cases,用户的反馈可能反而是负面的

所以需要如下的方法去保障plan的稳定

Search算法的结束标准

这个search问题是个NP-Complete问题,一般没法完全穷举

算法结束可以用,时间,只能优化1s,到1s就结束;cost阈值,发现低于阈值的plan就结束;完成穷举,没法继续transform,结束

 

Optimization Search Strategy

这里重点描述优化的search算法的演进

Heuristic-based

基于启发式规则,把先验的经验定义成优化规则,简单容易实现,适用于早期的数据库

例子,一个3表join的查询,可以先拆分成3条单独的查询;由于结果集很小,第二步可以直接把每个查询替换成结果集

 

Heuristic+Cost-Based

在heuristic的基础上,加上cost-based来做join顺序的优化,是cost-based优化技术的初次尝试

 

System R的例子,

PG的例子,

 

Top-down v.s. Bottom-up

这里提出两种search的策略,没有说哪种一定好,当前流行的框架都用top-down,比如calcite,比较方便剪枝

 

 

Randomized 

这是一个典型的优化算法的思路,比如经典算法模拟退火;

算法的缺点很明显,就是不确定性,所以往往会被用于极为复杂的查询优化,死马当活马医,反正也没有其他高效的优化方式;优点是overhead很低,很容易实现,运气好的话会有不错的效果

PG里面就实现了Genetic Optimizer

 

之前的Optimizer都是用程序语言写的,很难扩展或作为独立的组件
并且用程序语言写的Rule很难被理解和维护

所以大家想是否可以用DSL来维护rule,这样我们通过开发一个generator来根据DSL来生成Optimizer,这样形成framework 

 

Stratified

优化分成多个Stage,

比如,stage1,Rule-base的logical plan的transformation;stage2,cost-based的从logical到physical plan的生成

 

Unified

和stratified相比,不区分stage,logical或physical的转换同时进行;同时使用动态规划和memoization来优化算法效率

比较有代表性的就是,Volcano,火山模型

 

Cascades Optimizer 

Valcano作为一种学术原型,而Cascades作为它的一种面向对象的实现

Cascades中的一些定义

Expression

Expression作为plan中的基本单元,有逻辑和物理两种

Groups

等价的逻辑和物理expression的集合

Multi-expression

把所有等价的expression都写出来,太多太乱
Multi-expression是一种分层的,简单的表示方式

Rules

分为Transformation Rule和Implementation Rule分别对应为转换成Logical或Physical的expression

Rule有两部分组成,Pattern,定义何种logical expression适用于该rule;Substitute,定义如何转换

Memo Table

动态规划算法,用来缓存中间结果

可以使用Memo的前提假设,如右,如果当前plan是optimal,那么他的所有子plan也是optimal
这个其实不一定的,因为这个贪心算法的思路,有可能子plan非最优,但整体最优;
这里后面会通过enforcer来约束,保证假设成立

Memo使用的例子,

左图,算过[A] join [B],[A]和[B]的cost会被缓存,后面就可以直接用

 

Cascades模型当前的实现, 

 

 前面考虑的都是比较简单的join情况,如果考虑各种join,可能re-ordering是invalid的;具体解决方法这里不详细描述

 

优化的时候,谓词是个很关键的优化点

最常见的谓词下推,也可以在不同的阶段进行,方法二比较简单但是无法应对复杂谓词,所以一般方法一比较通用一些

对于谓词还需要考虑,哪个谓词先被执行,这个需要考虑两个方面,selectivity和computation cost

 

 

 下面列举一些例子,

Orca,

 

Calcite

 

Memsql

特点是,在把优化过的physical plan重新转化成SQL,然后再发到各个子节点

因为对于分布式数据库,子节点上有更准确的数据分布信息,所以在子节点上再根据local的信息做一遍优化会更合理

 

おすすめ

転載: www.cnblogs.com/fxjwind/p/11227213.html