PostgreSQL 内置分区

内置分区表

在 PostgreSQL10 以前,都是通过表的继承和触发器来完成分区功能,在 PostgreSQL10 中提供对内置分区表的支持,目前只支持范围分区表和列表分区表。

范围分区:

范围分区,适用于针对某一字段数据的一定范围(比如时间)进行分区:

  • 创建表:
-- 父表
create table public.user_per(
user_id int4,
user_name text,
create_time date
) partition by range (create_time);
-- 分区表
create table 
public.user_per_201501 partition of user_per 
  for values from (minvalue) to ('2015-01-01');
-- 分区表
create table 
public.user_per_201601 partition of user_per 
  for values from ('2015-01-01') to ('2016-01-01');
-- 分区表
create table public.user_per_201701 
partition of user_per 
  for values from ('2016-01-01') to ('2017-01-01');
  • 插入数据
insert into 
user_per(user_id, user_name, create_time) 
values 
     (1001, 'aladdin', '2000-10-15'), 
     (1002, 'bilib', '2016-04-01');
  • 查询数据
select * from user_per; -- + where create_time ...
-- 验证是否已被分区
select * from user_per_201501;
select * from user_per_201701;
  • 删除分区
-- 将数据一起删除的暴力方法
drop table user_per_201501;
-- 温和的方式是将分区与父分区进行解绑,分区和数据都没有被删除,只是对 user_per 不在适用
alter table user_per detach partition user_per_201701;
-- 将分区重新绑定到父分区
alter table 
user_per attach partition user_per_201701 
  for values from ('2016-01-01') to ('2017-01-01');
  • 创建索引
-- 分区索引
create index 
on user_per_201501 
  using btree(user_name);

列表分区:

列表分区,是针对字段数据的某几个值(比如地区)进行分区:

  • 创建表:
-- 父表
create table user_per(
user_id int4,
user_province text
) partition by list(user_province);
-- 单值分区表
create table 
user_per_ln partition of user_per 
  for values in ('辽宁');
-- 多值分区表
create table 
user_per_hz partition of user_per 
  for values in ('河南', '湖北', '湖南');
  • 插入数据
insert into
user_per(user_id, user_province) 
VALUES 
       (1001, '辽宁'), 
       (1002, '河南');
  • 其他操作

    参考范围分区...

关于 constraint_exclusion 参数:

内置分区表的查询计划受 constraint_exclusion 参数的影响,不启动 constraint_exclusion,分区表的查询计划将会对所有分区都进行查询(全表扫描),失去了分区剪枝的功能。

如果启动 constraint_exclusion,对所有表都会启动,将会增大服务器压力,一般(PG 实战 / 网上)都推荐将 constraint_exclusion 参数设置为 partition:

set constraint_exclusion = partiton;
-- 其它配置
set constraint_exclusion = on;
set constraint_exclusion = off;

内置分区表的性能

在 《PostgreSQL 实战》中,作者对启动内置分区表和不启动分区进行了测试。测试结果是,启动内置分区表的性能比没有提高,相比较不启动分区性能好像还有点下降。

但是不启动分区,无法直接对类似于 "user_per_ln" 这样的子表进行查询,而是需要全表扫描数据,各有利弊而已,真正使用需要根据实际情况进行衡量。

PostgreSQL 的继承

PostgreSQL 传统的 (10版本之前) 都是通过表继承+触发器等操作来完成的,虽然 10 版本字后有了改变,但是对于没有接触过表继承相关概念的人来说,很难理解这个过程的实现细节:

-- 父表
create table tbl_user(
  id int4,
  name text
);
-- 子表
create table tbl_user_ln (tags text[]) inherits (tbl_user); -- 继承 tbl_user 的字段,也可以新增字段

插入数据:

insert into 
  tbl_user_ln (id, name, tags) 
  values 
         (1001, 'aladdin', '{"Smoking", "Drinking"}');

查询:

-- 通过查询父表,可以查到数据
select * from tbl_user;
-- 也可以通过查询字表查询数据
select * from tbl_user_ln;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343