ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 概述 - 范围划分 - 表被根据一个关键列或一组列划分为“范围”,不同的分区的范围之间没有重叠。 - 例如,我们可以根据日期范围划分,或者根据特定业务对象的标识符划分。 每个范围的边界被理解为左边包含并且右边不包含。 - 例如,如果一个分区的范围是从1到10,而下一个分区是从10到20,则10的值属于第二个分区,而不是第一个分区。 - 列表划分 - 通过显式地列出每一个分区中出现的键值来划分表。 - 哈希分区 - 通过为每个分区指定模数和余数来对表进行分区。每个分区所持有的行都满足:分区键的值除以为其指定的模数将产生为其指定的余数。 - 不可能将常规表转换为分区表,反之亦然。但是,可以将现有的常规或分区表添加为分区表的分区,或从分区表中删除分区,将其转换为独立表 - 分区也可以是外部表,不过它们有一些普通表没有的限制 ## 创建分区表 ``` CREATE TABLE measurement ( city_id int not null, logdate date not null, peaktemp int, unitsales int ) PARTITION BY RANGE (logdate); ``` 添加分区 ``` CREATE TABLE measurement_y2006m02 PARTITION OF measurement FOR VALUES FROM ('2006-02-01') TO ('2006-03-01'); CREATE TABLE measurement_y2006m03 PARTITION OF measurement FOR VALUES FROM ('2006-03-01') TO ('2006-04-01'); ... CREATE TABLE measurement_y2007m11 PARTITION OF measurement FOR VALUES FROM ('2007-11-01') TO ('2007-12-01'); CREATE TABLE measurement_y2007m12 PARTITION OF measurement FOR VALUES FROM ('2007-12-01') TO ('2008-01-01') TABLESPACE fasttablespace; ``` > 相邻分区可以共享一个边界值,因为范围上限被视为不包含的边界 > 生成分区的脚本需要定时执行 创建索引 ``` CREATE INDEX ON measurement (logdate); ``` ## 删除分区 移除旧数据最简单的选择是删除掉不再需要的分区: ``` DROP TABLE measurement_y2006m02; ``` > 可以非常快地删除数百万行记录,因为它不需要逐个删除每个记录。 > 不过要注意上面的命令需要在父表上拿到ACCESS EXCLUSIVE锁。 另一种通常更好的选项是把分区从分区表中移除 ``` ALTER TABLE measurement DETACH PARTITION measurement_y2006m02; ALTER TABLE measurement DETACH PARTITION measurement_y2006m02 CONCURRENTLY; ``` > 在第二种形式中同时添加CONCURRENTLY 限定符,允许detach操作只需要父表上的SHARE UPDATE EXCLUSIVE锁