GaussDB Hash表分布列选择原则及数据倾斜检测
點(diǎn)擊上方"藍(lán)字"
關(guān)注我們吧!
GaussDB如果采用分布式部署模式,則可以根據(jù)數(shù)據(jù)量以及用途定義兩種不同分布方式的表,分別為復(fù)制表(Replication)和哈希(Hash)表。
復(fù)制表(Replication)是將表中的全量數(shù)據(jù)在集群的每一個DN實(shí)例上保留一份,主要適用于數(shù)據(jù)量較小的表。這種存儲方式的優(yōu)點(diǎn)是每個DN上都有此表的全量數(shù)據(jù),在Join操作中可以避免數(shù)據(jù)重分布操作,從而減小網(wǎng)絡(luò)開銷。缺點(diǎn)是每個DN都保留了表的完整數(shù)據(jù),造成數(shù)據(jù)的冗余。一般情況下只有較小的維度表才會定義為Replication表。
哈希(Hash)表是將表中某一個或幾個字段進(jìn)行hash運(yùn)算后,生成對應(yīng)的hash值,根據(jù)DN實(shí)例與哈希值的映射關(guān)系獲得該元組的目標(biāo)存儲位置。對于Hash分布表,在讀/寫數(shù)據(jù)時可以利用各個節(jié)點(diǎn)的IO資源,大大提升表讀/寫速度。一般情況下大表定義為Hash表。
Hash分布表的分布列選取至關(guān)重要,需要滿足以下原則:
(1)列值應(yīng)比較離散,以便數(shù)據(jù)能夠均勻分布到各個DN。例如,考慮選擇表的主鍵為分布列,如在人員信息表中選擇身份證號碼為分布列。
(2)在滿足第一條原則的情況下盡量不要選取存在常量filter的列。例如,表dwcjk相關(guān)的部分查詢中出現(xiàn)dwcjk的列zqdh存在常量的約束(例如zqdh=’000001’),那么就應(yīng)當(dāng)盡量不用zqdh做分布列。
(3)在滿足前兩條原則的情況下,考慮選擇查詢中的連接條件為分布列,以便Join任務(wù)能夠下推到DN中執(zhí)行,且減少DN之間的通信數(shù)據(jù)量。
(4)一般不建議新增一列專門用作分布列,尤其不建議新增一列且用SEQUENCE的值來填充做為分布列,因?yàn)镾EQUENCE可能會帶來性能瓶頸和不必要的維護(hù)成本。
對于Hash分布表策略,如果分布列選擇不當(dāng),可能導(dǎo)致數(shù)據(jù)傾斜,查詢時出現(xiàn)部分DN的I/O短板,從而影響整體查詢性能。因此在采用Hash分布表策略之后需對表的數(shù)據(jù)進(jìn)行數(shù)據(jù)傾斜性檢查,以確保數(shù)據(jù)在各個DN上是均勻分布的。
GaussDB中提供了1個視圖pgxc_get_table_skewness,可以查詢數(shù)據(jù)庫中所有schema下的表在各個DN的分布情況以及傾斜率,雖然可以通過schemaname和tablename查詢指定表的傾斜情況,但該視圖查詢時耗時較長,僅適用于數(shù)據(jù)量較小的表(10W以下),尤其不建議不增加條件查詢所有表的數(shù)據(jù)傾斜情況。該視圖各個字段說明如下:
除此之外,可以使用函數(shù)table_skewness()和table_distribution()查詢指定表的數(shù)據(jù)傾斜情況。在使用table_skewness()時,如果不指定具體字段,默認(rèn)查詢當(dāng)前分布列的數(shù)據(jù)傾斜程度,則該函數(shù)可以用來評估表的其他字段分布傾斜情況。同樣,當(dāng)表的數(shù)據(jù)量巨大時,這兩個函數(shù)查詢耗時都比較長。因此對于一張數(shù)據(jù)量較大的表,一般使用如下語句查詢其數(shù)據(jù)傾斜情況:
select xc_node_id, count(1) from tablename group by xc_node_id order by xc_node_id desc;如果需要查詢數(shù)據(jù)庫中傾斜的表,除了使用上面提到的視圖pgxc_get_table_skewness,還可以通過排查各個DN實(shí)例數(shù)據(jù)存儲目錄的大小以及數(shù)據(jù)文件來找出傾斜的表,這也是實(shí)際應(yīng)用中比較常用的方法。
具體方法及步驟如下:
(1)在所有節(jié)點(diǎn)上執(zhí)行df –h查看各個DN數(shù)據(jù)目錄使用率是否有接近,找到使用率明顯較大的磁盤目錄。
(2)通過 cm_ctl query –Cvd 確認(rèn)該磁盤節(jié)點(diǎn)對應(yīng)的DN實(shí)例(如上一步檢查為slave磁盤占用率過大,則需要查看與該備實(shí)例對應(yīng)的主實(shí)例磁盤使用情況),確認(rèn)DN實(shí)例端口號。可通過以下方式查詢DN實(shí)例端口號:
select * from pgxc_node; 或者 cat DN實(shí)例數(shù)據(jù)目錄/postgresql.conf |grep Port(3)進(jìn)入實(shí)例base目錄,執(zhí)行du -ak | sort -nr | more查找文件大小為1GB,且文件前綴數(shù)字ID相同的文件,查找相同文件數(shù)量最多的文件,記錄其ID值及其所在文件目錄ID值。
(4)通過gsql連接DN實(shí)例,并通過文件目錄ID確認(rèn)表所屬數(shù)據(jù)庫。
select oid,* from pg_database where oid='1642599';(5)切換至該數(shù)據(jù)庫,通過文件的ID確認(rèn)表名稱,執(zhí)行如下SQL:
select relname from pg_class where relfilenode = 3308672;(6)根據(jù)表名稱進(jìn)一步確認(rèn)該表所屬schema,執(zhí)行如下SQL:
SELECT n.nspname as "Schema", c.relname as "Name" FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE relname = 'insured';(7)通過gsql連接CN實(shí)例,最后再通過table_skewness()函數(shù)進(jìn)行核實(shí)確認(rèn)。
墨天輪原文鏈接:https://www.modb.pro/db/73760(復(fù)制鏈接至瀏覽器或點(diǎn)擊文末閱讀原文查看)
END
推薦閱讀:267頁!2020年度數(shù)據(jù)庫技術(shù)年刊
推薦下載:2020數(shù)據(jù)技術(shù)嘉年華PPT下載
2020數(shù)據(jù)技術(shù)嘉年華近50個PPT下載、視頻回放已上傳墨天輪平臺,可在“數(shù)據(jù)和云”公眾號回復(fù)關(guān)鍵詞“2020DTC”獲得!
你知道嗎?我們的視頻號里已經(jīng)發(fā)布了很多精彩的內(nèi)容,快去看看吧!↓↓↓
點(diǎn)擊下圖查看更多 ↓
云和恩墨大講堂 |?一個分享交流的地方
長按,識別二維碼,加入萬人交流社群
請備注:云和恩墨大講堂
? 點(diǎn)個“在看”?
你的喜歡會被看到?
總結(jié)
以上是生活随笔為你收集整理的GaussDB Hash表分布列选择原则及数据倾斜检测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

- 上一篇: 图片怎样把背景去掉?怎么把图片背景透明?
- 下一篇: 【Python精彩案例】随拍文档转PDF