(十三)資料庫查詢處理之QueryExecution(2)

周小倫發表於2021-03-07

(十三)資料庫查詢處理之QueryExecution(2)

實驗室這一週真的忙爆(雖然都是各種打雜的活)所以拖了很久終於在週末(摸魚)把實驗3做完了。同時準備把和查詢這一塊有關的部落格補一下。然後就進入最後一個project並行和鎖那裡。不過下週華為的比賽就開了。爭取四月份之前把這些東西全都搞定。等到四月份的時候開一個新坑(leveldb原始碼閱讀筆記?)


1. 並行和分散式的區別

如今資料庫分佈在多種資源中,以提高DBMS的不同方面

並行DBMS

  1. 資源在物理上靠近
  2. 資源之間可以高速互通
  3. 資源互動是非常廉價和可靠的

分散式DBMS

  1. 各種資源之間可以離得很遠
  2. 資源之間較慢速的互連進行通訊
  3. 通訊成本和問題不容忽視。(也就是很大)

2. 程式模型

1. PROCESS PER WORKER

每一個worker就是一個獨立的程式。worker可以理解為打工人。執行任務

image-20210307215633223

整個流程大致如下

  1. 你的應用程式想要和資料庫進行互動
  2. 通知排程器。排程器會fork一個子程式(也就是產生一個worker)來執行這個任務
  3. 排程器會告訴應用程式你直接和worker進行互動就可
  4. 隨後worker訪問資料庫
  5. worker將得到的結果傳回應用程式

這個模型的好處是。如果一個程式出現了bug整個系統不會出現問題。只需要通知排程器在fork一個程式就好了

2. PROCESS POLL

程式之間仍然共享記憶體。並且依賴於作業系統的排程。每個worker可以使用在程式池中任意的一個程式

image-20210307215648609

3. THREAD PER WORKER

一個程式可以有許多worker執行緒

image-20210307215657760

整個流程大致如下

應用程式直接和worker的執行緒進行互動

優點

  1. 執行緒間的切換比程式間的切換要輕量級的多
  2. 這樣就不需要管理共享記憶體了(因為一個程式的多個執行緒就會共享這個程式的記憶體。這樣我們無需管理多個程式之間的記憶體共享)

注意這並不意味著dbms裡的所有任務一定要多執行緒來執行

DBMS永遠知道的比作業系統更多

image-20210307215703840


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操作然後輸出結果就好

image-20210307215709919


4. INTRA-QUERY PARALLELISM 的方法

1. 方法1 Intra-Operator(水平方法的並行)

將整個查詢操作分解為幾個獨立的片段,這些片段對不同的資料集執行相同的功能

例如下面的例子(截圖警告)

image-20210307215719976

其中A1承擔一小部分任務

image-20210307215730015

image-20210307215743041

每個不同的worker承擔不同的任務

image-20210307215753668

image-20210307215802419

最上面的Exchange操作基本可以分為三個型別

  • case1 Gather

    將來自多個worker的結果合併到一個輸出流中。最上層的Exchange操作必須始終是Gather

  • case2 Repartion

    將多個輸入流重新打亂成多個輸出流

  • case3 Distribute

    將單個輸入流拆分為多個輸出流

image-20210307215809873

對於上面這個比較複雜的例子

  1. 首先A的所有worker和B的所有worker完成Hash join的基本操作
  2. 然後新的4個worker進行探測操作把結果匯入 根節點的Exchange得到結果

2. 方法2 INTER-OPERATOR PARALLELISM(垂直方向)

這也叫做pipelined parallelism.

image-20210307215819606

這種方法非常好理解就是位於下層的worker把得到的結果向上傳遞給上層的worker

3. 方法3 Bushy Parallelism

方法1和2的結合版本

SELECT*FROM A JOIN B JOIN C JOIN D

image-20210307215828058

在這個方法裡一個woker1和worker同時執行整條語句的兩個部分。並且會將執行之後得到的結果往上傳遞給worker3和worker4

因為磁碟的限制。所以使用額外的程式/執行緒可能並不會產生很好的效果。接下來介紹I/O的並行


5. I / O PARALLELISM

1. MULTI-DISK PARALLELISM

擴充閱讀RAID

RAID0形式

不同的page儲存在不同的儲存裝置中

image-20210307215835834

RAID1形式

image-20210307215844805

不同的儲存裝置中儲存著相同的資料。


6. PARTITIONING

邏輯上的一張表。我們可以把它分成幾個獨立的部分放在不同的物理資源中。並且理想情況下分割槽程式應該對使用者是透明的

下面來看兩種不同的劃分方法

1. 垂直劃分

顧名思義就是按照列來劃分。我們可以把不同的列放在不同的物理資源中

image-20210307215902436

2. 水平劃分

水平劃分就是把不同的tuple(元組)放在不同的物理資源中

image-20210307215908177

相關文章