PostgreSQL 分區表,操作性相當便捷。
但只能在創建時決定是否為分區表,並決定分區條件字段,普通表創建后,不能在修改為分區表。
Note:通過其他方法也可轉化為分區表。
和其他數據庫一樣,分區表作為一個DB的特性,優點自不用說,物理分散,邏輯統一。
必須要注意的一個缺點是:分區表不允許其他表作為外鍵引用。只能在真實場景業務邏輯上當作外鍵,設計時論場景再推敲。
一、分區索引
在Pg 11以前只能單獨為每個分區表建立索引等,且不能在【母表】上建立主鍵、索引等。
Pg 11以后可以針對“邏輯”分區表(母表)建立索引,分區子表自動創建。
簡單Sql:
1 --DROP TABLE dbo.table01; 2 3 CREATE TABLE dbo.table01 ( 4 id bigserial NOT NULL, 5 cre_time timestamp without time zone, 6 note varchar(30) 7 ) PARTITION BY RANGE (cre_time) 8 WITH ( 9 OIDS = FALSE 10 ); 11 12 CREATE TABLE dbo.table01_2018 13 PARTITION OF dbo.table01 14 FOR VALUES FROM ('2018-01-01 00:00:00') TO ('2019-01-01 00:00:00'); 15 16 CREATE TABLE dbo.table01_2017 17 PARTITION OF dbo.table01 18 FOR VALUES FROM ('2017-01-01 00:00:00') TO ('2018-01-01 00:00:00'); 19 20 ALTER TABLE dbo.table01 21 OWNER TO postgres;
二、分區表唯一約束
對於 PostgreSQL 10,只能基於分區創建唯一約束(PRIMARY KEY 和 UNIQUE KEY),而不能針對分區的父表創建唯一約束。PostgreSQL 11 支持分區表上的唯一約束。
CREATE TABLE rtable(c1 INT, c2 VARCHAR(10)) PARTITION BY RANGE(c1);
ALTER TABLE rtable ADD CONSTRAINT pk_rtable PRIMARY KEY(c1);
\d rtable
Table "public.rtable"
Column | Type | Collation | Nullable | Default
--------+-----------------------+-----------+----------+---------
c1 | integer | | not null |
c2 | character varying(10) | | |
Partition key: RANGE (c1)
Indexes:
"pk_rtable" PRIMARY KEY, btree (c1)
Number of partitions: 0
123456789101112
添加分區或者加載(ATTACH)分區時自動創建相應的主鍵:
CREATE TABLE rtable100 PARTITION OF rtable FOR VALUES FROM (1) TO (100);
\d rtable100
Table "public.rtable100"
Column | Type | Collation | Nullable | Default
--------+-----------------------+-----------+----------+---------
c1 | integer | | not null |
c2 | character varying(10) | | |
Partition of: rtable FOR VALUES FROM (1) TO (100)
Indexes:
"rtable100_pkey" PRIMARY KEY, btree (c1)
12345678910
如果在分區表上創建了唯一約束,無法再創建基於外部表(FOREIGN TABLE)的分區。因為無法為外部表創建唯一約束。
CREATE FOREIGN TABLE rtable200 PARTITION OF rtable FOR VALUES FROM (101) TO (200) SERVER remote1;
ERROR: cannot create index on foreign table "rtable200"
12
主鍵約束或唯一約束必須包含分區字段。這樣才能確保整個分區表內的唯一性,因為每個分區上的唯一約束只維護自身的唯一性。
CREATE TABLE rtable1(c1 INT, c2 VARCHAR(10)) PARTITION BY RANGE(c1);
ALTER TABLE rtable1 ADD CONSTRAINT pk_table1 PRIMARY KEY(c2);
ERROR: insufficient columns in PRIMARY KEY constraint definition
DETAIL: PRIMARY KEY constraint on table "rtable1" lacks column "c1" which is part of the partition key.
1234
新的索引修改語句 ALTER INDEX ATTACH PARTITION 可以將分區上的已有索引掛載到分區表上的索引。
轉載自:
https://www.cnblogs.com/jonney-wang/p/9238923.html
https://blog.csdn.net/horses/article/details/85986558