- 執行模型
- Iterator Model
- Materialization Model
- Vectoriazation Model
- 對比
- 資料訪問方式
- Sequential Scan
- Index Scan
- Multi-Index Scan
- Halloween Problem
- 表示式求值
執行模型
執行模型(Processing Model)定義了資料庫系統如何執行一個查詢計劃。
Iterator Model
基本思想:採用樹形結構組織運算子,然後中序遍歷執行整棵樹,最終根結點的輸出就是整個查詢計劃的結果。
每個運算子(Operator)實現如下函式:
Next()
- 返回值:一個tuple或者EOF。
- 執行流程:迴圈呼叫孩子結點的
Next()
函式。
Open()
和Close()
:類似於構造和解構函式。
輸出從底部向頂部(Bottom-To-Top)匯聚,且支援流式操作,所以又稱為Valcano Model,Pipeline Model。
Materialization Model
基本思想:運算子不是一次返回一個資料,暫存下所有資料,一次返回給父結點。
相比於Iterator Model,減少了函式呼叫開銷,但是中間結果可能要暫存磁碟,IO開銷大。
可以向下傳遞一些暗示(hint),如Limit
,避免掃描過多的資料。
更適用於OLTP而不是OLAP。
Vectoriazation Model
基本思想:運算子返回一批資料。
結合了Iterator Model和Materialization Model的優勢,既減少了函式呼叫,中間結果又不至於過大。
可以採用SIMD指令加速批資料的處理。
對比
特性 | Iterator Model | Materialization Model | Vectorization Model |
---|---|---|---|
資料處理單位 | 單條記錄(tuple-at-a-time) | 整個中間結果(table-at-a-time) | 批次記錄(vector/batch-at-a-time) |
效能 | 函式呼叫開銷高,效率低 | 延遲高,記憶體/I/O 開銷大 | 函式呼叫開銷低,SIMD 加速效能優異 |
記憶體使用 | 記憶體需求低 | 記憶體需求高 | 中等 |
I/O 開銷 | 低 | 高 | 中等 |
快取利用率 | 差 | 差 | 高 |
複雜性 | 實現簡單 | 中等 | 實現複雜 |
適用場景 | 小型資料集,流式處理 | 中間結果複用的複雜查詢 | 大型資料集,需高效能運算的場景 |
資料訪問方式
主要有三種資料訪問方式:
- 全表掃描(Sequential Scan)
- 索引掃描(Index Scan)
- 多索引掃描(Multi-Index Scan)
Sequential Scan
全表掃描的最佳化手段:
Data Skipping方法:
- 只需要大致結果:取樣估計。
- 精確結果:Zone Map
Zone Map基本思想:化整為零,提前對資料頁進行聚合。
執行 Select * From table Where val > 600
時,下面的頁可以直接跳過。
Index Scan
如何確定使用哪個索引:資料分佈。
Multi-Index Scan
基本思想:根據每個索引上的謂詞,獨立找到滿足條件的資料記錄(Record),然後根據連線謂詞進行操作(並集,交集,差集等)。
Halloween Problem
對於UPDATE語句,需要追蹤更新過的語句,否則會出現級聯更新的問題。
<999, Andy>執行更新,走索引掃描:
- 移除索引
- 更新Tuple,<1099, Andy>
- 插入索引
- (約束檢查)
此時,如果不對<1099, Andy>進行標記,他滿足Where子句,會被重新更新一次。
表示式求值
基本思想:採用樹形結構,構建表示式樹,用中序遍歷方式執行所有求值動作,根結點的求值結果就是最終值。
資料庫中哪些地方採用了樹結構:
- B+樹:儲存。
- 樹形結構+中序遍歷求值:查詢計劃,表示式求值。
最佳化手段:JIT Compilatoin。將熱點表示式計算結點視為函式,編譯為內聯機器碼,而不是每次都遍歷結點。