【postgresql】pg的分区表-范围分区

1.pg的分区表 

包含三种分区表 
PostgreSQL内置支持3种方式的分区。
范围分区(range) 
表被划分为由键列或列集定义的"范围",分配给不同分区的值的范围之间没有重叠。
例如:可以按日期范围或特定业务对象的标识符范围,来进行分区。

列表分区(List)
通过显式列出哪些键值出现在每个分区中来对表进行分区。

哈希分区(hash)
PostgreSQL 11开始提供HASH策略
通过为每个分区指定模数和余数来对表进行分区。
每个分区将保存行,分区键的哈希值除以指定的模数将产生指定的余数。

2.创建分区表的方法 

1)创建父表--------指定分区键,分区策略(RANGE,LIST,HASH(PG11.X才提供HASH策略))
2)创建分区表------指定父表,分区键范围(分区键范围重叠之后会直接报错)
3)在分区上创建索引--通常分区键上的索引是必须的。
4)导入、写入数据

3.创建分区表 

(1)创建父表 
create table sspudb_r1
(
id numeric(20,0) NOT NULL,
name character varying(20) NOT NULL,
age numeric(10,0) NOT NULL,
sex character varying(10) NOT NULL,
cardid numeric(30,0) NOT NULL,
joindate timestamp without time zone NOT NULL,
region character varying(12) NOT NULL,
tel character varying(12) NOT NULL,
email character varying(30) NOT NULL,
recommend character varying(10),
identifier character varying(100),
primary key (id,joindate)
)
PARTITION BY RANGE(joindate);

(2)创建子分区 
create table sspudb_r1_phis  partition OF sspudb_r1 for values from (MINVALUE) TO ('2010-01-01 00:00:00');
create table sspudb_r1_p2010 partition of sspudb_r1 for values from ('2010-01-01 00:00:00') to ('2011-01-01 00:00:00');
create table sspudb_r1_p2011 partition of sspudb_r1 for values from ('2011-01-01 00:00:00') to ('2012-01-01 00:00:00');
create table sspudb_r1_p2012 partition of sspudb_r1 for values from ('2012-01-01 00:00:00') to ('2013-01-01 00:00:00');
create table sspudb_r1_p2013 partition of sspudb_r1 for values from ('2013-01-01 00:00:00') to ('2014-01-01 00:00:00');
create table sspudb_r1_p2014 partition of sspudb_r1 for values from ('2014-01-01 00:00:00') to ('2015-01-01 00:00:00');
create table sspudb_r1_p2015 partition of sspudb_r1 for values from ('2015-01-01 00:00:00') to ('2016-01-01 00:00:00');
create table sspudb_r1_p2016 partition of sspudb_r1 for values from ('2016-01-01 00:00:00') to ('2017-01-01 00:00:00');
create table sspudb_r1_p2017 partition of sspudb_r1 for values from ('2017-01-01 00:00:00') to ('2018-01-01 00:00:00');
create table sspudb_r1_p2018 partition of sspudb_r1 for values from ('2018-01-01 00:00:00') to ('2019-01-01 00:00:00');
create table sspudb_r1_p2019 partition of sspudb_r1 for values from ('2019-01-01 00:00:00') to ('2020-01-01 00:00:00');
create table sspudb_r1_p2020 partition of sspudb_r1 for values from ('2020-01-01 00:00:00') to ('2021-01-01 00:00:00');

(3)检查新创建的分区表 
sspudb=> \d+ sspudb_r1
                                              Partitioned table "public.sspudb_r1"
   Column   |            Type             | Collation | Nullable | Default | Storage  | Compression | St
ats target | Description 
------------+-----------------------------+-----------+----------+---------+----------+-------------+---
-----------+-------------
 id         | numeric(20,0)               |           | not null |         | main     |             |   
           | 
 name       | character varying(20)       |           | not null |         | extended |             |   
           | 
 age        | numeric(10,0)               |           | not null |         | main     |             |   
           | 
 sex        | character varying(10)       |           | not null |         | extended |             |   
           | 
 cardid     | numeric(30,0)               |           | not null |         | main     |             |   
           | 
 joindate   | timestamp without time zone |           | not null |         | plain    |             |   
           | 
 region     | character varying(12)       |           | not null |         | extended |             |   
           | 
 tel        | character varying(12)       |           | not null |         | extended |             |   
           | 
 email      | character varying(30)       |           | not null |         | extended |             |   
           | 
 recommend  | character varying(10)       |           |          |         | extended |             |   
           | 
 identifier | character varying(100)      |           |          |         | extended |             |   
           | 
Partition key: RANGE (joindate)
Indexes:
    "sspudb_r1_pkey" PRIMARY KEY, btree (id, joindate)
Partitions: sspudb_r1_p2010 FOR VALUES FROM ('2010-01-01 00:00:00') TO ('2011-01-01 00:00:00'),
            sspudb_r1_p2011 FOR VALUES FROM ('2011-01-01 00:00:00') TO ('2012-01-01 00:00:00'),
            sspudb_r1_p2012 FOR VALUES FROM ('2012-01-01 00:00:00') TO ('2013-01-01 00:00:00'),
            sspudb_r1_p2013 FOR VALUES FROM ('2013-01-01 00:00:00') TO ('2014-01-01 00:00:00'),
            sspudb_r1_p2014 FOR VALUES FROM ('2014-01-01 00:00:00') TO ('2015-01-01 00:00:00'),
            sspudb_r1_p2015 FOR VALUES FROM ('2015-01-01 00:00:00') TO ('2016-01-01 00:00:00'),
            sspudb_r1_p2016 FOR VALUES FROM ('2016-01-01 00:00:00') TO ('2017-01-01 00:00:00'),
            sspudb_r1_p2017 FOR VALUES FROM ('2017-01-01 00:00:00') TO ('2018-01-01 00:00:00'),
            sspudb_r1_p2018 FOR VALUES FROM ('2018-01-01 00:00:00') TO ('2019-01-01 00:00:00'),
            sspudb_r1_p2019 FOR VALUES FROM ('2019-01-01 00:00:00') TO ('2020-01-01 00:00:00'),
            sspudb_r1_p2020 FOR VALUES FROM ('2020-01-01 00:00:00') TO ('2021-01-01 00:00:00'),
            sspudb_r1_phis FOR VALUES FROM (MINVALUE) TO ('2010-01-01 00:00:00')


(4)创建全局索引 
CREATE INDEX idx_sspudb_r1_joindate ON sspudb_r1 USING BTREE(joindate);

sspudb=> \d+ sspudb_r1
...............................
Partition key: RANGE (joindate)
Indexes:
    "sspudb_r1_pkey" PRIMARY KEY, btree (id, joindate)
    "idx_sspudb_r1_joindate" btree (joindate)
Partitions: sspudb_r1_p2010 FOR VALUES FROM ('2010-01-01 00:00:00') TO ('2011-01-01 00:00:00'),
            sspudb_r1_p2011 FOR VALUES FROM ('2011-01-01 00:00:00') TO ('2012-01-01 00:00:00'),
            sspudb_r1_p2012 FOR VALUES FROM ('2012-01-01 00:00:00') TO ('2013-01-01 00:00:00'),
            sspudb_r1_p2013 FOR VALUES FROM ('2013-01-01 00:00:00') TO ('2014-01-01 00:00:00'),
            sspudb_r1_p2014 FOR VALUES FROM ('2014-01-01 00:00:00') TO ('2015-01-01 00:00:00'),
            sspudb_r1_p2015 FOR VALUES FROM ('2015-01-01 00:00:00') TO ('2016-01-01 00:00:00'),
            sspudb_r1_p2016 FOR VALUES FROM ('2016-01-01 00:00:00') TO ('2017-01-01 00:00:00'),
            sspudb_r1_p2017 FOR VALUES FROM ('2017-01-01 00:00:00') TO ('2018-01-01 00:00:00'),
            sspudb_r1_p2018 FOR VALUES FROM ('2018-01-01 00:00:00') TO ('2019-01-01 00:00:00'),
            sspudb_r1_p2019 FOR VALUES FROM ('2019-01-01 00:00:00') TO ('2020-01-01 00:00:00'),
            sspudb_r1_p2020 FOR VALUES FROM ('2020-01-01 00:00:00') TO ('2021-01-01 00:00:00'),
            sspudb_r1_phis FOR VALUES FROM (MINVALUE) TO ('2010-01-01 00:00:00')


(5)检查分区情况 
sspudb=> select
sspudb-> nmsp_parent.nspname as parent_schema,
sspudb-> parent.relname as parent,
sspudb-> nmsp_child.nspname as child_schema,
sspudb-> child.relname as child_schema
sspudb-> from pg_inherits join pg_class parent on pg_inherits.inhparent = parent.oid 
sspudb-> join pg_class child on pg_inherits.inhrelid = child.oid 
sspudb-> join pg_namespace nmsp_parent on nmsp_parent.oid = parent.relnamespace 
sspudb-> join pg_namespace nmsp_child on nmsp_child.oid = child.relnamespace
sspudb-> where parent.relname = 'sspudb_r1';
 parent_schema |  parent   | child_schema |  child_schema   
---------------+-----------+--------------+-----------------
 public        | sspudb_r1 | public       | sspudb_r1_phis
 public        | sspudb_r1 | public       | sspudb_r1_p2010
 public        | sspudb_r1 | public       | sspudb_r1_p2011
 public        | sspudb_r1 | public       | sspudb_r1_p2012
 public        | sspudb_r1 | public       | sspudb_r1_p2013
 public        | sspudb_r1 | public       | sspudb_r1_p2014
 public        | sspudb_r1 | public       | sspudb_r1_p2015
 public        | sspudb_r1 | public       | sspudb_r1_p2016
 public        | sspudb_r1 | public       | sspudb_r1_p2017
 public        | sspudb_r1 | public       | sspudb_r1_p2018
 public        | sspudb_r1 | public       | sspudb_r1_p2019
 public        | sspudb_r1 | public       | sspudb_r1_p2020
(12 rows)

--查看索引 
select * from pg_indexes where tablename like 'sspudb_r1%';
sspudb=> select * from pg_indexes where tablename like 'sspudb_r1%';
 schemaname |    tablename    |          indexname           | tablespace |                                           indexdef        
                                    
------------+-----------------+------------------------------+------------+-----------------------------------------------------------
------------------------------------
 public     | sspudb_r1       | sspudb_r1_pkey               |            | CREATE UNIQUE INDEX sspudb_r1_pkey ON ONLY public.sspudb_r1 USING btree (id, joindate)
 public     | sspudb_r1_phis  | sspudb_r1_phis_pkey          |            | CREATE UNIQUE INDEX sspudb_r1_phis_pkey ON public.sspudb_r1_phis USING btree (id, joindate)
 public     | sspudb_r1_p2010 | sspudb_r1_p2010_pkey         |            | CREATE UNIQUE INDEX sspudb_r1_p2010_pkey ON public.sspudb_r1_p2010 USING btree (id, joindate)
 public     | sspudb_r1_p2011 | sspudb_r1_p2011_pkey         |            | CREATE UNIQUE INDEX sspudb_r1_p2011_pkey ON public.sspudb_r1_p2011 USING btree (id, joindate)
 public     | sspudb_r1_p2012 | sspudb_r1_p2012_pkey         |            | CREATE UNIQUE INDEX sspudb_r1_p2012_pkey ON public.sspudb_r1_p2012 USING btree (id, joindate)
 public     | sspudb_r1_p2013 | sspudb_r1_p2013_pkey         |            | CREATE UNIQUE INDEX sspudb_r1_p2013_pkey ON public.sspudb_r1_p2013 USING btree (id, joindate)
 public     | sspudb_r1_p2014 | sspudb_r1_p2014_pkey         |            | CREATE UNIQUE INDEX sspudb_r1_p2014_pkey ON public.sspudb_r1_p2014 USING btree (id, joindate)
 public     | sspudb_r1_p2015 | sspudb_r1_p2015_pkey         |            | CREATE UNIQUE INDEX sspudb_r1_p2015_pkey ON public.sspudb_r1_p2015 USING btree (id, joindate)
 public     | sspudb_r1_p2016 | sspudb_r1_p2016_pkey         |            | CREATE UNIQUE INDEX sspudb_r1_p2016_pkey ON public.sspudb_r1_p2016 USING btree (id, joindate)
 public     | sspudb_r1_p2017 | sspudb_r1_p2017_pkey         |            | CREATE UNIQUE INDEX sspudb_r1_p2017_pkey ON public.sspudb_r1_p2017 USING btree (id, joindate)
 public     | sspudb_r1_p2018 | sspudb_r1_p2018_pkey         |            | CREATE UNIQUE INDEX sspudb_r1_p2018_pkey ON public.sspudb_r1_p2018 USING btree (id, joindate)
 public     | sspudb_r1_p2019 | sspudb_r1_p2019_pkey         |            | CREATE UNIQUE INDEX sspudb_r1_p2019_pkey ON public.sspudb_r1_p2019 USING btree (id, joindate)
 public     | sspudb_r1_p2020 | sspudb_r1_p2020_pkey         |            | CREATE UNIQUE INDEX sspudb_r1_p2020_pkey ON public.sspudb_r1_p2020 USING btree (id, joindate)
 public     | sspudb_r1       | idx_sspudb_r1_joindate       |            | CREATE INDEX idx_sspudb_r1_joindate ON ONLY public.sspudb_r1 USING btree (joindate)
 public     | sspudb_r1_phis  | sspudb_r1_phis_joindate_idx  |            | CREATE INDEX sspudb_r1_phis_joindate_idx ON public.sspudb_r1_phis USING btree (joindate)
 public     | sspudb_r1_p2010 | sspudb_r1_p2010_joindate_idx |            | CREATE INDEX sspudb_r1_p2010_joindate_idx ON public.sspudb_r1_p2010 USING btree (joindate)
 public     | sspudb_r1_p2011 | sspudb_r1_p2011_joindate_idx |            | CREATE INDEX sspudb_r1_p2011_joindate_idx ON public.sspudb_r1_p2011 USING btree (joindate)
 public     | sspudb_r1_p2012 | sspudb_r1_p2012_joindate_idx |            | CREATE INDEX sspudb_r1_p2012_joindate_idx ON public.sspudb_r1_p2012 USING btree (joindate)
 public     | sspudb_r1_p2013 | sspudb_r1_p2013_joindate_idx |            | CREATE INDEX sspudb_r1_p2013_joindate_idx ON public.sspudb_r1_p2013 USING btree (joindate)
 public     | sspudb_r1_p2014 | sspudb_r1_p2014_joindate_idx |            | CREATE INDEX sspudb_r1_p2014_joindate_idx ON public.sspudb_r1_p2014 USING btree (joindate)
 public     | sspudb_r1_p2015 | sspudb_r1_p2015_joindate_idx |            | CREATE INDEX sspudb_r1_p2015_joindate_idx ON public.sspudb_r1_p2015 USING btree (joindate)
 public     | sspudb_r1_p2016 | sspudb_r1_p2016_joindate_idx |            | CREATE INDEX sspudb_r1_p2016_joindate_idx ON public.sspudb_r1_p2016 USING btree (joindate)
 public     | sspudb_r1_p2017 | sspudb_r1_p2017_joindate_idx |            | CREATE INDEX sspudb_r1_p2017_joindate_idx ON public.sspudb_r1_p2017 USING btree (joindate)
 public     | sspudb_r1_p2018 | sspudb_r1_p2018_joindate_idx |            | CREATE INDEX sspudb_r1_p2018_joindate_idx ON public.sspudb_r1_p2018 USING btree (joindate)
 public     | sspudb_r1_p2019 | sspudb_r1_p2019_joindate_idx |            | CREATE INDEX sspudb_r1_p2019_joindate_idx ON public.sspudb_r1_p2019 USING btree (joindate)
 public     | sspudb_r1_p2020 | sspudb_r1_p2020_joindate_idx |            | CREATE INDEX sspudb_r1_p2020_joindate_idx ON public.sspudb_r1_p2020 USING btree (joindate)
(26 rows)

(6)写入数据 


insert into sspudb_r1 values
(1,'xsq1',18,'male',622722199009121121,'2010-10-01 10:10:10','北京',13651254654,'sspudb@163.com','xsq','first_people'),
(2,'xsq3',18,'male',622722199003121121,'2011-10-01 10:10:10','北京1',13641254654,'sspudb1@163.com','xsq1','first_people1'),
(3,'xsq3',19,'male',622722199033121121,'2012-10-01 10:10:10','北京3',13641254634,'sspudb3@163.com','xsq3','first_people1'),
(4,'xsq3',14,'male',622722199403121121,'2014-10-01 10:10:10','北京4',13641254654,'sspudb4@163.com','xsq1','first_people1'),
(5,'xsq3',15,'male',622722199503121121,'2015-10-01 10:10:10','北京5',13645254654,'sspudb1@163.com','xsq1','first_people1'),
(6,'xsq6',16,'male',622722199603121121,'2016-10-01 10:10:10','北京6',13641256654,'sspudb6@163.com','xsq6','first_people1'),
(7,'xsq3',17,'male',622722199703121121,'2017-10-01 10:10:10','北京7',13647254654,'sspudb7@163.com','xsq1','first_people1'),
(8,'xsq8',18,'male',622722199803121121,'2018-10-01 10:10:10','北京8',13648254654,'sspudb8@163.com','xsq1','first_people1');

(7)检查分区表的数据 
SELECT v.tableoid::regclass,count(v.*) FROM sspudb_r1 v GROUP BY v.tableoid;
sspudb=> SELECT v.tableoid::regclass,count(v.*) FROM sspudb_r1 v GROUP BY v.tableoid;
    tableoid     | count 
-----------------+-------
 sspudb_r1_p2016 |     1
 sspudb_r1_p2011 |     1
 sspudb_r1_p2018 |     1
 sspudb_r1_p2014 |     1
 sspudb_r1_p2010 |     1
 sspudb_r1_p2017 |     1
 sspudb_r1_p2015 |     1
 sspudb_r1_p2012 |     1
(8 rows)

4.总结 

Pg的分区表功能与其他数据库有所不同,其他数据库都是直接创建主表就可以完成分区表的创建,而PG却多了创建子表的步骤。主表和子表分开创建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值