PostgreSQL 10 - 数据分区
一个块的默认大小是8KB,所以,PostgreSQL的一张表可以保存最多32TB的数据。但是,大表太不方便了,应该使用分区表。
从PostgreSQL 10.0开始,用户可以更方便地处理数据分区了。
增加分区
我们先看看旧的分区办法。
在研究分区的优点之前,先展示一下如何创建分区。一切从父表开始:
postgres=# CREATE TABLE t_data (id serial, t date, payload text);
CREATE TABLE
表一共3列,我们会使用日期列做分区。
有了父表,就可以创建子表:
postgres=# CREATE TABLE t_data_2016 () INHERITS (t_data);
CREATE TABLE
postgres=# \d t_data_2016
数据表 "public.t_data_2016"
栏位 | 类型 | Collation | Nullable | Default
---------+---------+-----------+----------+------------------------------------
id | integer | | not null | nextval('t_data_id_seq'::regclass)
t | date | | |
payload | text | | |
继承: t_data
t_data_2016继承了t_data。()的意思是表里没有额外的列。继承的意思是父的所有列在子表内都有效。而且,id列会继承父表的sequence,所以所有的子都分享相同的数字。
增加更多的表:
postgres=# CREATE TABLE t_data_2015 () INHERITS (t_data);
CREATE TABLE
postgres=# CREATE TABLE t_data_2014 () INHERITS (t_data);
CREATE TABLE
这些表都一样,继承自t_data。当然,子表也可以有父表不包含的列:
postgres=# CREATE TABLE t_data_2013 (special text) INHERITS (t_data);
CREATE TABLE
这样,很轻松地加了一列。它对父表没影响,只是丰富了子表-可以保存更多信息。
创建了这么多表,我们插入一行:
postgres=# INSERT INTO t_data_2015 (t, payload)
postgres-# VALUES ('2015-05-04',