用户登录
用户注册

分享至

postgresql 分区

  • 作者: 兜里有鱼26867236
  • 来源: 51数据库
  • 2020-09-22
在数据库日渐庞大的今天,为了方便对数据库数据的管理,比如按时间,按地区去统计一些数据时,基数过于庞大,多有不便。很多商业数据库都提供分区的概念,按不同的维度去存放数据,便于后期的管理,PostgreSQL也不例外。
  PostgresSQL分区的意思是把逻辑上的一个大表分割成物理上的几块儿。分区不仅能带来访问速度的提升,关键的是,它能带来管理和维护上的方便。
  分区的具体好处是:
  某些类型的查询性能可以得到极大提升。
  更新的性能也可以得到提升,因为表的每块的索引要比在整个数据集上的索引要小。如果索引不能全部放在内存里,那么在索引上的读和写都会产生更多的磁盘访问。
  批量删除可以用简单的删除某个分区来实现。
  可以将很少用的数据移动到便宜的、转速慢的存储介质上。
  在PG里表分区是通过表继承来实现的,一般都是建立一个主表,里面是空,然后每个分区都去继承它。无论何时,都应保证主表里面是空的。
  小表分区不实际,表在多大情况下才考虑分区呢?PostgresSQL官方给出的建议是:当表本身大小超过了机器物理内存的实际大小时(the size of the table should exceed the physical memory of the database server),可以考虑分区。
  PG目前(9.2.2)仅支持范围分区和列表分区,尚未支持散列分区。
  二、环境
  系统环境:CentOS release 6.3 (Final)
  PostgreSQL版本:PostgreSQL 9.2.2 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.6 20120305 (Red Hat 4.4.6-4), 64-bit
  三、实现分区
  3.1 创建主表

  david=# create table tbl_partition (
david(# id integer,
david(# name varchar(20),
david(# gender boolean,
david(# join_date date,
david(# dept char(4));
CREATE TABLE
david=#

  3.2 创建分区表

  david=# create table tbl_partition_201211 (
check ( join_date >= DATE '2012-11-01' AND join_date < date="" '2012-12-01'="" )="" )="" inherits="" (tbl_partition);="" create="" table="" david="#" create="" table="" tbl_partition_201212="" (="" check="" (="" join_date="">= DATE '2012-12-01' AND join_date < date="" '2013-01-01'="" )="" )="" inherits="" (tbl_partition);="" create="" table="" david="#" create="" table="" tbl_partition_201301="" (="" check="" (="" join_date="">= DATE '2013-01-01' AND join_date < date="" '2013-02-01'="" )="" )="" inherits="" (tbl_partition);="" create="" table="" david="#" create="" table="" tbl_partition_201302="" (="" check="" (="" join_date="">= DATE '2013-02-01' AND join_date < date="" '2013-03-01'="" )="" )="" inherits="" (tbl_partition);="" create="" table="" david="#" create="" table="" tbl_partition_201303="" (="" check="" (="" join_date="">= DATE '2013-03-01' AND join_date < date="" '2013-04-01'="" )="" )="" inherits="" (tbl_partition);="" create="" table="" david="#" create="" table="" tbl_partition_201304="" (="" check="" (="" join_date="">= DATE '2013-04-01' AND join_date < date="" '2013-05-01'="" )="" )="" inherits="" (tbl_partition);="" create="" table="" david="#" create="" table="" tbl_partition_201305="" (="" check="" (="" join_date="">= DATE '2013-05-01' AND join_date < date="" '2013-06-01'="" )="" )="" inherits="" (tbl_partition);="" create="" table="" david="#"   3.3="" 分区键上建索引=""   david="#" create="" index="" tbl_partition_201211_joindate="" on="" tbl_partition_201211="" (join_date);="" create="" index="" david="#" create="" index="" tbl_partition_201212_joindate="" on="" tbl_partition_201212="" (join_date);="" create="" index="" david="#" create="" index="" tbl_partition_201301_joindate="" on="" tbl_partition_201301="" (join_date);="" create="" index="" david="#" create="" index="" tbl_partition_201302_joindate="" on="" tbl_partition_201302="" (join_date);="" create="" index="" david="#" create="" index="" tbl_partition_201303_joindate="" on="" tbl_partition_201303="" (join_date);="" create="" index="" david="#" create="" index="" tbl_partition_201304_joindate="" on="" tbl_partition_201304="" (join_date);="" create="" index="" david="#" create="" index="" tbl_partition_201305_joindate="" on="" tbl_partition_201305="" (join_date);="" create="" index="" david="#"   对于开发人员来说,希望数据库是透明的,只管="" insert="" into="" tbl_partition。对于数据插向哪个分区,则希望由db决定。这点,oracle实现了,但是pg不行,需要前期人工处理下。=""   3.4="" 创建触发器函数=""   david="#" create="" or="" replace="" function="" tbl_partition_insert_trigger()="" returns="" trigger="" as="" $$="" begin="" if="" (="" new.join_date="">= DATE '2012-11-01' AND
NEW.join_date < date="" '2012-12-01'="" )="" then="" insert="" into="" tbl_partition_201211="" values="" (new.*);="" elsif="" (="" new.join_date="">= DATE '2012-12-01' AND
NEW.join_date < date="" '2013-01-01'="" )="" then="" insert="" into="" tbl_partition_201212="" values="" (new.*);="" elsif="" (="" new.join_date="">= DATE '2013-01-01' AND
NEW.join_date < date="" '2013-02-01'="" )="" then="" insert="" into="" tbl_partition_201301="" values="" (new.*);="" elsif="" (="" new.join_date="">= DATE '2013-02-01' AND
NEW.join_date < date="" '2013-03-01'="" )="" then="" insert="" into="" tbl_partition_201302="" values="" (new.*);="" elsif="" (="" new.join_date="">= DATE '2013-03-01' AND
NEW.join_date < date="" '2013-04-01'="" )="" then="" insert="" into="" tbl_partition_201303="" values="" (new.*);="" elsif="" (="" new.join_date="">= DATE '2013-04-01' AND
NEW.join_date < date="" '2013-05-01'="" )="" then="" insert="" into="" tbl_partition_201304="" values="" (new.*);="" elsif="" (="" new.join_date="">= DATE '2013-05-01' AND
NEW.join_date < date="" '2013-06-01'="" )="" then="" insert="" into="" tbl_partition_201305="" values="" (new.*);="" else="" raise="" exception="" 'date="" out="" of="" range.="" fix="" the="" tbl_partition_insert_trigger()="" function!';="" end="" if;="" return="" null;="" end;="" $$="" language="" plpgsql;="" create="" function="" david="#"   说明:如果不想丢失数据,上面的else="" 条件可以改成="" insert="" into="" tbl_partition_error_join_date="" values="" (new.*);="" 同时需要创建一张结构和tbl_partition="" 一样的表tbl_partition_error_join_date,这样,错误的join_date="" 数据就可以插入到这张表中而不是报错了。="">



  postgresql安装:一、windows下安装过程 安装介质:postgresql-9.1.3-1-windows.exe(46m),安装过程非常简单,过程如下: 1、开始安装: 2、选择程序安装目录: 注:安装 postgresql 的分区最好是 ntfs 格式的。postgresql 首要任务是要保证数
软件
前端设计
程序设计
Java相关