表分区的实现,可以用继承实现
CREATE TABLE loan_data_yy05mm11 ( ) INHERITS (loan_data);
ALTER TABLE loan_data_yy06mm01 NO INHERIT loan_data;
分区表可以根据日期来做
CREATE TABLE loan_data_yy04mm02 (
CHECK ( logdate >= DATE '2004-02-01' AND logdate < DATE '2004-03-01')
) INHERITS (loan_data);
尽可能基于键值创建索引
CREATE INDEX loan_data_yy04mm02_logdate ON loan_data_yy04mm02 (logdate);
定义一个规则或者触发器,把对主表的修改重定向到适当的分区表。 如果数据只进入最新的分区,我们可以设置一个非常简单的规则来插入数据。 我们必须每个月都重新定义这个规则,即修改重定向插入的子表名,这样它总是指向当前分区。
CREATE OR REPLACE RULE loan_data_current_partition AS
ON INSERT TO loan_data DO INSTEAD
INSERT INTO loan_data_yy06mm01 VALUES (NEW.city_id, NEW.logdate, NEW.peaktemp);
其中NEW是关键字,表示新数据字段的集合。这里可以通过点(.)操作符来获取集合中的每一个字段。 我们可能想插入数据并且想让服务器自动定位应该向哪个分区插入数据。 我们可以用像下面这样的更复杂的规则集来实现这个目标
CREATE RULE loan_data_insert_yy05mm12 AS
ON INSERT TO loan_data WHERE (logdate >= DATE '2005-12-01' AND logdate < DATE '2006-01-01')
DO INSTEAD
INSERT INTO loan_data_yy05mm12 VALUES (NEW.city_id, NEW.logdate, NEW.peaktemp);
CREATE RULE loan_data_insert_yy06mm01 AS
ON INSERT TO loan_data WHERE (logdate >= DATE '2006-01-01' AND logdate < DATE '2006-02-01')
DO INSTEAD
INSERT INTO loan_data_yy06mm01 VALUES (NEW.city_id, NEW.logdate, NEW.peaktemp);
添加新分区: 第一种方法简单且直观,我们只是创建新的子表,同时为其定义新的检查约束
CREATE TABLE loan_data_y2008m02 (
CHECK ( logdate >= DATE '2008-02-01' AND logdate < DATE '2008-03-01' )
) INHERITS (loan_data);
第二种方法的创建步骤相对繁琐,但更为灵活和实用。见以下四步: /* 创建一个独立的数据表(loan_data_y2008m02),该表在创建时以将来的主表(loan_data)为模板, 包含模板表的缺省值(DEFAULTS)和一致性约束(CONSTRAINTS)。*/
CREATE TABLE loan_data_y2008m02
(LIKE loan_data INCLUDING DEFAULTS INCLUDING CONSTRAINTS);
/* 为该表创建未来作为子表时需要使用的检查约束。*/
ALTER TABLE loan_data_y2008m02 ADD CONSTRAINT y2008m02
CHECK (logdate >= DATE '2008-02-01' AND logdate < DATE '2008-03-01');
/* 导入数据到该表。下面只是给出一种导入数据的方式作为例子。在导入数据之后,如有可能, 还可以做进一步的数据处理,如数据转换、过滤等。*/
\copy loan_data_y2008m02 from 'loan_data_y2008m02'
/* 在适当的时候,或者说在需要的时候,让该表继承主表。*/
ALTER TABLE loan_data_y2008m02 INHERIT loan_data;
如果要批量创建分区,请移步:批量创建分区表、索引