DB2分區(qū)數(shù)據(jù)庫數(shù)據(jù)分布傾斜現(xiàn)象與重新分布
以下的文章主要向大家講述的是DB2分區(qū)數(shù)據(jù)庫中的相關(guān)數(shù)據(jù)分布傾斜現(xiàn)象與重新分布的實際操作方法的描述,你如果對DB2分區(qū)數(shù)據(jù)庫中的相關(guān)數(shù)據(jù)分布傾斜現(xiàn)象與重新分布的實際操作方法的描述有興趣的話你就可以點擊以下的文章進行觀看了。
數(shù)據(jù)庫, 分區(qū), 現(xiàn)象數(shù)據(jù)庫, 分區(qū), 現(xiàn)象
環(huán)境
產(chǎn)品:DB2 UDB
平臺:跨平臺
軟件:V8,V9
問題
主要描述了DB2分區(qū)數(shù)據(jù)庫中的數(shù)據(jù)分布不均現(xiàn)象,以及如何對數(shù)據(jù)進行重新分布的方法。
解答
DB2的數(shù)據(jù)庫分區(qū)功能使用戶能更具靈活的控制數(shù)據(jù)的分布,通過對分區(qū)鍵(partition key)的選擇,用戶可以控制他們數(shù)據(jù)的分布,同時也能通過選擇分區(qū)組(partition group)決定把他們的數(shù)據(jù)分布在哪些分區(qū)上,此外還提供了一個分區(qū)鍵在分區(qū)上的詳細分區(qū)映射(partition map)。
分區(qū)數(shù)據(jù)庫通過提供對分布在各個分區(qū)上的數(shù)據(jù)的并發(fā)訪問,提高了應(yīng)用程序訪問操作的性能,但這同時也增加了分區(qū)數(shù)據(jù)庫日常維護的復(fù)雜性.
數(shù)據(jù)在DB2分區(qū)數(shù)據(jù)庫的存取分布策略是用分區(qū)鍵值通過哈希算法(hashing algorithm)得到的值,根據(jù)對應(yīng)的分區(qū)映射(partition map)散列到各個分區(qū)的.而用戶數(shù)據(jù)的差異以及分區(qū)鍵選擇的不合理導(dǎo)致最終的分布往往發(fā)生數(shù)據(jù)傾斜(data skew).
下面這個例子是一個兩臺物理機器4個邏輯節(jié)點的數(shù)據(jù)庫,我向一個空表導(dǎo)入10240條數(shù)據(jù)(由1-20的int數(shù)字循環(huán)組成)后查看數(shù)據(jù)在各個分區(qū)節(jié)點中的分布情況是:
例1:
- db2 "select dbpartitionnum(i),count(*) from load_dpf group by dbpartitionnum(i) order by dbpartitionnum(i)"
可以看到數(shù)據(jù)并沒有在各個節(jié)點上均勻分布,而是發(fā)生了一定的數(shù)據(jù)傾斜(data skew)。通常情況下,數(shù)據(jù)在分區(qū)中的分布都會發(fā)生一定的傾斜,如果傾斜程度不大,就不會有太大影響,所以不用人為干預(yù),但是在下面所列情況下就需要對數(shù)據(jù)在各分區(qū)的分布進行調(diào)整了:
A. 如果傾斜過大,將會使系統(tǒng)I/O的負荷也隨之傾斜,導(dǎo)致某些分區(qū)的I/O過大而產(chǎn)生瓶頸,而不能均勻發(fā)揮所有I/O的性能.在這種情況下需要人為干預(yù),利用redistribute partition group 命令來重新分布數(shù)據(jù).
B. 如果需要從分區(qū)組中移出某個分區(qū),也同樣需要利用redistribute partition group 命令來重新分布數(shù)據(jù),把數(shù)據(jù)從那個即將移出的分區(qū)上重新分布到其他分區(qū).
C. 將一個新的分區(qū)加入分區(qū)組后,同樣需要把其他分區(qū)上的數(shù)據(jù)分布到新添加分區(qū),類似rebalance操作.
下面是redistribute的語法:
其中各個參數(shù)的詳細解釋可以參閱信息中心的相關(guān)解釋:
http://publib.boulder.ibm.com/in ... /core/r0002069.htm?
默認分區(qū)映射如下:
1. UNIFORM : 這種形式的重分布是將數(shù)據(jù)盡量均勻的分布到各個哈希分區(qū)(hash partition)(hash partition 共有4096個)。雖然數(shù)據(jù)均勻分布到各個哈希分區(qū)(hash partition)上,但是同樣的哈希分區(qū)(hash parititon)數(shù)并不一定映射到每個數(shù)據(jù)庫分區(qū)(database partition)上.在重分布完成后,各個數(shù)據(jù)庫分區(qū)將擁有相近的哈希分區(qū)(hash partition)個數(shù)
在分區(qū)鍵值沒有發(fā)生傾斜的時候,UNIFORM能夠?qū)?shù)據(jù)接近平均的分布到每個數(shù)據(jù)庫分區(qū)上,所以此方法大多數(shù)用于第上面C類情況.
2. USING DISTFILE : 這種形式的分布多用于分區(qū)鍵本身的值就已經(jīng)發(fā)生了傾斜,如上例1的分區(qū)鍵就是1-20的循環(huán)數(shù)字.在這種情況下,根據(jù)hash算法產(chǎn)生的結(jié)果發(fā)生了傾斜.這時候就需要人工指定一個分布文件來替代系統(tǒng)產(chǎn)生的結(jié)果.#p#
這個文件包含4096個值(類似如下命令產(chǎn)生的分布文件 dist.out 文件),用于標記每個hash分區(qū)的權(quán)重.這些值的總和要大于0不大于4,294,967,295。
如:
- 1024
- 0
- 412
- ...
- 612
- ...
- ...
- 2048
這個文件可以按上面格式手工生成,但是通常情況下是利用load對分區(qū)導(dǎo)入的analyze模式來生成的。
首先用 db2gpmap -d <db name> -g <partition group> 生成作為分區(qū)映射的 mygroup.out 文件,然后執(zhí)行:
- db2 "load from load.del of del messages msg.txt replace into load_dpf partitioned db config mode
analyze map_file_input mygroup.out map_file_output analyze.out distfile dist.out"
此方法可以認為干預(yù)現(xiàn)有數(shù)據(jù)的分布,但是無法改變后續(xù)數(shù)DB2分區(qū)數(shù)據(jù)庫據(jù)分布策略.所以如果可能還是調(diào)整分區(qū)鍵重新選擇合適的分區(qū)鍵.
例2:
- [db2inst1@rhel5 tmp]$ db2 "redistribute database partition group ibmdefaultgroup using distfile dist.out"
- [db2inst1@rhel4 tmp]$ db2 "select dbpartitionnum(i),count(*) from load_dpf group by dbpartitionnum(i) order by dbpartitionnum(i)"
- [db2inst1@rhel4 tmp]$ db2 "insert into load_dpf values(1234)"
- DB20000I The SQL command completed successfully.
- [db2inst1@rhel4 tmp]$ db2 "insert into load_dpf values(1234324)"
- DB20000I The SQL command completed successfully.
- [db2inst1@rhel4 tmp]$ db2 "insert into load_dpf values(123123)"
- DB20000I The SQL command completed successfully.
- [db2inst1@rhel4 tmp]$ db2 "select dbpartitionnum(i),count(*) from load_dpf group by dbpartitionnum(i) order by dbpartitionnum(i)"
從上面結(jié)果可以看出新插入的數(shù)據(jù)并沒有根據(jù)dist.out的權(quán)重策略去分配,數(shù)據(jù)依然是根據(jù)分區(qū)鍵的哈希(hash)值對應(yīng)的分區(qū)映射來分布的.
3. USING TARGETMAP : 用目標分區(qū)映射來進行重分布主要適用于類型B,通過人工調(diào)整可以把某個分區(qū)的數(shù)據(jù)分布到其他分區(qū)上。
例3:
如果手工把分區(qū)映射中0號節(jié)點替換成2號節(jié)點,分區(qū)映射文件 mygroup.out 內(nèi)容類似:
- 2 1 2 3 2 1 2 3 2 1 2 3 2 1 2 3 2 1 2 3 2 1 2 3 2 1 2 3 2 1 ...
則運行:
- db2 "redistribute database partition group ibmdefaultgroup using targetmap mygroup.out"
的結(jié)果是:
如果用如上的load的分析功能對mygroup.out分區(qū)映射產(chǎn)生的新分區(qū)映射analyze.out進行重分布的結(jié)果是:
從上面結(jié)果可以看出load加analyze選項的分析結(jié)果比原始文件更加優(yōu)化,所以建議使用load分析功能對分區(qū)映射進行進一步的優(yōu)化后再進行重分布.
NOTE:
在做完 REDISTRIBUTE DATABASE PARTITION GROUP 操作后,需要運行 RUNSTATS 來更新統(tǒng)計信息.由于REDISTRIBUTE對表的數(shù)據(jù)操作是作為一個完整的事務(wù),所以如果表的數(shù)據(jù)量很大,則需要提前調(diào)高活動日志大小或數(shù)目.
REDISTRIBUTE DATABASE PARTITION GROUP 在db2v9.5中得到了增強,原來添加和刪除節(jié)點是和redistribute 操作分開的,在db2v9.5中被整合成redistribute的一部分"Add/Drop DB partition",減少了操作步驟,大大方便了用戶的操作.以上的相關(guān)內(nèi)容就是對DB2分區(qū)數(shù)據(jù)庫中的相關(guān)數(shù)據(jù)分布傾斜現(xiàn)象與重新分布的實際操作方法的介紹,望你能有所收獲。
【編輯推薦】
- DB2***SQL性能調(diào)節(jié)技術(shù)經(jīng)典版
- IBM DB2數(shù)據(jù)庫與注意事項_DB2編程的描述
- DB2 并行版本中的查詢優(yōu)化登峰造極!
- 對DB2 增量備份的正確運用描述
- DB2 存儲過程的異常處理器類型有幾種?