postgres创建表分区

标签: postgres 分区 | 发表时间:2014-07-04 22:44 | 作者:lp895876294
出处:http://www.iteye.com

分区
       PostgreSQL支持基本的表分区功能。
概述
     分区的意思是把逻辑上的一个大表分割成物理上的几块。分区可以提供若干好处:

  • 某些类型的查询性能可以得到极大提升。特别是表中访问率较高的行位于一个单独分区或少数几个分区上的情况下。分区可以减少索引体积从而可以将高使用率部分的索引存放在内存中。如果索引不能全部放在内存中,那么在索引上的读和写都会产生更多的磁盘访问。
  • 当查询或更新一个分区的大部分记录时,连续扫描那个分区而不是使用索引离散的访问整个表可以获得巨大的性能提升。
  • 如果需要大量加载或者删除的记录位于单独的分区上,那么可以通过直接读取或删除那个分区以获得巨大的性能提升,因为ALTER TABLE比操作大量的数据要快的多。它同时还可以避免由于大量DELETE导致的VACUUM超载。
  • 很少用的数据可以移动到便宜一些的慢速存储介质上。

       这种好处通常只有在表可能会变得非常大的情况下才有价值。到底多大的表会从分区中收益取决于具体的应用, 不过有个基本的拇指规则就是表的大小超过了数据库服务器的物理内存大小。
       目前, 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;




 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [postgres 分区] 推荐:

postgres创建表分区

- - 数据库 - ITeye博客
       PostgreSQL支持基本的表分区功能.      分区的意思是把逻辑上的一个大表分割成物理上的几块. 某些类型的查询性能可以得到极大提升. 特别是表中访问率较高的行位于一个单独分区或少数几个分区上的情况下. 分区可以减少索引体积从而可以将高使用率部分的索引存放在内存中. 如果索引不能全部放在内存中,那么在索引上的读和写都会产生更多的磁盘访问.

bucardo5.3 postgres主从同步

- - x-marker的博客
在报表应用、olap等领域,bucardo可以把数据实时异步的传输到备库,然后在备库中可以进行数据转换、建临时表、报表等操作,而pg原生的stream replication只能是只读操作,所以bucardo的应用领域还是很广的. 今天分两篇分别记录下pg到pg的主从同步和pg到mysql的主从同步.

监控Postgres数据库

- - 数据库 - ITeye博客
官方文档中有关监控的章节:. 这个可以实时监控数据库,但是没有系统cpu和内存图表. 大多数带有系统监控的,都是通过插件实现的,要多安装和配置一些东西. 下面是安装powa的步骤,Centos系统. 在官网下载代码,现在是2.0版,这个版本需要postgresql是9.4以上版本. 我的pg是9.3版,所以下载的1.2.1版本.

Postgres 数据库分析工具

- - CSDN博客数据库推荐文章
Postgres号称是开源免费DBMS最强大的,并且支持二次开发. 本文就该DBMS的分析工具进行讨论. pg_class表记载表和几乎所有有 字段或者是那些类似表的东西. pg_index),序列,视图,复合类型和一些特殊关系类型. 也有pg_index这张表,包含关于索引的一部分信息.    relname(表,索引,视图等的名字); .

spring boot与spring batch、postgres及elasticsearch整合

- - 互联网 - ITeye博客
当系统有大量数据需要从数据库导入elasticsearch时,使用sping batch可以提高导入的效率. 这篇文章使用spring batch将数据从postgres导入elasticsearch. 本文使用spring data jest连接ES(也可以使用spring data elasticsearch连接ES),ES版本为5.5.3.

Postgres-XL:基于PostgreSQL的开源分布式实现

- - 标点符
Postgres-XL 全称为 Postgres eXtensible Lattice,是TransLattice公司及其收购数据库技术公司–StormDB的产品. Postgres-XL是一个横向扩展的开源数据库集群,具有足够的灵活性来处理不同的数据库任务. Postgres-XL 功能特性. 开放源代码:(源协议使用宽松的“ Mozilla Public License”许可,允许将开源代码与闭源代码混在一起使用.

管理大型 Postgres 数据库的 3 个技巧

- - Linux 中国◆开源社区
在处理庞大的数据库时,请尝试这些方便的解决方案,以解决常见的问题. 关系型数据库 PostgreSQL(也被称为 Postgres)已经越来越流行,全球各地的企业和公共部门都在使用它. 随着这种广泛的采用,数据库已经变得比以前更大了. 在 Crunchy Data,我们经常与 20TB 以上的数据库打交道,而且我们现有的数据库还在继续增长.

hiveQL分区表

- - CSDN博客云计算推荐文章
2、加载数据时显示指定分区值. 4、show partitions 可以查看表的分区. 注意:partitioned by 子句中定义的列,数据文件中并不包含这些列值. 5、select 使用分区列查询,hive会对输入做修剪;. 作者:u011984824 发表于2013-11-7 13:25:38 原文链接.

mysql分区举例---子分区

- - ITeye博客
mysql允许RANGE和LIST分区上再进行HASH和KEY的子分区. 建立ts3表和ts2一模一样. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

mysql分区举例---HASH分区

- - ITeye博客
    hash分区的目的是将数据均匀的分布到预先定义的各个分区中,保证各分区的数据数量大致一致. 在RANGE和LIST分区中,必须明确指定一个给定的列值或列值集合应该保存在哪个分区中;而在HASH分区中,MYSQL自动完成这些工作,用户所要做的只是基于将要被散列的列值指定一个列值或者表达式,以及指定呗分区的表将要被分割成的分区数量.