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