首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 分區相容性與表並置雙重奏:分散式查詢效能的理論基石與實戰應用

     編輯:DB2 教學

核心概念速覽

概念定義角色
分區相容性相同值經相同散列映射至相同分區類型層面的基礎能力
表並置相關表的相關列位於相同分區物理層面的資料佈局
關係分區相容性是並置的**必要條件**之一相容 → 可並置 → 連接消除

分區相容性完整規則 (摘要)

  • ✅ 整數家族:SMALLINT, INTEGER, BIGINT 互相相容
  • ✅ 浮點家族:REAL, FLOAT 互相相容
  • ✅ 定點數:DECIMAL/NUMERIC 值相同者相容 (忽略精度標度)
  • ✅ 字串家族:CHAR/VARCHAR 不同長度相容 (忽略尾部空白)
  • ✅ 圖形家族:GRAPHIC/VARGRAPHIC 相容
  • ✅ UDT:依來源基礎類型判斷
  • ❌ 日期時間:DATE, TIME, TIMESTAMP 彼此不相容、不與 CHAR 相容
  • ❌ LOB/長類型:不可作分區鍵,無相容性
  • 🔑 NULL 處理:相容類型間完全一致

並置三大必要條件 (再確認)

  1. 同一 DATABASE PARTITION GROUP (非再分配期)
  2. 分區鍵列數相同
  3. 對應列**分區相容**

完整實戰案例:從設計到驗證

場景:電商核心查詢 — 訂單與客戶、商品連接

-- 1. 定義分區群組
CREATE DATABASE PARTITION GROUP PG_CORE ON DBPARTITIONNUMS (0 TO 7);

-- 2. 客戶表:以 CUST_ID (INT) 分區
CREATE TABLE CUSTOMERS (
  CUST_ID INT NOT NULL,
  NAME VARCHAR(100),
  TIER CHAR(1)
) PARTITION BY HASH (CUST_ID) PARTITION GROUP PG_CORE;

-- 3. 訂單表:同樣以 CUST_ID 分區 → 與 CUSTOMERS 並置
CREATE TABLE ORDERS (
  ORDER_ID BIGINT NOT NULL,
  CUST_ID INT NOT NULL,
  ORDER_TS TIMESTAMP,
  TOTAL DECIMAL(12,2)
) PARTITION BY HASH (CUST_ID) PARTITION GROUP PG_CORE;

-- 4. 商品表:以 PROD_ID (BIGINT) 分區 → 與 ORDERS 不並置
CREATE TABLE PRODUCTS (
  PROD_ID BIGINT NOT NULL,
  NAME VARCHAR(200),
  CATEGORY_ID INT
) PARTITION BY HASH (PROD_ID) PARTITION GROUP PG_CORE;

-- 5. 訂單明細:以 ORDER_ID 分區 → 與 ORDERS 並置 (同 ORDER_ID)
CREATE TABLE ORDER_ITEMS (
  ORDER_ID BIGINT NOT NULL,
  PROD_ID BIGINT NOT NULL,
  QTY INT,
  PRICE DECIMAL(10,2)
) PARTITION BY HASH (ORDER_ID) PARTITION GROUP PG_CORE;

查詢效能分析

查詢連接類型並置狀態執行特徵
訂單-客戶 (CUST_ID)並置連接✅ 並置本地雜湊連接,無 SHIP,線性擴展
訂單-明細 (ORDER_ID)並置連接✅ 並置本地雜湊連接,無 SHIP
明細-商品 (PROD_ID)非並置連接❌ 不並置含 SHIP 操作,資料移動至協調節點
訂單-商品 (無直接鍵)非並置連接❌ 不並置雙重 SHIP 或廣播,效能最差

優化策略:針對非並置熱點查詢

  • 方案 A:重新分區商品表 — 改以 CATEGORY_ID 分區 (若查詢常按類別過濾)
  • 方案 B:建立物化查詢表 (MQT) — 預先連接彙總,定期刷新
  • 方案 C:小表廣播 — 若商品表 < 100MB,考慮 REPLICATED MQT 或應用層快取

監控與驗證儀表板指標

-- 1. 並置率統計
SELECT 
  COUNT(*) AS TOTAL_JOINS,
  SUM(CASE WHEN JOIN_TYPE = 'COLLOCATED' THEN 1 ELSE 0 END) AS COLLOCATED_JOINS
FROM TABLE(MON_GET_PKG_CACHE_STMT(NULL,NULL,NULL,-2));

-- 2. 資料移動量監控
SELECT 
  APPL_ID,
  ROWS_READ, ROWS_RETURNED,
  COMM_NETWORK_TIME, COMM_NETWORK_WAITS
FROM TABLE(MON_GET_APPLICATION(NULL, -2))
WHERE COMM_NETWORK_TIME > 1000;

架構演進建議

  1. 新系統:領域驅動設計識別聚合根,以聚合根 ID 為分區鍵,天然實現聚合內並置
  2. 舊系統重構:識別熱點連接 → 分析分區鍵差異 → 低風險表優先調整分區鍵 (配合 REDISTRIBUTE)
  3. 混合負載:OLTP 核心表並置優化 + DW 大表廣播/複製策略

分區相容性是「語言」,表並置是「架構」,連接消除是「效能」。三者合一,構建 DB2 DPF 極致效能的鐵三角。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved