码迷,mamicode.com
首页 > 数据库 > 详细

POSTGRESQL表分区

时间:2014-07-14 19:23:11      阅读:305      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   数据   

最近发现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_trigger
BEFORE INSERT ON dw.test
FOR 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

POSTGRESQL表分区,布布扣,bubuko.com

POSTGRESQL表分区

标签:style   blog   http   color   os   数据   

原文地址:http://www.cnblogs.com/liqiu/p/3843022.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!