Postgres hat ja nun seit der Version 10 auch Partitionierung bei Tabellen im Einsatz und das natürlich wie immer kostenlos.
Derzeit werden die folgenden Partitionierungen unterstützt:
- Range Partitionierung
- List Partitionierung
- Hash Partitionierung
Beispiel zu Range Partitionierung (ohne Primary Key):
CREATE TABLE emp (
empno INT,
ename VARCHAR(30),
hiredate date not null
) PARTITION BY RANGE (hiredate);
CREATE TABLE emp_p2016 PARTITION OF emp
FOR VALUES FROM ('2016-01-01') TO ('2017-01-01');
CREATE TABLE emp_y2017 PARTITION OF emp
FOR VALUES FROM ('2017-01-01') TO ('2018-01-01');
INSERT INTO emp (empno,ename,hiredate)
VALUES (8000,'MARCO','2016-03-10');
Wenn Die Tabelle einen Primary beinhalten soll, muss die Partitionierungspalte im Key enthalten sein, sonst erhält man den Fehler:
FEHLER: insufficient columns in PRIMARY KEY constraint definition
DETAIL: PRIMARY KEY constraint on table "emp" lacks column "hiredate" which is part of the partition key.
CREATE TABLE emp (
empno INT ,
ename VARCHAR(30),
hiredate date not null,
PRIMARY KEY(empno,hiredate)
) PARTITION BY RANGE (hiredate);
Beispiel zu LIst Partitionierung:
CREATE TABLE dept
( deptno int,
dname varchar(20),
loc varchar(20) );
CREATE TABLE dept10 PARTITION OF dept FOR VALUES IN (10,12,14);
CREATE TABLE dept20 PARTITION OF dept FOR VALUES IN (20,22,24);
CREATE TABLE dept30 PARTITION OF dept FOR VALUES IN (30,32,34);
CREATE TABLE dept_def PARTITION OF dept DEFAULT;
In der optionalen Default Partition landen alle Einträge, die sonst in keine Partition passen.
Wenn Sie keine Default Partition besitzen und der Datensatz kann ich zugeordnet werden, bekommen Sie den Fehler:
FEHLER: keine Partition von Relation »dept« für die Zeile gefunden
DETAIL: Partitionierungsschlüssel der fehlgeschlagenen Zeile enthält (deptno) = (50).
Partitionen löschen:
DROP TABLE dept30;
Hash Partitionierung
Bei der Hash Partitionierung übernimmt Postgres die richtige Verteilung der Daten auf die Partitionen:
CREATE TABLE dept (
deptno int primary key,
dname VARCHAR(10),
loc VARCHAR2(10) )
partition by hash(deptno);
CREATE TABLE dept_1 PARTITION OF dept FOR VALUES WITH (MODULUS 4, REMAINDER 0);
CREATE TABLE dept_2 PARTITION OF dept FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE dept_3 PARTITION OF dept FOR VALUES WITH (MODULUS 4, REMAINDER 2);
CREATE TABLE dept_4 PARTITION OF dept FOR VALUES WITH (MODULUS 4, REMAINDER 3);
\d+ dept