pgsql在版本10中推出了声明式分区表,算是让分区表这个功能走上了正轨。(之前的版本为继承+触发器,和SQL Server的分区视图有点像,算是粗制)。
随着其版本发展,功能也越来越强,但今天要介绍的是基础功能:如何优雅地在分区表和非分区表切换。
pgsql分区表有一个笔者非常喜欢的特性,分区列是自由的,不和唯一约束绑定,在诸如SQL Server、MySQL中,当你尝试把普通表转换为分区表时,会强制要求你把分区列加到唯一性约束中(主键、唯一约束/索引),这个硬性要求使得包含大量数据的普通表转分区表的代价非常高,特别是主键的变动,会影响很多东西,时间成本也很高。
个人一直认为把分区列加到唯一约束这个硬性要求其实没什么道理,毕竟分区是唯一的,唯一性约束保障分区内的唯一主可以了。所以pgssql不要求分区列在唯一约束中,这点是非常对本人口味的。
下面直接上代码,演示如何优雅地将普通表切换为分区表,整个过程可以做到业务无中断,分区表切换普通表可以用完全相反的过程。
-- 创建测试表 -- 普通表,后续过程将此表切换为分区表
CREATE TABLE tb
AS
SELECT a.*
FROM pg_settings a,
pg_settings b,
pg_settings c,
pg_settings d
LIMIT 1000000
;
ALTER TABLE tb ADD id serial PRIMARY KEY;
-- 准备将测试表切换为分区,分区表使用 context 列值进行 LIST 分区
-- 分区 -- 添加临时分区列,与分区