承接上篇,本文深入實演 `REDISTRIBUTE DATABASE PARTITION GROUP` 的兩大進階模式:DISTFILE 自定義權重分佈與 TARGETMAP 目標映射節點替換,並揭示「重分佈僅搬移現有數據、不改變未來分佈策略」的核心限制。
當分區鍵本身分佈極不均(如性別、狀態碼、少數熱門值),Hash 算法會將大量數據集中於少數 Hash Partition(共 4096 個),導致對應 Database Partition I/O 熱點。DISTFILE 允許 DBA 手工指定每個 Hash Partition 的「權重」,將其重新映射至較閒的 Database Partition。
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"
db2 "REDISTRIBUTE DATABASE PARTITION GROUP ibmdefaultgroup USING DISTFILE dist.out"
重分佈完成後,查詢 `SELECT DBPARTITIONNUM(key), COUNT(*) FROM table GROUP BY DBPARTITIONNUM(key)` 可見數據已按新權重分佈。但新插入數據仍按原 Hash 映射分佈(驗證:`INSERT` 後再查分佈,未遵循 `dist.out`),因為 `REDISTRIBUTE` 僅搬移現有數據,**不修改分區映射表**。若需永久改變分佈策略,必須重新選擇分區鍵並重建表。
適用於:從分區組移除節點(類型 B)、或人工將某節點數據遷移至其他節點。核心操作是編輯分區映射檔(`mygroup.out`),將目標節點號替換為其他節點號。
db2 "REDISTRIBUTE DATABASE PARTITION GROUP ibmdefaultgroup USING TARGETMAP mygroup.out"
結果:原屬節點 0 的所有 Hash Partition 現映射至節點 2,數據隨之搬移。若先用 `LOAD ANALYZE` 對修改後的映射優化(產出 `analyze.out`),再用 `analyze.out` 執行重分佈,分佈會更均勻——建議永遠加上 ANALYZE 步驟。

結語:DISTFILE 解決「熱鍵傾斜」、TARGETMAP 解決「節點退役/手工調整」,兩者皆屬存量數據一次性搬移。長效治理傾斜,核心在於分區鍵選型(高基數、均勻分佈);若業務鍵天然傾斜,考慮引入雜湊函數或複合分區鍵,從源頭消除傾斜,而非依賴事後重分佈。