DB2 并行版本中的查詢優(yōu)化登峰造極!
此文章主要向大家講述的是DB2 并行版本中的查詢優(yōu)化的操作步驟,同時本文也有對查詢優(yōu)化與查詢計劃生成、所有操作的并行化以及子查詢處理需要注意的問題包括那些內(nèi)容的描述,以下就是文章的主要內(nèi)容講述。
查詢
1、簡介
SN, GAMMA, BUBBA,
SM, XPRS
DB2 Parallel Edition(DB2 PE) 運行于 AIX 并行機上,例如 SP2 等。它基于 SN 的體系結(jié)構(gòu)和 Function Shipping 執(zhí)行模型,提供了可擴展性和大處理能力?;诖鷥r優(yōu)化,其代價考慮了 CPU 、 IO 和消息傳遞。保證 ACID 特性,并行化的工具包括:
Load,Import,Reorganize Data,Create Index。還提供了一個并行數(shù)據(jù)重組織工具 Redistribute 有效的更正和處理負(fù)載不均衡。 Function shipping 指的是在數(shù)據(jù)存儲地點進(jìn)行相應(yīng)的數(shù)據(jù)操作,進(jìn)行必要的數(shù)據(jù)過濾,從而減少網(wǎng)絡(luò)之間傳遞的數(shù)據(jù)量。系統(tǒng)設(shè)置了服務(wù)協(xié)調(diào)者,負(fù)責(zé)接受用戶輸入的 SQL 語句、分發(fā)查詢執(zhí)行任務(wù)和返回最終結(jié)果。除此之外,需要做的工作有:
生成并行DB2 并行版本中的查詢執(zhí)行計劃、數(shù)據(jù)和控制流、進(jìn)程管理、并行事務(wù)和封鎖管理、并行工具。
支持 HASH 數(shù)據(jù)分片,擴展了 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 函數(shù)是系統(tǒng)內(nèi)置的。不同表在分片列上屬性值相同的元組被劃分到同一個結(jié)點。這樣的表稱為 collocated 。于是在這些表上的等值連接稱為 collocated joins 。例如 PARTSx (Partkey=Partkey) PARTSUPP 。
2 、查詢優(yōu)化
(1) 代價優(yōu)化——考慮了操作的固有并行性和消息通訊的代價;
(2) 綜合利用數(shù)據(jù)分布信息——利用基表和中間結(jié)果表的數(shù)據(jù)分布和分片信息;
(3) 透明的并行性——幾乎不需要從重寫查詢。
2.1 擴展的操作符
系統(tǒng)可以利用串行版本的基本操作,例如 Scan 等,但是還需要擴展:
(1) 用于控制多個子任務(wù)協(xié)同執(zhí)行的操作——協(xié)調(diào)者;
(2) 進(jìn)程間通訊操作 send/receive , send 可以是廣播或者單播, receive 可以是 merge 多個有序的輸入,也可以是 FIFO。
2.2 分片方法
DB2 的分片方法可以看作一個有效的負(fù)載均衡工具。優(yōu)化器充分利用分片和結(jié)點組的信息,優(yōu)化查詢,例如 collocated joins。
2.3 查詢優(yōu)化和查詢計劃生成
查詢優(yōu)化器所做的主要工作有: 1) 選擇優(yōu)化的連接次序, 2) 確定基本表的存取方法和連接方式, 3) 決定操作的執(zhí)行結(jié)點,例如數(shù)據(jù)的重新分片, 4) 計算查詢執(zhí)行代價要考慮系統(tǒng)資源消耗和響應(yīng)時間。 DB2 PE 采用了簡化的規(guī)則:
1) 在自底向上產(chǎn)生DB2 并行版本中的查詢執(zhí)行計劃的時候,累計每個結(jié)點所占用的系統(tǒng)資源,其中的***值作為系統(tǒng)響應(yīng)時間。忽略了協(xié)調(diào)者的執(zhí)行代價,以及多進(jìn)程干擾的復(fù)雜性;
2) 在所有可能執(zhí)行連接的節(jié)點子集中決定執(zhí)行結(jié)點時,只考慮其中的一部分結(jié)點,例如內(nèi)表分片所在的結(jié)點,外表分片所在的結(jié)點,以及其他的一些結(jié)點(沒有具體的說明)。由此簡化了計劃生成的搜索空間,保持在串行搜索空間的線性比例上。
連接操作的執(zhí)行方法包括: collocated, directed, broadcast, repartitioned 。 directed join 指的是連接在一個輸入關(guān)系所在的節(jié)點進(jìn)行,而把另外一個關(guān)系的元組發(fā)送到適當(dāng)?shù)墓?jié)點(例如在一個輸入關(guān)系的分片屬性上做等值連接)。 repartitioned join 指的是重新分布輸入的連個關(guān)系,例如做等值連接時。 broadcat join 指的是在連接之前把其中一個關(guān)系的元組廣播到另一個關(guān)系所在的節(jié)點組,這可以對應(yīng)于任意類型的連接。
基于代價的優(yōu)化——兩階段優(yōu)化不再適合。數(shù)據(jù)分片和放置對查詢計劃的選擇有很大的影響。
2.4 所有操作的并行化
1、聚集操作——在各個子任務(wù)執(zhí)行聚集函數(shù),必要時在全局執(zhí)行***的處理。對 Group By 子局來說,重新分片可能比直接采用輸入數(shù)據(jù)具有更好的并行性。
2、集合操作——采用 collocated, repartitioned 策略。注意 UNION 可以是一個 N 元操作。
3、帶有子查詢的 Insert 語句, Update 和 Delete 語句—— Insert 語句和子查詢可能是 collocated 。或者采用 directing 方式。 Update 和 Delete 總是和相應(yīng)的查詢 collocated ( Update 如果發(fā)生在分片屬性上,還需要考慮重新分片受到影響的元組)。
4、外連接——主要的策略與普通的連接一致,但是要避免產(chǎn)生多個由于沒有匹配元組而產(chǎn)生的結(jié)果元組。
5、子查詢——把子查詢的結(jié)果發(fā)送到計算包含子查詢的謂詞的節(jié)點采用 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
 - ));
 
最里面的子查詢只需要執(zhí)行一次即可。但是下面的查詢則不然:
- 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) 避免為每個外查詢產(chǎn)生的元組啟動一個子DB2 并行版本中的查詢,這樣的代價太大了;
(2) 保證產(chǎn)生外查詢元組的不同節(jié)點不會因為子查詢的執(zhí)行而串行化;
(3) 保證正確的外查詢節(jié)點得到執(zhí)行的結(jié)果;
(4) 盡量下移謂詞,從而減少數(shù)據(jù)的傳輸。
【編輯推薦】
- DB2在線備份,以及重定向恢復(fù)實戰(zhàn)演習(xí)!
 - DB2數(shù)據(jù)庫備份,恢復(fù)命令的操作經(jīng)驗總結(jié)
 - DB2 Online備份的操作方案“盛宴”
 - DB2重定向恢復(fù)失敗“水到渠成”
 - 備份DB2數(shù)據(jù)庫在AIX上誰說很拽?
 















 
 
 
 
 
 
 