首页 > 代码库 > POSTGRESQL表分区
POSTGRESQL表分区
最近发现POSTGRESQL的一张表(下面统称为test表)达到67G大小,不得不进行重新分区,下面记录一下步骤:
前言、查看数据表结构(表结构肯定是虚构的)
CREATE TABLE test( id integer NOT NULL DEFAULT , logday character varying, -- 登录日期 CONSTRAINT test PRIMARY KEY (id));
一、正式开始-在dw模式下面创建这个父亲表
CREATE TABLE dw.test( id integer NOT NULL DEFAULT , logday character varying, -- 登录日期,发现了吧,tmd是字符类型的 CONSTRAINT test PRIMARY KEY (id));
二、创建子表,你会发现有CHECK,这就是说2013-06月的继承到子表
--创建子表CREATE TABLE dw.testl_yy13mm06 ( CHECK ( substring(logday from 1 for 7) = ‘2013-06‘ )) INHERITS (dw.test);CREATE TABLE dw.test_yy13mm07 ( CHECK ( substring(logday from 1 for 7) = ‘2013-07‘ )) INHERITS (dw.test);--创建索引,其实这个索引是建立在dw模式里面的,删除的时候需要执行:DROP INDEX dw.idx_test_yy13mm06,我就吃过这个亏,没加dw模式CREATE INDEX idx_test_yy13mm06 ON dw.test_yy13mm06 (logday);CREATE INDEX idx_test_yy13mm07 ON dw.test_yy13mm07 (logday);
三、创建触发器
CREATE OR REPLACE FUNCTION test_insert_trigger()RETURNS TRIGGER AS $$BEGIN IF(substring(NEW.logday from 1 for 7) = ‘2013-06‘) THEN INSERT INTO dw.touch_ticket_channel_yy13mm06 VALUES (NEW.*); ELSIF (substring(NEW.logday from 1 for 7) = ‘2013-07‘) THEN INSERT INTO dw.touch_ticket_channel_yy13mm07 VALUES (NEW.*); END IF; RETURN NULL;END;$$LANGUAGE plpgsql ;
四、关联触发器,这样在执行inert语句之前就执行这个触发器了
CREATE TRIGGER test_insert_triggerBEFORE INSERT ON dw.testFOR EACH ROW EXECUTE PROCEDURE test_insert_trigger();
五、插入测试数据
insert into dw.test ( SELECT * FROM test);
执行之后就把public模式下面的test表整体迁移到dw模式下的test表里面了
参考:http://www.php100.com/manual/PostgreSQL8/ddl-partitioning.html
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。