zoukankan      html  css  js  c++  java
  • 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_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

    续:

    我上面犯了一个特别致命的错误,虽然使用函数substring实现了分区,但是查找的时候,没有直接走分区块。比如:SELECT * FROM test WHERE logday = '20174-07-01',所以这条语句需要全表扫描,解决办法:

    CHECK substring(NEW.logday from 1 for 7) = '2013-06'

    修改为:

    CHECK ( logday >= '2013-06-01' AND logday <'2013-07-01' )

    当然触发器也要做出一样的调整!~

  • 相关阅读:
    上传并压缩图片
    C#使用一般处理程序(ashx)中session
    cookie记住用户名密码
    操作数组
    鼠标滚轮事件兼容写法
    table嵌套table,jquery获取tr个数
    网站性能调优实战-学相伴KuangStudy
    为什么fdisk分区第一个分区以63或者2048扇区开始?
    oracle分组查询,获取组内所有信息(拼接显式)
    oracle中对象类型搜集(object type)
  • 原文地址:https://www.cnblogs.com/liqiu/p/3843022.html
Copyright © 2011-2022 走看看