合理規(guī)劃分布鍵,對表查詢的性能至關(guān)重要,本文介紹分布鍵的選擇策略。

選擇數(shù)據(jù)分布均勻的列或者多個列

若分布鍵數(shù)據(jù)分布不均勻,可能會導(dǎo)致數(shù)據(jù)傾斜。數(shù)據(jù)傾斜會導(dǎo)致部分計算節(jié)點存儲的數(shù)據(jù)過多,查詢負(fù)載大,查詢耗時變長。因此請不要選擇bool類型、時間日期類型的列作為分布鍵。

選擇經(jīng)常需要JOIN的列作為分布鍵

可以實現(xiàn)本地關(guān)聯(lián)(Collocated JOIN)計算(如圖一所示),因為JOIN鍵和分布鍵一致時,可以在計算節(jié)點內(nèi)部完成JOIN。否則需要將一個表進(jìn)行重分布(Redistribute motion)來實現(xiàn)重分布關(guān)聯(lián)(Redistributed Join)(如圖二所示)或者廣播其中小表(Broadcast motion)來實現(xiàn)廣播關(guān)聯(lián)(Broadcast Join)(如圖三所示),重分布關(guān)聯(lián)和廣播關(guān)聯(lián)兩種方式都會產(chǎn)生較大的網(wǎng)絡(luò)開銷。

圖 1. 本地關(guān)聯(lián)
本地關(guān)聯(lián)
圖 2. 重分布關(guān)聯(lián)
重分布關(guān)聯(lián)
圖 3. 廣播關(guān)聯(lián)
廣播關(guān)聯(lián)

盡量選擇高頻率出現(xiàn)的查詢條件列作為分布鍵

選擇經(jīng)常作為查詢條件的列作為分布鍵,可以實現(xiàn)按分布鍵進(jìn)行節(jié)點裁剪。如果建表時未指定分布鍵,則默認(rèn)表的主鍵為分布鍵,如果表沒有主鍵,則默認(rèn)將第一列當(dāng)做分布鍵。

您可以選擇一個或多個列作為分布鍵,示例如下:

create table t1(c1 int, c2 int) distributed by (c1,c2);

謹(jǐn)慎選擇隨機分布DISTRIBUTED RANDOMLY

這將使得上述本地關(guān)聯(lián),或者節(jié)點裁剪不可能實現(xiàn)。