此文章主要向大家講述的是DB2 並行版本中的查詢優化的操作步驟,同時本文也有對查詢優化與查詢計劃生成、所有操作的並行化以及子查詢處理需要注意的問題包括那些內容的描述,以下就是文章的主要內容講述。
查詢
1、簡介
SN, GAMMA, BUBBA,
SM, XPRS
DB2 Parallel Edition(DB2 PE) 運行於 AIX 並行機上,例如 SP2 等。它基於 SN 的體系結構和 Function Shipping 執行模型,提供了可擴展性和大處理能力。基於代價優化,其代價考慮了 CPU 、 IO 和消息傳遞。保證 ACID 特性,並行化的工具包括:
Load,Import,Reorganize Data,Create Index。還提供了一個並行數據重組織工具 Redistribute 有效的更正和處理負載不均衡。 Function shipping 指的是在數據存儲地點進行相應的數據操作,進行必要的數據過濾,從而減少網絡之間傳遞的數據量。系統設置了服務協調者,負責接受用戶輸入的 SQL 語句、分發查詢執行任務和返回最終結果。除此之外,需要做的工作有:
生成並行DB2 並行版本中的查詢執行計劃、數據和控制流、進程管理、並行事務和封鎖管理、並行工具。
支持 HASH 數據分片,擴展了 DDL :
- CREATE NODEGROUP GROUP_1 ON ONODES(1 TO 32,40,45,48);
- CREATE TABLE PARTS(Partkey integer, Partno integer) IN GROUP_1
- PARTITIONING KEY(Partkey) USING HASHING;
- CREATE TABLE PARTSUPP(Partkey integer, Suppkey integer) IN GROUP_1
- PARTITIONING KEY(Partkey) USING HASHING;
HASH 函數是系統內置的。不同表在分片列上屬性值相同的元組被劃分到同一個結點。這樣的表稱為 collocated 。於是在這些表上的等值連接稱為 collocated joins 。例如 PARTSx (Partkey=Partkey) PARTSUPP 。
2 、查詢優化
(1) 代價優化——考慮了操作的固有並行性和消息通訊的代價;
(2) 綜合利用數據分布信息——利用基表和中間結果表的數據分布和分片信息;
(3) 透明的並行性——幾乎不需要從重寫查詢。
2.1 擴展的操作符
系統可以利用串行版本的基本操作,例如 Scan 等,但是還需要擴展:
(1) 用於控制多個子任務協同執行的操作——協調者;
(2) 進程間通訊操作 send/receive , send 可以是廣播或者單播, receive 可以是 merge 多個有序的輸入,也可以是 FIFO。
2.2 分片方法
DB2 的分片方法可以看作一個有效的負載均衡工具。優化器充分利用分片和結點組的信息,優化查詢,例如 collocated joins。
2.3 查詢優化和查詢計劃生成
查詢優化器所做的主要工作有: 1) 選擇優化的連接次序, 2) 確定基本表的存取方法和連接方式, 3) 決定操作的執行結點,例如數據的重新分片, 4) 計算查詢執行代價要考慮系統資源消耗和響應時間。 DB2 PE 采用了簡化的規則:
1) 在自底向上產生DB2 並行版本中的查詢執行計劃的時候,累計每個結點所占用的系統資源,其中的最大值作為系統響應時間。忽略了協調者的執行代價,以及多進程干擾的復雜性;
2) 在所有可能執行連接的節點子集中決定執行結點時,只考慮其中的一部分結點,例如內表分片所在的結點,外表分片所在的結點,以及其他的一些結點沒有具體的說明)。由此簡化了計劃生成的搜索空間,保持在串行搜索空間的線性比例上。
連接操作的執行方法包括: collocated, directed, broadcast, repartitioned 。 directed join 指的是連接在一個輸入關系所在的節點進行,而把另外一個關系的元組發送到適當的節點例如在一個輸入關系的分片屬性上做等值連接)。 repartitioned join 指的是重新分布輸入的連個關系,例如做等值連接時。 broadcat join 指的是在連接之前把其中一個關系的元組廣播到另一個關系所在的節點組,這可以對應於任意類型的連接。
基於代價的優化——兩階段優化不再適合。數據分片和放置對查詢計劃的選擇有很大的影響。
2.4 所有操作的並行化
1、聚集操作——在各個子任務執行聚集函數,必要時在全局執行最後的處理。對 Group By 子局來說,重新分片可能比直接采用輸入數據具有更好的並行性。
2、集合操作——采用 collocated, repartitioned 策略。注意 UNION 可以是一個 N 元操作。
3、帶有子查詢的 Insert 語句, Update 和 Delete 語句—— Insert 語句和子查詢可能是 collocated 。或者采用 directing 方式。 Update 和 Delete 總是和相應的查詢 collocated Update 如果發生在分片屬性上,還需要考慮重新分片受到影響的元組)。
4、外連接——主要的策略與普通的連接一致,但是要避免產生多個由於沒有匹配元組而產生的結果元組。
5、子查詢——把子查詢的結果發送到計算包含子查詢的謂詞的節點采用 collocated, directed, broadcast 方法。
3. 子查詢的處理
嵌套查詢的例子:
- select *
- from t1
- where t1.a in (select b
- from t2
- where t2.c = t1.a and t2.d in (select b
- from t3
- where t3.a = 10
- ));
最裡面的子查詢只需要執行一次即可。但是下面的查詢則不然:
- select *
- from t1
- where t1.a in ( select b
- from t2
- where t2.c = t1.a and t2.d in ( select b
- from t3
- where t3.a = t1.f
- ));
子查詢處理需要注意的問題包括:
(1) 避免為每個外查詢產生的元組啟動一個子DB2 並行版本中的查詢,這樣的代價太大了;
(2) 保證產生外查詢元組的不同節點不會因為子查詢的執行而串行化;
(3) 保證正確的外查詢節點得到執行的結果;
(4) 盡量下移謂詞,從而減少數據的傳輸。