设为首页 加入收藏

TOP

PostgreSQL强大的多层表继承--及其在海量数据分类按月分区存储中的应用(三)
2014-11-24 07:50:42 来源: 作者: 【 】 浏览:13
Tags:PostgreSQL 强大 多层 继承 及其 海量 数据分类 分区 存储 应用
RE' THEN
  • RETURN NULL;
  • END IF;
  • --Generate Table Name
  • str_sub_sample_time = date_part('year',NEW.sample_time)::varchar || '_' ||
  • CASE WHEN date_part('month',NEW.sample_time) <10 THEN '0' ELSE '' END
  • ||date_part('month',NEW.sample_time)::varchar;
  • str_sub_tablename = 'machine2_' || str_sub_sample_time;
  • --Check if table not created
  • select * from pg_tables where schemaname = 'public' and tablename=str_sub_
    tablename
  • into str_sql_cmd;
  • IF NOT FOUND THEN
  • --Create table Cmd
  • str_sql_cmd = '
  • CREATE TABLE '||str_sub_tablename||'
  • (
  • CONSTRAINT pk_'|| str_sub_tablename||' PRIMARY KEY (id ),
  • CONSTRAINT chk_'|| str_sub_tablename||'
  • CHECK(date_part(''year''::text, sample_time) = '||
  • date_part('year',NEW.sample_time)::varchar||
  • '::double precision AND
  • date_part(''month''::text, sample_time) = '||
  • date_part('month',NEW.sample_time)::varchar||'
  • )
  • )
  • INHERITS (base_table_machine2)
  • WITH ( OIDS=FALSE );
  • ALTER TABLE '||str_sub_tablename||' OWNER TO postgres;
  • CREATE INDEX idx_'|| str_sub_tablename||'_sample_time
  • ON '|| str_sub_tablename||'
  • USING btree (sample_time );
  • ';
  • EXECUTE str_sql_cmd;
  • END IF;
  • --insert Data
  • str_sql_cmd = 'INSERT INTO '||str_sub_tablename||'
  • ( id,dvalue,sample_time,machine_code,manu_id,manu_value) VALUES (
  • nextval(''serial_id_seq''),$1,$2,$3,$4,$5);
  • ';
  • EXECUTE str_sql_cmd USING
  • NEW.dvalue,
  • NEW.sample_time,
  • NEW.machine_code,
  • NEW.manu_id,
  • NEW.manu_value;
  • --return null because main table does not really contain data
  • return NULL;
  • END;
  • $BODY$
  • LANGUAGE plpgsql VOLATILE
  • COST 100;
  • ALTER FUNCTION on_insert_base_table_machine2()
  • OWNER TO postgres;
  • 最后,为各个爸爸表设置触发器
    [sql]
    1. CREATE TRIGGER triggle_on_insert_machine1
    2. BEFORE INSERT
    3. ON base_table_machine1
    4. FOR EACH ROW
    5. EXECUTE PROCEDURE on_insert_base_table_machine1();
    [sql]
    1. CREATE TRIGGER triggle_machine2
    2. BEFORE INSERT
    3. ON base_table_machine2
    4. FOR EACH ROW
    5. EXECUTE PROCEDURE on_insert_base_table_machine2();
    到此为止,我们可以分别向各个爸爸表(按类型分区表)插入数据,而后通过爷爷表(总表)
    检索基本信息,通过爸爸表检索详细信息。对总表的操作会遍历反馈到所有子表,试图利用子表的
    索引进行查询。由于按月存储,插入工作只限于本月,所以检索历史数据效率很高。
    当然了,这只是简单的实验,实际字段要比上述字段复杂很多。PostgreSQL的对象-关系数据库对解
    决上述问题非常有帮助,也全面的运用到我公司的各个环节,达到工业化标准的 系统非常稳定,尽管
    设置了备份,但4年来从未真正用到。我们目前使用 16核心机架服务器,8GB内存,Ubuntu 12.04
    LTS,优化配置(Postgresql.conf) 采用设置共享段shared_buffers 512MB, work_mem 32MB,维护maintenance_work_m
    首页 上一页 1 2 3 4 下一页 尾页 3/4/4
    】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
    分享到: 
    上一篇大型数据库的设计原则与开发技巧 下一篇大型数据库设计需要注意的一些原则

    评论

    帐  号: 密码: (新用户注册)
    验 证 码:
    表  情:
    内  容:

    ·求navicat for mysql (2025-12-26 13:21:33)
    ·有哪位大哥推荐一下m (2025-12-26 13:21:30)
    ·MySQL下载与安装教程 (2025-12-26 13:21:26)
    ·Linux_百度百科 (2025-12-26 12:51:52)
    ·Shell 流程控制 | 菜 (2025-12-26 12:51:49)