DB2中合理使用 INCLUDE
關鍵字創建索引
1. 為何還需要 INCLUDE
?——從索引的兩大痛點說起
- 查詢想“只讀索引不回表”,卻又不想把列都做鍵 → 聯合索引空間膨脹,更新放大。
- 唯一索引定位快,但只能返回鍵列數據 → 仍需 I/O 跳回數據頁。
INCLUDE
的意義就在于:在保持唯一鍵簡潔的同時,再帶幾列數據放進索引葉子頁,讓查詢可以“即取即用”而不訪問表。
2. 三個核心概念先厘清
名稱 | 作用 | 關鍵特征 |
---|---|---|
唯一索引 (UNIQUE ) | 保證列組合全球唯一 | 鍵列全部參與排序與唯一性 |
聯合索引 | 多列都做鍵 | 列越多,索引頁越大,寫放大越高 |
INCLUDE 列 | 將非鍵列復制到葉子頁 | 不排序、不唯一,但可被查詢直接讀取 |
一句話:
INCLUDE
= “唯一索引 + 列副本”,便于 Index-Only Scan。
3. INCLUDE
的語法限制與能力邊界
只有唯一索引能用,并且一次可以帶多個列。
維度 | Db2 限制 | 說明 |
---|---|---|
可用索引類型 | 僅 CREATE UNIQUE INDEX | 在非唯一索引上無法使用 |
可含列數 | 受“索引總列數”上限(64–128 列) | 鍵列 + INCLUDE 列合計 |
列參與排序? | 否 | 仍只對鍵列排序 |
唯一性檢查 | 僅檢查鍵列 | INCLUDE 列不參與 |
多列示例
CREATE UNIQUE INDEX idx_order_pkON orders(order_id) -- 唯一鍵INCLUDE (customer_id, order_date, amount); -- 三個附加列
4. 典型實戰:主鍵范圍查詢 + 覆蓋字段
SELECT cust_name
FROM temp.customer
WHERE cust_num BETWEEN '0007000000' AND '0007200000';
- 高選擇度主鍵:
cust_num
- 額外讀取字段:
cust_name
索引 | Timerons | 存儲 |
---|---|---|
UNIQUE(cust_num) INCLUDE(cust_name) | 12 338.7 | 小 |
聯合索引 (cust_num, cust_name) | 12 363.1 | 大 |
洞察:兩者返回速度幾乎相同,但
INCLUDE
版更輕、更易維護,因為cust_name
不參與排序。
5. 何時用 / 何時不用 INCLUDE
——決策表
場景 | 建議 |
---|---|
WHERE 已含唯一鍵,且只取 1–3 個小字段 | 用 INCLUDE |
字段更新頻率高或體積大 (BLOB/CLOB) | 避免 INCLUDE |
需要按附加列排序 / 分組 | 建聯合索引并把排序列放首位 |
非唯一索引場景 | 無法用 INCLUDE ,只能聯合索引 |
6. 創建示例與常見坑位
CREATE UNIQUE INDEX idx_customer_pkON temp.customer (cust_num) -- 鍵列INCLUDE (cust_name, created_at) -- 多列PCTFREE 10; -- 預留空間
易踩坑
- 把大字段放進
INCLUDE
? 索引頁變“胖”,I/O 暴漲。 - 把更新頻繁字段放進
INCLUDE
? 每次 UPDATE 都寫索引頁。 - 忘記唯一限制 ? 編譯報錯:
INCLUDE clause is not allowed for non-unique index
。
7. 與排序、覆蓋訪問、優化器的協同
- 覆蓋訪問:只要 SELECT 的列完全落在 鍵列 +
INCLUDE
列 中,優化器偏向INDEX ONLY SCAN
。 - ORDER BY 鍵列:直接輸出,無需再排序;
INCLUDE
不幫你排別的列。 - 統計信息:葉子頁更大 →
RUNSTATS
仍要跑,確保基數估計準確。
8. 落地 Checklist
- 鎖定高選擇度唯一列
- 列清單梳理:讀多寫少 + 體積小 → 入
INCLUDE
- 建索引:
UNIQUE ... INCLUDE(...)
EXPLAIN
確認:出現INDEX ONLY
即達成目的- 監控寫入:高并發 UPDATE 時觀察頁分裂、鎖競爭
- 定期 RUNSTATS:保證優化器基數估算不失真
9. 小結
INCLUDE
為唯一索引添上一層“只讀副本”:
- 性能:Index-Only,省一次回表 I/O
- 空間:比聯合索引小得多
- 維護:附加列不排序,寫放大低
口訣:
- 唯一鍵 + 少量、靜態、小字段 ? 用
INCLUDE
- 需要排序 / 大字段 / 高頻更新 ? 建聯合索引 或 保留原表
定位好場景、避開陷阱,INCLUDE
就能幫你把“空間-時間比”榨到極致。