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却多了创建子表的步骤。主表和子表分开创建。