🌟 引言:为什么需要分区表?
面对千万级数据表,你是否经历过查询卡顿、维护困难的窘境?分区表通过将大表拆分为多个逻辑子表,实现查询性能提升、数据管理效率优化。以时间字段分区为例,历史数据归档、快速删除过时数据变得轻而易举!
🛠️ 实战一:快速创建分区表
场景:按月份对pdate
字段进行范围分区,自动生成每月子表。
-- 创建按月分区的核心表
CREATE TABLE tb1 (
id BIGINT,
stat DATE,
no BIGINT,
pdate DATE,
info VARCHAR(50)
) PARTITION BY RANGE (pdate)
INTERVAL ('1 MONTH') -- 每月自动生成新分区
(
PARTITION tb1_p1 VALUES LESS THAN ('2019-01-01'),
PARTITION tb1_p2 VALUES LESS THAN ('2019-02-01'),
PARTITION tb1_p3 VALUES LESS THAN ('2019-03-01'),
PARTITION tb1_p4 VALUES LESS THAN ('2019-04-01')
);
效果验证:
- 父表结构:
\d+ tb1
查看分区键及初始分区范围 - 子表结构:
\d+ tb1_tb1_p1
可见分区约束pdate < '2019-01-01'
🔑 实战二:为分区表添加主键
核心要点:
- 主键自动创建全局唯一索引(GLOBAL)
- 主键字段强制非空(NOT NULL)
- 必须包含分区键(如
pdate
)
ALTER TABLE tb1 ADD CONSTRAINT tb1_pk
PRIMARY KEY (id, pdate); -- 必须包含分区键pdate
避坑指南:
若忘记包含分区键,会报错:ERROR: primary key must include all partitioning columns
📊 实战三:高效索引策略
本地索引:每个子分区独立创建,提升分区内查询速度
CREATE INDEX ON tb1 (no) LOCAL; -- 自动在所有子分区生成no_idx
全局索引:仅支持主键列,跨分区查询更高效
CREATE INDEX ON tb1 (id, no) GLOBAL;
限制说明:
- 全局索引仅支持唯一约束(UNIQUE)
- 创建时无法使用
CONCURRENTLY
选项(子分区支持)
🔄 实战四:灵活转换普通表为子分区
场景:将已有表tb1_tb1_p5
并入分区体系。
步骤:
- 表结构对齐:确保与原表结构、约束一致
ALTER TABLE tb1_tb1_p5 ALTER COLUMN id SET NOT NULL;
- 挂载分区:指定分区范围
ALTER TABLE tb1 ATTACH PARTITION tb1_tb1_p5
FOR VALUES FROM ('2019-05-01') TO ('2019-05-31');
常见报错:
ERROR: column "id" must be NOT NULL
→ 需先添加非空约束ERROR: missing partition constraint
→ 检查表结构一致性
💡 分区表管理三大原则
- 提前规划分区策略:按业务需求选择范围、列表、哈希分区
- 慎用全局索引:维护成本高,优先通过分区键优化查询
- 定期清理过期分区:
DROP PARTITION
比DELETE
效率高百倍!
📝 互动话题
你在使用分区表时遇到过哪些“坑”?欢迎留言分享你的实战经验!
关键词:#KingbaseES #分区表 #索引优化 #数据库管理 #性能提升