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也有三種,
Sequentail Scan,Index Scan, Multi-Index/'Bitmap' 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順序讀過來會比較高效
關鍵就是如何pick合適的index來進行查詢,這個比較複雜,在後面會詳細描述
同時用多個index進行索引,
而後對多個索引的結果集,進行union和intersect,最終獲得結果
intersection每每經過bitmaps,hash tables,bloom filters來實現,因此有時也稱爲Bitmap Scan
SQL中的表達式,能夠經過expression tree來表示,這種方式很靈活,可是性能比較差,因此比較高效的方式是直接codegen