CMU Database Systems - Query Optimization

栏目: 数据库 · 发布时间: 5年前

内容简介:查询优化应该是数据库领域最难的topic当前查询优化,主要有两种思路,Rules-based,基于先验知识,用if-else把优化逻辑写死

查询优化应该是数据库领域最难的topic

当前查询优化,主要有两种思路,

Rules-based,基于先验知识,用if-else把优化逻辑写死

Cost-based,试图去评估各个查询计划的cost,选取cost比较小的

一个sql query的处理流程,

先是Parser,生成抽象语法树ast,Binder会去做元数据对应,把parse出来的name对应到数据库中的结构,表,字段等

然后Rewriter就是Rules-based的改写,而Optimizer是cost-based的优化

CMU Database Systems - Query Optimization CMU Database Systems - Query Optimization

Relational Algebra Equivalences

做查询优化的前提是,查询的结果是不能变的

无论你查询怎么优化,最终得到的结果是一样的,那么就称他们是,关系代数等价

对于不同的operator,有些通用的优化rules,

这里给些例子,

Selections

对于selection,尽量下推,谓词下推,尽量早做

CMU Database Systems - Query Optimization CMU Database Systems - Query Optimization

Projections

projection也是应该尽早去做,不需要的字段就根本不用读出来

CMU Database Systems - Query Optimization CMU Database Systems - Query Optimization

Joins

对于Join是符合交换律和结合律的,但是对于多表join,你需要尝试的可能性是非常多的

CMU Database Systems - Query Optimization

Cost Estimation

cost-based的查询优化,关键就是要能够知道cost

如何预估cost是很复杂的问题

当前的思路,就是我们会事先对数据表,列,索引做些统计,并存储到catalog里面,然后后面就根据这些统计数据来预估cost

CMU Database Systems - Query Optimization CMU Database Systems - Query Optimization

主要的统计数据,包含两项,行数和每一列的distinct values的个数

然后有个概念,selection cardinality,两个相除,就是平均每个value多少行

这里的假设是数据是均匀分布,很naive

CMU Database Systems - Query Optimization

CMU Database Systems - Query Optimization

有了这些概念,我们就可以来定义复杂谓词,操作,的selectivity,筛选率

CMU Database Systems - Query Optimization

Equality,Range

Equality的定义有些confuse,SC(P),SC(age=2)啥意思?

其实以range的逻辑看,这里就应该是,A列一共有5个值,当前Equality只取其中一个,所以五分之一,就这么简单

CMU Database Systems - Query Optimization CMU Database Systems - Query Optimization

CMU Database Systems - Query Optimization

Conjunction和Disjunction

CMU Database Systems - Query Optimization CMU Database Systems - Query Optimization

Join,对于join,这个cost算的很粗糙,比如R表中的行数 * 每行在S中的cardinality

CMU Database Systems - Query Optimization

平均分布问题

当前算cost,都是假设平均分布,这个明显是很不合理的

但是如果对于每个value都去记录一个统计,明显不可行,太多了

所以有如下几种近似方法,

一种,每个value bucket都去统计太多,那就分组,这样每个组记录一个统计,组内仍然假设平均分布

分组可以有两种方式,第一个是固定bucket数,或者固定组内bucket统计和差不多,叫等宽

CMU Database Systems - Query Optimization CMU Database Systems - Query Optimization

还有种更直接的方式,sampling

CMU Database Systems - Query Optimization

Query Optimization

上面说的cost estimation的方法都很naive,但是如果我们能准确的预估执行计划的cost,那么如何真正的做查询优化?

这里分为三种情况,

Single Relation,Multiple relations, Nested Sub-queries

Single Relation,比较简单,单关系表的查询

所以关键就是选择合理的access method,是顺序扫描,还是用各种索引

这里有个概念,sargable,数据库专有概念,意思是查询或执行计划可以用索引来优化的

OLTP的查询往往都是sargable的,所以通过简单的启发式的方式就可以找到优化方法

CMU Database Systems - Query Optimization CMU Database Systems - Query Optimization

Multiple relations

多关系表join就比较复杂了

除了要选择各个表的access method

还需要选择各个表的join顺序和join算法

其中选择join顺序是个cost很高的事情,因为可能性和search space会比较的大

这里介绍IBM R的方法,它把join顺序简化成,只考虑Left-deep tree(右图最左边这个)

这样search space会大幅缩小,另外特意选择left-deep tree的原因是,这种join结构,比较容易pipeline执行,比如下图,a b的join结果直接可以用于和c join,当中间结果不是很大的时候,不需要不断地的把结果写到磁盘

CMU Database Systems - Query Optimization CMU Database Systems - Query Optimization

对于Multiple relations,可以尝试用动态规划来选择best plan

CMU Database Systems - Query Optimization CMU Database Systems - Query Optimization CMU Database Systems - Query Optimization

更为形象的例子来说明如何逐步筛选plan

第一步是选择join的顺序,可以首先把明显低效的,比如做cross-products的Prune掉

然后根据cost model找出best的plan

CMU Database Systems - Query Optimization

第二步是选择join算法,这里有Nested Loop和Hash Join

CMU Database Systems - Query Optimization

第三步是选择access method,

CMU Database Systems - Query Optimization

Nested Sub-queries

第三种更为复杂一些,在有子 SQL 的时候,如何优化?

有两种方式,一种是通过rewrite,把嵌套的子语句flatten掉,如右图的例子

CMU Database Systems - Query Optimization CMU Database Systems - Query Optimization

另一种方法,是decompose,如下面的例子

子句是要获取最大的rating,这个反复去执行一定是低效的,所以,干脆把这个语句拿出来单独执行,结果放在临时表,然后执行主语句的时候把值填回去

CMU Database Systems - Query Optimization CMU Database Systems - Query Optimization


以上所述就是小编给大家介绍的《CMU Database Systems - Query Optimization》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

大教堂与集市

大教堂与集市

[美] Eric S. Raymond / 卫剑钒 / 机械工业出版社 / 2014-5 / 59.00元

当代软件技术领域最重要的著作,中文版首次出版! 《大教堂与集市》是开源运动的《圣经》,颠覆了传统的软件开发思路,影响了整个软件开发领域。作者Eric S. Raymond是开源运动的旗手、黑客文化第一理论家,他讲述了开源运动中惊心动魄的故事,提出了大量充满智慧的观念和经过检验的知识,给所有软件开发人员带来启迪。本书囊括了作者最著名的“五部曲”,并经过作者的全面更新,增加了大量注释,提高了可读......一起来看看 《大教堂与集市》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具