CMU Database Systems - Query Processing

Query Model

Query处理有三种方式,数据库

首先是Iterator model,这是最基本的model,又称为volcano,pipeline模式express

他是top-down的模式,经过next函数去逐层获取tuple函数

好处是比较简单,而且很容易作limit性能

iterator的例子,
输出一个数据,从top开始调用next,这里第二步须要join,建hashtable,须要把3的数据所有读取上来优化

第二种方式,materialization modellua

反其道,这是一种bottom-up的方式,每一个把数据都准备好后,往上传递3d

这种方式,明显适合TP,对于AP会产生大量的中间结果,code

并且很差控制limit,limit1,底下节点可能也要把全部的数据都读出来blog

Materailization Model的例子,排序

多了个out,来记录返回的全量结果

Vectorization Model

向量化模型,iterator的时候每次取一个batch,而不是一个tuple
这样大大下降next的调用频率,并且能够更好的利用SIMD进行并行处理

Vectorization Model的例子,

加上对out大小的判断以造成batch

3种模型的区别以下,

 

Access Methods

刚刚的查询计划里面,只是说读取数据,可是没有怎么说如何读取数据

Access Methods就是说明如何从数据库中读取数据的

Access Methods也有三种,

Sequentail Scan,Index Scan, Multi-Index/'Bitmap' Scan

Sequential Scan

顺序读,就是一个个page这么读过去,而后用一个内部的cursor去记录读到哪儿了

顺序读会比较慢,但有时是没法避免的

优化的方法以下,

预取,并行化,bypass bufferPool,都是前面说过的优化

 

Zone Maps

在每一个page上加上一些统计信息,又称为pre-computed aggregates

这样我就能够根据这个信息来判断是否须要读这个page

 

Late Materialization

这个只能用于列存,由于列存才能一次读一列,

因此在前两个过滤条件上,咱们只须要把offset传上来,不须要原始数据

到最后一步,才须要把C这一列真正的materialization出来

 

Heap Clustering

Tuples在pages中是按照clustering index排序的,因此根据clustering index进行query是很是高效的

可是若是要按非clustered index的字段进行排序,就是比较低效的

由于tuples会分布在不一样的pages中,你须要混着读

一个优化是,把全部要读的tuples按page id进行排序,而后一个个page顺序读过来会比较高效

 

 

 

Index Scan

关键就是如何pick合适的index来进行查询,这个比较复杂,在后面会详细描述

 

Multi-index Scan

同时用多个index进行索引,

而后对多个索引的结果集,进行union和intersect,最终获得结果

 intersection每每经过bitmaps,hash tables,bloom filters来实现,因此有时也称为Bitmap Scan

 

Expression Evaluation

SQL中的表达式,能够经过expression tree来表示,这种方式很灵活,可是性能比较差,因此比较高效的方式是直接codegen

相关文章
相关标签/搜索