本文分析查询优化器的重要组成部分(cardinality estimation、cost model和plan enumeration)上的缺点,总结了当前学术界对这些问题的解决办法,并指出了将来的可能的研究方向。
Lohman指出cost model能引入30%的错误率,但cardinality estimation很容易就引入数量级的错误率。
cardinality estimation主要在以下三种情况下引入错误:
cost-based optimizer是一个代价模型,输出某个query的cost,该cost是查询中所有算子的cost之和。
单个算子的cost跟这些因子有关:
因此,当组合这些因子来计算cost时首先需要确定组合方法中的很多参数值。此外,当把数据库系统部署在分布式环境、云或跨平台查询引擎上时,cost model的复杂度还会剧增。而且,即使cardinality是真实值,一个query的cost estimation与运行时间并不成线性关系,可能造成优化器选择次优计划。
plan enumeration用来从众多计划中选择一个最优执行计划,这被证明是一个NP难问题。当面临多表join的查询时,穷举可能的执行计划对于大型数据库来说是个十分困难的事情。搜索空间中 的join树有可能是zigzag树,左深树、右深树、bushy tree,或者它们的子集。不同的系统join tree形式也不同。
传统数据库有三种枚举方法:
Plan Enumeration当前有三个局限:
应该注意到,cardinality estimation的错误会传导至cost model,导致次优计划。因此,构建一个好的优化器的前提是先解决cardinality estimation中的错误。
当前,cardinality estimation方法有三类。如图2所示。
引入新的数据结构存储统计信息。Histogram和sketch是其中应用最为广泛的方法。
两种类型:1维和d维(d>=2)。
2003以后,直方图方面的研究可以划分为3类:
Sketch将一个列作为一个矢量或矩阵来计算不同值的数量或元组频率
提纲:
HBase客户端有对数据的请求和对表分裂等的请求,如果开启了Quotas功能,则会对这些请求的大小或者数量进行限制,也即RPC Throttling。