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 for ) = '2013-06' )) INHERITS (dw.test);
CREATE TABLE dw.test_yy13mm07 ( CHECK ( substring(logday from for ) = '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 for ) = '2013-06') THEN
INSERT INTO dw.touch_ticket_channel_yy13mm06 VALUES (NEW.*);
ELSIF (substring(NEW.logday from for ) = '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 for ) = '2013-06'
修改为:
CHECK ( logday >= '2013-06-01' AND logday <'2013-07-01' )
当然触发器也要做出一样的调整!~
POSTGRESQL表分区的更多相关文章
- 示例讲解PostgreSQL表分区的三种方式
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 表分区是解决一些因单表过大引用的性能问题的方式,比如某张表过大就会造成查询变慢,可能分区是一种解决方案.一般建议 ...
- 用HAWQ轻松取代传统数据仓库(八) —— 大表分区
一.HAWQ中的分区表 与大多数关系数据库一样,HAWQ也支持分区表.这里所说的分区表是指HAWQ的内部分区表,外部分区表在后面“外部数据”篇讨论.在数据仓库应用中,事 实表通常有非常多 ...
- SQL Server表分区
什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在 ...
- sql表分区
1.单表达多少条数据后需要分区呢? a.个人认为要似情况而定,有些常操作的表,分区反而带来麻烦,可以采用物理分表以及其它方法处理: b.对于一些日志.历史订单类的查询数据,500w左右即可享受 ...
- Oracle10g 表分区
1.分区的原因 (1)Tables greater than 2GB should always be considered for partitioning. (2)Tables containin ...
- oracle11g interval(numtoyminterval())自动创建表分区
Oracle11g通过间隔分区实现按月创建表分区 在项目数据库设计过程中由于单表的数据量非常庞大,需要对表进行分区处理.由于表中的数据是历史交易,故按月分区,提升查询和管理. 由于之前对于表分区了解不 ...
- oracle表分区以及普表转分区表(转)
概述 Oracle的表分区功能通过改善可管理性.性能和可用性,从而为各式应用程序带来了极大的好处.通常,分区可以使某些查询以及维护操作的性能大大提高.此外,分区还可以极大简化常见的管理任务,分区是构建 ...
- Mysql 表分区
是否支持分区:mysql> show variables like '%partition%';+-----------------------+-------+| Variable_name ...
- SQL Server表分区的NULL值问题
SQL Server表分区的NULL值问题 SQL Server表分区只支持range分区这一种类型,但是本人觉得已经够用了 虽然MySQL支持四种分区类型:RANGE分区.LIST分区.HASH分区 ...
随机推荐
- 【CentOS】centos7 稳定使用版本,centos镜像的下载
命令: cat /etc/redhat-release 下载地址: https://wiki.centos.org/Download 下载版本:
- Caused by: java.lang.IllegalArgumentException: Can not set int field reyo.sdk.enity.xxx.xxx to java.lang.Long
由于数据库字段设置不正确引起的,不能选中 alter <table> modify <column> int unsigned; 关于unsigned int类型,可以看看它的 ...
- left join 注意事项
相信对于熟悉SQL的人来说,LEFT JOIN非常简单,采用的时候也很多,但是有个问题还是需要注意一下.假如一个主表M有多个从表的话A B C …..的话,并且每个表都有筛选条件,那么把筛选条件放到哪 ...
- lucene4之后的近实时搜索实现
好久没干这块东西了,近几天须要做这个.所以又一次学了一下.首先很感谢孔浩老师,没孔浩老师的视频我也不会进入lucene的殿堂. 老师当时讲的实时搜索还是NRTManager,如今已经都变了,这个类已经 ...
- [转]mysql dual虚拟表
From : http://thobian.info/?p=1035 虚拟表dual 其实我是今天第一次听说,虽然以前有过它的应用.说不定你也用过哦,看这条sql:select sysdate(); ...
- 如何使用pycharm调试(debug) django的测试用例?
一.django应用或者flask应用的调试: 结合debug模式,在代码处添加断点,即可实现断点调试功能 二. django应用或者flask应用测试用例的调试: 一般django应用的测试用例执行 ...
- ASP.NET MVC 中使用JavaScriptResult asp.net mvc 返回 JavaScript asp.mvc 后台返回js
return this.Content("<script>alert('暂无!');window.location.href='/Wap/Index';</script&g ...
- chrome DevTools之黑箱大法(Blackbox ) 黑箱化源代码
Blackbox 提高JavaScript调试效率 所有人前端开发人员都会遇到的问题,您的应用程序代码中会出现错误.您开始调试,但是逐行执行代码时,调试器有时会跳转到不是您的焦点的源文件(例如第三方J ...
- 数学图形(1.48)Cranioid curve头颅线
这是一种形似乎头颅的曲线.这种曲线让我想起读研的时候,搞的医学图像三维可视化.那时的原始数据为脑部CT图像.而三维重建中有一种方式是面绘制,是将每一幅CT的颅骨轮廓提取出来,然后一层层地罗列在一起,生 ...
- 升级Https前的可行性验证(一)
升级Https之前的可行性验证 注意:自签证书和Nginx的安装都基于ContOS 6 一.如何申请OpenSSL自签证书 1.安装OpenSSL (一)OpenSSL 工具下载 下载地址 (二)Op ...