PostgreSQL中的分区表是通过表继承来实现的(表继承博客点击打开链接)。创建分区表的步骤如下:

(1)创建“父表”,所有的分区表都从这张表继承。“父表”中不存数据,也不要定义约束和索引。

(2)创建“子表”,所有“子表”都是从“父表”中继承而来。这些“子表”就是所谓的分区,其实它们也是PostgreSQL表。

(3)给分区表创建约束。

(4)在分区表上创建索引。

(5)创建触发器,把对“父表”的插入重定向到分区表中。

(6)确保postgresql.conf中constraint_exclusion的配置参数是打开状态。打开后,可以确保查询智能的只查询分区表,而不会对其他分区表进行查询。

下面是创建分区表的例子:

--创建销售明细表,作为“父表”
create table sales_detail (
product_id    int    not null,
price         numeric(12,2),
amount        int    not null,
sale_date     date   not null,
buyer         varchar(40),
buyer_contact text
);--根据销售日期sale_date字段,每个季度作为一个分区,创建分区表
create table sales_detail_Y2017Q01(check (sale_date >= date '2017-01-01' and sale_date < date '2017-04-01') ) inherits (sales_detail);create table sales_detail_Y2017Q02(check (sale_date >= date '2017-04-01' and sale_date < date '2017-07-01') ) inherits (sales_detail);create table sales_detail_Y2017Q03(check (sale_date >= date '2017-07-01' and sale_date < date '2017-10-01') ) inherits (sales_detail);create table sales_detail_Y2017Q04(check (sale_date >= date '2017-10-01' and sale_date < date '2018-01-01') ) inherits (sales_detail);--在分区键sale_detail上创建索引
create index sales_detail_Y2017Q01_sale_date on sales_detail_Y2017Q01 (sale_date);create index sales_detail_Y2017Q02_sale_date on sales_detail_Y2017Q02 (sale_date);create index sales_detail_Y2017Q03_sale_date on sales_detail_Y2017Q03 (sale_date);create index sales_detail_Y2017Q04_sale_date on sales_detail_Y2017Q04 (sale_date);--创建触发器,当向sales_detail表中插入数据时,可以重定向插入到分区表中
create or replace function sales_detail_insert_trigger()
returns trigger as $$
beginif (new.sale_date >= date '2017-01-01' and new.sale_date < date '2017-04-01') theninsert into sales_detail_Y2017Q01 values (new.*);elsif (new.sale_date >= date '2017-04-01' and new.sale_date < date '2017-07-01') theninsert into sales_detail_Y2017Q02 values (new.*);elsif (new.sale_date >= date '2017-07-01' and new.sale_date < date '2017-10-01') theninsert into sales_detail_Y2017Q03 values (new.*);elsif (new.sale_date >= date '2017-10-01' and new.sale_date < date '2018-01-01') theninsert into sales_detail_Y2017Q04 values (new.*);else raise exception 'Date out of range.Fix the sales_detail_insert_trigger () function!';end if;return null;
end;
$$
language plpgsql;create trigger insert_sales_detail_trigger
before insert on sales_detail
for each row execute procedure sales_detail_insert_trigger ();--设置constraint_exclusion参数为“partition”状态。此参数默认为“partition”
set constrait_exclusion 'partition'

测试分区表:

--向“父表”中插入一条数据
test=# insert into sales_detail values (1,23.22,1,date'2017-08-16','zhaosi','xiangyashan222hao');--数据已经插入到分区表中
test=# select * from sales_detail_Y2017Q03;product_id | price | amount | sale_date  | buyer  |   buyer_contact
------------+-------+--------+------------+--------+-------------------1 | 23.22 |      1 | 2017-08-16 | zhaosi | xiangyashan222hao
(1 row)--并且查询“父表”也可以查到插入的数据
test=# select * from sales_detail;product_id | price | amount | sale_date  | buyer  |   buyer_contact
------------+-------+--------+------------+--------+-------------------1 | 23.22 |      1 | 2017-08-16 | zhaosi | xiangyashan222hao
(1 row)--通过查看执行计划,可以看出当查询数据时,数据库会自动的去sales_detail_Y2017Q03分区表中查找,而不会扫描所有的分区表。
test=# explain select * from sales_detail where sale_date=date'2017-08-16';QUERY PLAN
----------------------------------------------------------------------------------------------------Append  (cost=0.00..9.50 rows=3 width=158)->  Seq Scan on sales_detail  (cost=0.00..0.00 rows=1 width=158)Filter: (sale_date = '2017-08-16'::date)->  Bitmap Heap Scan on sales_detail_y2017q03  (cost=4.16..9.50 rows=2 width=158)Recheck Cond: (sale_date = '2017-08-16'::date)->  Bitmap Index Scan on sales_detail_y2017q03_sale_date  (cost=0.00..4.16 rows=2 width=0)Index Cond: (sale_date = '2017-08-16'::date)
(7 rows)

总结:

删除分区表中的子表,不会使触发器失效,只是当向被删除表中插入数据时会报错。

创建分区表过程中的触发器,可以用“规则”来代替,但触发器比“规则”更有优势,再此不再赘述。

The End!

2017-08-17

【PostgreSQL-9.6.3】分区表相关推荐

  1. PostgreSQL 并行vacuum patch - 暨为什么需要并行vacuum或分区表

    标签 PostgreSQL , vacuum , freeze , 分区表 , 并行vacuum 背景 我们之前做过一个这样的测试,单表数据从1000万到10亿,对其进行增删改查的压测,性能几乎没有衰 ...

  2. PostgreSQL高效分区表实现-pg_pathman

    PG分区在数据应用中十分广泛. PostgreSQL背景 目前PostgreSQL社区版本的分区表功能比较弱,需要通过继承和触发器或RULE来实现分区表的功能,由于查询和更新涉及约束的检查.插入则涉及 ...

  3. PostgreSQL 179个场景

    案例 1.<多字段,任意组合(0建模) - 毫秒级实时圈人 - 最佳实践> 2.<IoT(物联网)极限写入.消费 最佳实践 - 块级(ctid)扫描> 3.数据采样和脱敏实践 ...

  4. 元旦技术大礼包 - 2017金秋将要发布的PostgreSQL 10.0已装备了哪些核武器?

    标签 PostgreSQL , 10.0 , 金秋 , 元旦 , 大礼包 , commitfest 背景 早上送给大家的新年大礼包,一年一个大版本是PostgreSQL社区的传统,虽然发布时间通常为秋 ...

  5. PostgreSQL 覆盖 Oracle 18c 重大新特性

    标签 PostgreSQL , Oracle , 兼容性 , 18c 背景 Oracle 18c 发布了诸多新特性,其中大部分Oracle 18c的重大特性,在早期版本的PostgreSQL数据库已支 ...

  6. PostgreSQL 物流轨迹系统数据库需求分析与设计 - 包裹侠实时跟踪与召回

    PostgreSQL 物流轨迹系统数据库需求分析与设计 - 包裹侠实时跟踪与召回 作者 digoal 日期 2017-04-10 标签 PostgreSQL , PostGIS , 快递 , 包裹侠 ...

  7. 恭迎万亿级营销(圈人)潇洒的迈入毫秒时代 - 万亿user_tags级实时推荐系统数据库设计...

    标签 PostgreSQL , 标签 , 推荐系统 , 实时圈人 , 数组 , gin , gist , 索引 , rum , tsvector , tsquery , 万亿 , user , tag ...

  8. 从天津滨海新区大爆炸、危化品监管聊聊 IT人背负的社会责任感

    标签 PostgreSQL , 天津滨海新区大爆炸 , 危险品 , 危化品监管 , RDKit , 化学插件 , 社会关系分析 , 毒品分析 , 化学反应 , 机器学习 , 地理位置 , PostGI ...

  9. 数据库案例集锦 - 开发者的《如来神掌》

    标签 PostgreSQL , PG DBA cookbook , PG Oracle兼容性 , PG 架构师 cookbook , PG 开发者 cookbook , PG 应用案例 背景 「剑魔独 ...

  10. postgre与mysql区别

    SQL兼容性 PostgreSQL 9.5兼容 SQL:2011 子集http://www.postgresql.org/docs/9.5/static/features-sql-standard.h ...

最新文章

  1. 长沙望城:当好“贴心人” 扎牢“人民根” 坚守“云阵地”
  2. golang 获取本地ip
  3. BO QUERY BUILDER - SI_INSTANCE相关属性
  4. 更改windows2003远程最大连接数
  5. Xcode 证书生成、设置、应用
  6. JAVA程序员必备网站
  7. 软件配置 | win / mac M1 imagemagick 的安装
  8. react native实现兼容Android与ios的视频播放器
  9. 连接查询--嵌套查询
  10. 7z文件压缩、解压 (7zTool.exe)
  11. ava.util.ConcurrentModificationException 异常
  12. 5 个好用的开发者 Vim 插件
  13. 国密SM3加密算法工具类(非对称)
  14. 英文译中文翻译-中文英文翻译在线翻译
  15. 2019春季学期总结
  16. LifeKeeper 操作规程及注意事项
  17. 【UE4笔记】蓝图升降电梯
  18. A4时代的各家PND产品乱弹——奶猫侃GPS
  19. MySQL百万数据优化一
  20. 让 Anchor 属性拥有设计时行为

热门文章

  1. 大数据集合求交集_还记得学生时代数学老师教的“集合”吗?
  2. App应用之提交到各大市场渠道
  3. Apache HttpServer的安装并与Tomcat整合Linux 版
  4. C#遍历DataSet中数据的几种方法总结
  5. 等效全向辐射功率(EIRP)
  6. 窗口操作-关闭,最小化
  7. 信息收集之域名、IP互查
  8. PHP cURL上传图片
  9. 基于人脸识别的商业大数据2
  10. Nginx 配置一个虚拟站点