Partitioning

Postgres 10 和按週分區

  • November 22, 2017

我試圖了解分區是如何工作的,而主要手冊對我沒有多大幫助。

此外,PostgreSQL 10本機支持分區……但這意味著什麼?

是否可以聲明表:

CREATE TABLE public.audit_logs (
       log_type varchar(31) NOT NULL,
       id int8 NOT NULL DEFAULT nextval('audit_logs_id_seq'::regclass),
       additional_data varchar(1024) NULL DEFAULT NULL::character varying,
       week int NOT NULL DEFAULT date_trunc('week', CURRENT_TIMESTAMP),
       CONSTRAINT audit_logs_pkey PRIMARY KEY (id)
)
WITH (
       OIDS=FALSE
)
PARTITION BY  (week) ;

以及如何創建自動表public.audit_logs_N,其中 N 是周數?

我需要創建觸發器嗎?要不然是啥?

主要手冊對我幫助不大。

我希望你已經閱讀了手冊,兩個條目:

ddl_partitioning(和限制5.10.2.3. Limitations

創建表

如果是,請具體說明您對此不了解的地方。

本地分區……但這意味著什麼?

您不必創建檢查約束、觸發函式或觸發器。

上面的 SQL 範例需要這樣修改:

e07=# CREATE TABLE public.audit_logs (
       log_type varchar(31) NOT NULL,
       id serial NOT NULL ,
       additional_data varchar(1024) NULL DEFAULT NULL::character varying,
       week int NOT NULL DEFAULT date_part('week', CURRENT_TIMESTAMP)
)
PARTITION BY list  (week) ;

--catch this error in the code:
--ERROR:  no partition of relation "audit_logs" found for row    

以及如何創建自動表 public.audit_logs_N,其中 N 是周數?

根據要求,提前創建分區或使用 pgagent(或 crontab)在前一周一次創建一個。

create table audit_logs_not_1 partition of audit_logs for values in (1);
...
create table audit_logs_not_53 partition of audit_logs for values in (53);

我需要創建觸發器嗎?要不然是啥?

只有使用繼承實現時才需要觸發器

引用自:https://dba.stackexchange.com/questions/191495