Partitioning
Postgres 10 和按週分區
我試圖了解分區是如何工作的,而主要手冊對我沒有多大幫助。
此外,
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);
我需要創建觸發器嗎?要不然是啥?
只有使用繼承實現時才需要觸發器