(十三)資料庫查詢處理之QueryExecution(2)
實驗室這一週真的忙爆(雖然都是各種打雜的活)所以拖了很久終於在週末(摸魚)把實驗3做完了。同時準備把和查詢這一塊有關的部落格補一下。然後就進入最後一個project並行和鎖那裡。不過下週華為的比賽就開了。爭取四月份之前把這些東西全都搞定。等到四月份的時候開一個新坑(leveldb原始碼閱讀筆記?)
1. 並行和分散式的區別
如今資料庫分佈在多種資源中,以提高DBMS的不同方面
並行DBMS
- 資源在物理上靠近
- 資源之間可以高速互通
- 資源互動是非常廉價和可靠的
分散式DBMS
- 各種資源之間可以離得很遠
- 資源之間較慢速的互連進行通訊
- 通訊成本和問題不容忽視。(也就是很大)
2. 程式模型
1. PROCESS PER WORKER
每一個worker就是一個獨立的程式。worker可以理解為打工人。執行任務
整個流程大致如下
- 你的應用程式想要和資料庫進行互動
- 通知排程器。排程器會
fork
一個子程式(也就是產生一個worker)來執行這個任務 - 排程器會告訴應用程式你直接和worker進行互動就可
- 隨後worker訪問資料庫
- worker將得到的結果傳回應用程式
這個模型的好處是。如果一個程式出現了bug整個系統不會出現問題。只需要通知排程器在fork一個程式就好了
2. PROCESS POLL
程式之間仍然共享記憶體。並且依賴於作業系統的排程。每個worker可以使用在程式池中任意的一個程式
3. THREAD PER WORKER
一個程式可以有許多worker執行緒
整個流程大致如下
應用程式直接和worker的執行緒進行互動
優點
- 執行緒間的切換比程式間的切換要輕量級的多
- 這樣就不需要管理共享記憶體了(因為一個程式的多個執行緒就會共享這個程式的記憶體。這樣我們無需管理多個程式之間的記憶體共享)
注意這並不意味著dbms裡的所有任務一定要多執行緒來執行
DBMS永遠知道的比作業系統更多
3. INTER-VS INTRA-QUERY PARALLELISM
1. I N T E R-Q U E R Y P A R A L L E L I S M
通過允許多條查詢同時進行來提高整體的效能。
如果多條查詢語句只是讀資料庫的話,那我們在不同的查詢之間幾乎不需要加任何限制條件
但是如果寫操作比較多的話就很麻煩了
2. I N T R A-Q U E R Y P A R A L L E L I S M
這個就是流水線操作。csapp第四章講的非常清楚
通過並行執行單條查詢語句來提高單個查詢的效能。可以從生產者消費者的角度來理解
下面來看一個例子 -> PARALLEL GRACE HASH JOIN
這個非常簡單我們讓一個worker去執行一行的join操作然後輸出結果就好
4. INTRA-QUERY PARALLELISM 的方法
1. 方法1 Intra-Operator(水平方法的並行)
將整個查詢操作分解為幾個獨立的片段,這些片段對不同的資料集執行相同的功能
例如下面的例子(截圖警告)
其中A1承擔一小部分任務
每個不同的worker承擔不同的任務
最上面的Exchange操作基本可以分為三個型別
-
case1 Gather
將來自多個worker的結果合併到一個輸出流中。最上層的Exchange操作必須始終是Gather
-
case2 Repartion
將多個輸入流重新打亂成多個輸出流
-
case3 Distribute
將單個輸入流拆分為多個輸出流
對於上面這個比較複雜的例子
- 首先A的所有worker和B的所有worker完成Hash join的基本操作
- 然後新的4個worker進行探測操作把結果匯入 根節點的Exchange得到結果
2. 方法2 INTER-OPERATOR PARALLELISM(垂直方向)
這也叫做pipelined parallelism.
這種方法非常好理解就是位於下層的worker把得到的結果向上傳遞給上層的worker
3. 方法3 Bushy Parallelism
方法1和2的結合版本
SELECT*FROM A JOIN B JOIN C JOIN D
在這個方法裡一個woker1和worker同時執行整條語句的兩個部分。並且會將執行之後得到的結果往上傳遞給worker3和worker4
因為磁碟的限制。所以使用額外的程式/執行緒可能並不會產生很好的效果。接下來介紹I/O的並行
5. I / O PARALLELISM
1. MULTI-DISK PARALLELISM
擴充閱讀RAID
RAID0形式
不同的page儲存在不同的儲存裝置中
RAID1形式
不同的儲存裝置中儲存著相同的資料。
6. PARTITIONING
邏輯上的一張表。我們可以把它分成幾個獨立的部分放在不同的物理資源中。並且理想情況下分割槽程式應該對使用者是透明的
下面來看兩種不同的劃分方法
1. 垂直劃分
顧名思義就是按照列來劃分。我們可以把不同的列放在不同的物理資源中
2. 水平劃分
水平劃分就是把不同的tuple(元組)放在不同的物理資源中