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
就能帮你把“空间-时间比”榨到极致。