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

相關文章
相關標籤/搜索