postgres创建表分区
- - 数据库 - ITeye博客 PostgreSQL支持基本的表分区功能. 分区的意思是把逻辑上的一个大表分割成物理上的几块. 某些类型的查询性能可以得到极大提升. 特别是表中访问率较高的行位于一个单独分区或少数几个分区上的情况下. 分区可以减少索引体积从而可以将高使用率部分的索引存放在内存中. 如果索引不能全部放在内存中,那么在索引上的读和写都会产生更多的磁盘访问.
分区
PostgreSQL支持基本的表分区功能。
概述
分区的意思是把逻辑上的一个大表分割成物理上的几块。分区可以提供若干好处:
这种好处通常只有在表可能会变得非常大的情况下才有价值。到底多大的表会从分区中收益取决于具体的应用, 不过有个基本的拇指规则就是表的大小超过了数据库服务器的物理内存大小。
目前, PostgreSQL支持通过表继承进行分区。每个分区必须做为单独一个父表的子表进行创建。父表自身通常是空的,它的存在只是为了代表整个数据集。你在试图实现分区之前,应该先熟悉继承
PostgreSQL可以实现下面形式的分区:
表被一个或者多个关键字段分区成"范围",这些范围在不同的分区里没有重叠。比如,我们可以为特定的商业对象根据数据范围分区,或者根据标识符范围分区。
表通过明确地列出每个分区里应该出现那些关键字值实现。
实现分区
要设置一个分区的表,做下面的步骤:
--创建序列 create sequence id_seq increment by 1 minvalue 1 no maxvalue start with 1; --查询序列的值 select nextval('id_seq') ; select currval('id_seq') ; --创建日志表 CREATE TABLE ss_log ( id integer NOT NULL DEFAULT nextval('id_seq'::regclass), createtime timestamp without time zone, model character varying(100), CONSTRAINT log_pkey PRIMARY KEY (id) ) WITH ( OIDS=FALSE ); ALTER TABLE ss_log OWNER TO postgres; --查询日志表数据 select * from ss_log ; --插入日志信息 insert into ss_log values(4,current_date ,'model') ; --为ss_log创建触发器,分配需要插入到日志表中的数据 CREATE TRIGGER insert_ss_log_trigger BEFORE INSERT ON ss_log FOR EACH ROW EXECUTE PROCEDURE ss_log_insert_trigger(); CREATE OR REPLACE FUNCTION ss_log_insert_trigger() RETURNS TRIGGER AS $$ declare table_name varchar := null ; log_createtime varchar := null ; BEGIN log_createtime := to_char(NEW.createtime,'yyyyMMdd') ; select relname into table_name from pg_class where relname = 'ss_log_'||log_createtime ; if table_name is null then table_name := 'ss_log_'||log_createtime ; execute 'CREATE TABLE '||table_name||' ( CHECK ( createtime >= '''||log_createtime||'''::timestamp AND createtime < ('''||log_createtime||'''::timestamp + interval ''1d'') ) )INHERITS (ss_log)'; end if ; --将数据插入相应的表 ss_log_20140704 execute 'INSERT INTO '|| table_name||'(id,createtime,model) VALUES ('||NEW.id||','''||NEW.createtime||''','''||NEW.model||''')' ; --不向主表中查数据 RETURN NULL; END; $$ LANGUAGE plpgsql;