--下面的描述不记得在哪里抄来的了?!

表分区就是把逻辑上一个大表分割成物理上的多个小块,表分区可提供如下若干好处:

1.某些类型的查询性能可以得到极大提升。

2.更新的性能可以得到提升,因为表的每块索引要比整个数据集上的索引要小,如果索引不能全部放在内存里,那么在索引上的读写都会产生磁盘访问。

3.批量删除可以用简单的删除某个分区

4.将很少使用的数据移动到便宜的慢一些的存储介质上。

示例1.

1.创建主表

create table tbl_inherits_test
(
a int,
b timestamp without time zone
);
create index idx_tbl_inherits_test_b on tbl_inherits_test using btree (b);

2.创建触发器函数,在INSERT父表时根据时间字段b写入时间b的分表,如果分表b不存在,则创建分表b,然后再INSERT分表

create or replace function f_insert_tbl_inherits_test() returns trigger as
$body$
declare tablename varchar(32) default '';
begin
tablename='tbl_inherits_test_'||to_char(NEW.b,'YYYY_MM_DD'); execute 'insert into '||tablename||'(a,b) values('||NEW.a||','''||NEW.b||''')';
    return null;
    EXCEPTION
when undefined_table then
execute 'create table '||tablename||'() inherits (tbl_inherits_test)';
execute 'create index idx_'||tablename||'_b on '||tablename||' using btree(b)';
execute 'insert into '||tablename||'(a,b) values('||NEW.a||','''||NEW.b||''')';
return null;
end;
$body$
language plpgsql;

3.创建触发器,当INSERT主表时执行触发器函数

create trigger trg_insert_tbl_inherits_test before insert on tbl_inherits_test for each row execute procedure f_insert_tbl_inherits_test();

4.向主表写数据验证结果

test=#insert into tbl_inherits_test(a,b) values(1,'2016-06-20 17:40:21');
test=# \d+ tbl_inherits_test
Table "public.tbl_inherits_test"
Column | Type | Modifiers | Storage | Stats target | Description
--------+-----------------------------+-----------+---------+--------------+-------------
a | integer | | plain | |
b | timestamp without time zone | | plain | |
Indexes:
"idx_tbl_inherits_test_b" btree (b)
Triggers:
trg_insert_tbl_inherits_test BEFORE INSERT ON tbl_inherits_test FOR EACH ROW EXECUTE PROCEDURE f_insert_tbl_inherits_test()
Child tables: tbl_inherits_test_2016_06_20

5.结果显示INSERT主表时会根据INSERT的数据b(2016-06-20 17:40:21)自动创建一个分表tbl_inherits_test_2016_06_20,再写入几条数据,查看结果

test=# insert into tbl_inherits_test(a,b) values (2,'2016-06-20 08:08:08'),(3,'2016-06-21 19:00:00');
INSERT 0 0
test=# \d+ tbl_inherits_test
Table "public.tbl_inherits_test"
Column | Type | Modifiers | Storage | Stats target | Description
--------+-----------------------------+-----------+---------+--------------+-------------
a | integer | | plain | |
b | timestamp without time zone | | plain | |
Indexes:
"idx_tbl_inherits_test_b" btree (b)
Triggers:
trg_insert_tbl_inherits_test BEFORE INSERT ON tbl_inherits_test FOR EACH ROW EXECUTE PROCEDURE f_insert_tbl_inherits_test()
Child tables: tbl_inherits_test_2016_06_20,
tbl_inherits_test_2016_06_21

6.分别查询主表和分表的数据,直接查询主表会查询到所有分表的数据,但是使用only查询主表发现,主表中并没有数据(因为触发器函数中返回的是null)

test=# select * from tbl_inherits_test_2016_06_20 ;
a | b
---+---------------------
1 | 2016-06-20 17:40:21
2 | 2016-06-20 08:08:08
(2 rows) test=# select * from tbl_inherits_test_2016_06_21 ;
a | b
---+---------------------
3 | 2016-06-21 19:00:00
(1 row) test=#
test=# select * from tbl_inherits_test ;
a | b
---+---------------------
1 | 2016-06-20 17:40:21
2 | 2016-06-20 08:08:08
3 | 2016-06-21 19:00:00
(3 rows) test=# select * from only tbl_inherits_test ;
a | b
---+---
(0 rows)

postgresql----表分区的更多相关文章

  1. 示例讲解PostgreSQL表分区的三种方式

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 表分区是解决一些因单表过大引用的性能问题的方式,比如某张表过大就会造成查询变慢,可能分区是一种解决方案.一般建议 ...

  2. POSTGRESQL表分区

    最近发现POSTGRESQL的一张表(下面统称为test表)达到67G大小,不得不进行重新分区,下面记录一下步骤: 前言.查看数据表结构(表结构肯定是虚构的) CREATE TABLE test ( ...

  3. 用HAWQ轻松取代传统数据仓库(八) —— 大表分区

    一.HAWQ中的分区表        与大多数关系数据库一样,HAWQ也支持分区表.这里所说的分区表是指HAWQ的内部分区表,外部分区表在后面“外部数据”篇讨论.在数据仓库应用中,事 实表通常有非常多 ...

  4. SQL Server表分区

    什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在 ...

  5. sql表分区

    1.单表达多少条数据后需要分区呢?   a.个人认为要似情况而定,有些常操作的表,分区反而带来麻烦,可以采用物理分表以及其它方法处理:   b.对于一些日志.历史订单类的查询数据,500w左右即可享受 ...

  6. Oracle10g 表分区

    1.分区的原因 (1)Tables greater than 2GB should always be considered for partitioning. (2)Tables containin ...

  7. oracle11g interval(numtoyminterval())自动创建表分区

    Oracle11g通过间隔分区实现按月创建表分区 在项目数据库设计过程中由于单表的数据量非常庞大,需要对表进行分区处理.由于表中的数据是历史交易,故按月分区,提升查询和管理. 由于之前对于表分区了解不 ...

  8. oracle表分区以及普表转分区表(转)

    概述 Oracle的表分区功能通过改善可管理性.性能和可用性,从而为各式应用程序带来了极大的好处.通常,分区可以使某些查询以及维护操作的性能大大提高.此外,分区还可以极大简化常见的管理任务,分区是构建 ...

  9. Mysql 表分区

    是否支持分区:mysql> show variables like '%partition%';+-----------------------+-------+| Variable_name ...

  10. SQL Server表分区的NULL值问题

    SQL Server表分区的NULL值问题 SQL Server表分区只支持range分区这一种类型,但是本人觉得已经够用了 虽然MySQL支持四种分区类型:RANGE分区.LIST分区.HASH分区 ...

随机推荐

  1. SEO之基于thinkphp的URL伪静态

    最近基于thinkphp开发了个导购网站,现在有时间,将遇到的伪静态问题整理下,与大家分享.1.设置URL伪静态在config.ini.php中设置,如果只想前台URL伪静态,那么只在前台的confi ...

  2. 逻辑斯特回归(logistic regression)的迭代变权最小平方差算法(IRLS)

    参考资料:http://blog.csdn.net/xuanyuansen/article/details/41050507 习题: 数据及代码:  https://pan.baidu.com/s/1 ...

  3. JSONObject、JSONArray

    最近两个星期接触最多的就是json和map了. 之前用到的json,就是一个键对应一个值,超级简单的一对一关系.现在用到的json那可以层层嵌套啊,刚开始接触的时候,确实有种崩溃的赶脚,不想去理,取个 ...

  4. AOP(Aspect Oriented Programming),即面向切面编程

    AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入 ...

  5. 谷歌修复了 FFmpeg 中上千个 bug

    谷歌在科技业界中几乎每天都会创造出新闻素材,它的触手涉及到了生活中的多个领域.最近谷歌将其Google +社交网络与邮件服务Gmail相结合.然而今天谷歌宣布他们修复了FFmpeg的上千个bug.   ...

  6. 《Java程序猿面试笔试宝典》之组合与继承有什么差别

    组合和继承是面向对象中两种代码复用的方式. 组合是指在新类里面创建原有类的对象,反复利用已有类的功能.继承是面向对象的主要特性之中的一个,它同意设计人员依据其他类的实现来定义一个类的实现. 组合和继承 ...

  7. R语言低级绘图函数-abline

    abline 函数的作用是在一张图表上添加直线, 可以是一条斜线,通过x或y轴的交点和斜率来确定位置:也可以是一条水平或者垂直的线,只需要指定与x轴或y轴交点的位置就可以了 常见用法: 1)添加直线 ...

  8. git 分支的创建、合并、删除

          基本概念与命令 分支(branch):每次提交,Git都把提交的内容串成一条时间线,这条时间线就是一个分支 .   git 分支的创建 git branch branchName git ...

  9. c#.net常用函数和方法集

    1.DateTime 数字型 System.DateTime currentTime=new System.DateTime(); 1.1 取当前年月日时分秒 currentTime=System.D ...

  10. Java精选笔记_会话技术

    会话及其会话技术 会话概述 指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程. 会话:从浏览器开启到浏览器关闭.会话技术:用来保存在会话期间 浏览器和服务器所产生的数据. 在 ...