postgresql的分区表

1.相关基本介绍:
  • pg10.x以前只能通过继承+触发器的方式创建分区表
  • postgresql版本在10.x之后提供了内置分区表,只支持range和list分区,11.x版本支持hash分区
  • pg11之前只能单独为每个分区表建立索引,且不能在父表上建立主键,索引等。pg11后可以对父表建立索引,分区子表自动创建。
  • 分区表不允许其他表作为外键引用
  • 分区表的数据是通过操作父表进行插入操作的
继承

定义一张父表后通过关键字inherits创建子表继承父表,子表具有父表的全部字段属性,同时可以定义子表自己的字段

##父表
create table aa(id int4,type init4);##子表,继续父表同时增加一列speciality
create table aa_child(speciality varchar(10)) inherits(aa);##通过tableoid隐藏字段区分查询结果来源是子表还是父表
select tableoid,* from aa;

父表与子表的关系

  • 子表与父表字段和约束是包含关系
  • 操作父表的时候会同时显示父表和子表的结果,除非使用only指定操作父表方式
  • 子表不继承父表的索引,若需要则需要对子表手动添加

2.比较不同版本之间分区改进

  • pg9使用继承式分区,pg10实现了声明式分区,pg11完善了功能,pg12提升了性能
版本 新增特性
pg9 1.继承式分区
2.手动添加触发器或规则
pg10 1.声明式分区
2.分区索引手动创建,不能基于分区父表创建
pg11 1.新增哈希分区
2.基于的分区表创建索引
3.支持update分区
4.会创建一个默认default分区
5.分区支持创建主键,外键,索引,触发器
pg12 1.新增哈希分区
2.alter table attach partitions不会阻塞查询
pg13 1.可以支持before trigger(不允许改变插入数据的目标分区)
2.分区表可以支持逻辑复制
3.高版本创建分区表步骤(声明式):

1.创建父表

CREATE TABLE public.tb_aa (id serial NOT NULL,user_id int4 NOT NULL,status varchar(5) NOT NULL DEFAULT '1'::character varying,update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,CONSTRAINT tb_aa_pk PRIMARY KEY (id)
) partition by range(id);

2.创建子分区表

create table tb_aa_20210907 partition of tb_aa for values from (1) to (5);
create table tb_aa_20210908 partition of tb_aa for values from (5) to (10);
create table tb_aa_20210909 partition of tb_aa for values from (10) to (15);

3.插入数据

insert into tb_aa(id,user_id) values(1,1),(2,1),(3,1),(4,1),(5,1),(6,1),(7,1),(8,1),(9,1),(10,1),(11,1),(12,1),(13,1);

4.查看数据

select * from tb_aa_20210907;
select * from tb_aa_20210908;
select * from tb_aa_20210909;

5.修改分区表结构等

create index ix_tb_aa_user_id on tb_aa(user_id);
alter table tb_aa add column "type" int default 0;

结论:(高版本)
1.分区表的数据,只需要对父表进行操作处理即可
2.子分区表会自动继承父表,添加索引等信息的时候,无需单独分别对分区表进行操作
3.通过DDL信息查看分区表权限授予也是和父表的一样

4.分区基本操作

##删除分区
drop table tb_name_20210601;##分区脱离父表
alter table tb_name_20210601 no inherit tb_name;
或者
alter table tb_name detach tb_name_20210601;##分区表重新继承
alter table tb_name_20210601 inherit tb_name;##增加分区
create table tb_name_20210615 partition of tb_name for values from ('2021-06-07') to ('2021-06-15');create index tb_name_idx_202106015_col2 on
tb_name_20210615 using btree(col2);

5.分区表的类型

1). range(支持多列)
partition by range() for values from (…) to (…)

2). list(不支持多列)
partition by list() for values in (…)

3). hash(支持多列)
partition by hash() for values with()

6.多级分区
1.SQL 错误 [42P16]: ERROR: invalid bound specification for a range partition
2.可以在list分区下创建range分区

range和list分区支持创建默认分区,即不符合分区约束的数据会被插入到默认分区
create table tb_aa_default partition of tb_aa default;

7.分区关系的操作

##detach分区表
##被detach的分区表只是解除了分区关系,表依旧是存在的
alter table tb_aa detach partition tb_aa_20210910;##attach分区表
alter table tb_aa attach partition tb_aa_20210910 for values from (15) to (20) ;##查看给定的分区表的父表信息
select child.relname as partition_name,parent.relname as parent
from pg_catalog.pg_inherits as inh
join pg_class as parent on inh.inhparent=parent.oid
join pg_class as child on inh.inhrelid=child.oid
join pg_namespace as ns1 on ns1.oid=parent.relnamespace
join pg_namespace as ns2 on ns2.oid=child.relnamespace
where ns1='schemaname' and child.relname='tablename';## 查询给定表名的分区
select  nmsp_parent.nspname AS parent_schema ,
parent.relname AS parent ,
nmsp_child.nspname AS child ,
child.relname AS child_schema
from pg_inherits
JOIN pg_class parent
on pg_inherits.inhparent =parent.oid JOIN pg_class child
on pg_inherits.inhrelid = child.oid JOIN pg_namespace nmsp_parent
on nmsp_parent.oid = parent.relnamespace JOIN pg_namespace nmsp_child
on nmsp_child.oid = child.relnamespace
where parent.relname = '表名'  order by child.relname;##查看父表中有哪些分区表
select c.relname
from pg_class c
join pg_inherits i on i.inhrelid = c. oid
join pg_class d on d.oid = i.inhparent
where d.relname = 'table_name';

postgresql的分区表相关推荐

  1. oracle analyze分区表,PostgreSQL Analyze分区表:主表与子表的统计信息问题

    最近在PostgreSQL的Mail List中参与讨论了一个问题: ANALYZE'ing table hierarchies. 网友认为在Analyze分区表的时候,只能看到主表的analyze日 ...

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

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

  3. PostgreSQL 创建分区表

    PG 假如我们想像Hive那也创建动态分区是不能实现的.         那么需要我们手动通过脚本来创建分区表,创建分区表必须要创建主表和分区表. 因此我们可以根据我们需求提前用脚本把分区表生成即可, ...

  4. postgresql数据库分区表

    分区表条件 数据达到100万条 数据是分段的,即只涉及一部分数据而不是所有数据 分区表就是将一个大表分成若干个小表 以下代码为sqlserver创建分区表 分区函数的代码: CREATE PARTIT ...

  5. 【原创】POSTGRESQL 分区表初次体验

    POSTGRESQL的分区和MYSQL不同,MYSQL是有专门的分区表, 而POSTGRESQL的分区则利用它本身的面向对象的特性来做. 下面我们来简单的体验下. 我们先创建一张父表. 记住,所有的分 ...

  6. PostgreSQL 分区表一点也不差

    MYSQL 在分区表上的缺失不同,POSTGRESQL 的分区表那算是"硬可".PG11 已经推出了HASH 分区.具体操作是怎样 首先分区表的大致用途有那些 1  在符合业务的基 ...

  7. PostgreSQL分区表(partitioning)应用实例

    前言 项目中有需求要垂直分表,即按照时间区间将数据拆分到n个表中,PostgreSQL提供了分区表的功能.分区表实际上是把逻辑上的一个大表分割成物理上的几小块,提供了很多好处,比如: 查询性能大幅提升 ...

  8. PostgreSQL分区表(partitioning)应用实例详解

    https://www.jb51.net/article/97937.htm PostgreSQL分区表(partitioning)应用实例详解 更新时间:2016年11月22日 10:25:58   ...

  9. PostgreSQL分区表

    PostgreSQL分区表 声明:内容转载别处,觉得有用就分享了出来 为什么需要分区表? 首先我们需要思考一个问题,为什么需要分区表? 是因为Big Table的性能差,而且容量有上限,所以才需要分而 ...

最新文章

  1. 机器学习:范数及代码实现
  2. 第五十五期:区块链将在2020年实现的重大改变
  3. 浪迹天涯的骨灰级开源爱好者——对话阿里云MVP吴晟
  4. php使用ftp远程上传文件类(解决主从文件同步问题的简单方法)
  5. bat ping 返回值_专科生可以进bat大厂吗?
  6. Windows Server 2008部署***服务器
  7. T-SQL 之 游标
  8. cpu功耗排行_AMD、Intel主流处理器性能、功耗及性价比排行(更新中)
  9. 企业间数据竞争规则研究
  10. flutter A problem occurred configuring project ‘:shared_preferences_linux‘.
  11. 全球与中国飞机内部照明系统市场深度研究分析报告(2021)
  12. Java面向对象三大特征---继承
  13. 几个你需注意的数据库设计原则(新手必看)
  14. 迁移学习知识 - 迁移学习的四种应用场景
  15. 电信光纤无线路由器(光猫)的设置方法
  16. C语言之strcmp函数和strncmp函数
  17. java检测磁盘空间大小
  18. 电子计算机工作最主要特征,电子计算机最重要的工作特征是( )
  19. 6-2 返回月份的英文全称(日历) (10分) java pta
  20. 让男人无法抗拒的三种傻女人【顶】【转】

热门文章

  1. Excel 2016处理CSV文件后导致UTF-8编码变化的问题
  2. 人脸检测之AAM(Active Appreance Model)算法
  3. Tesseract OCR 引擎概述
  4. bootstrap collapse 失效
  5. mysql左联和右联_MySQL联合查询语法内联、左联、右联、全联
  6. 【feign】OpenFeign访问需要OAuth2授权的服务
  7. 在ie6中使用png格式的透明图像
  8. Java实现堆排序(大根堆),实战
  9. wps大纲栏显示在右边_WPS文字技巧—如何巧用版面调整页面内容
  10. java实现中文汉字转拼音 Pinyin4j的基本用法