postgresql 创建分表
划分指的是将逻辑上的一个大表分成一些小的物理上的片。划分有很多益处:
1、在某些情况下查询性能能够显著提升,特别是当那些访问压力大的行在一个分区或者少数几个分区时。划分可以取代索引的主导列、减小索引尺寸以及使索引中访问压力大的部分更有可能被放在内存中。
2、当查询或更新访问一个分区的大部分行时,可以通过该分区上的一个顺序扫描来取代分散到整个表上的索引和随机访问,这样可以改善性能。
3、如果需求计划使用划分设计,可以通过增加或移除分区来完成批量载入和删除。ALTER TABLE NO INHERIT和DROP TABLE都远快于一个批量操作。这些命令也完全避免了由批量DELETE造成的VACUUM负载。
4、很少使用的数据可以被迁移到便宜且较慢的存储介质上。
当一个表非常大时,划分所带来的好处是非常值得的。一个表何种情况下会从划分获益取决于应用,一个经验法则是当表的尺寸超过了数据库服务器物理内存时,划分会为表带来好处。
目前,PostgreSQL支持通过表继承来进行划分。每一个分区被创建为父表的一个子表。父表本身通常是空的,它的存在仅仅为了表示整个数据集。
例如: select * from only tb_log,可以查看到主表并未存储数据。
范围划分
表被根据一个关键列或一组列划分为"范围",不同的分区的范围之间没有重叠。例如,我们可以根据日期范围划分,或者根据特定业务对象的标识符划分。
列表划分
通过显式地列出每一个分区中出现的键值来划分表。
实现划分
1、创建分表并关联主表(可以根据年份,季度和或者月份来创建分表)
例:表名为tb_log,createtime 表示tb_log的一个字段,记录时间
CREATE TABLE tb_log_2017 (
CHECK ( createtime >= DATE '2017-01-01' AND createtime < DATE '2018-01-01' )
) INHERITS (tb_log);
CREATE TABLE tb_log_2018 (
CHECK ( createtime >= DATE '2018-01-01' AND createtime < DATE '2019-01-01' )
) INHERITS (tb_log);
-- 这里创建了tb_log_2017 和 tb_log_2018 两张分表.
** 这个语句创建的分表没有主键,手动为每张分表加上主键
2、创建触发器函数
CREATE OR REPLACE FUNCTION function_insert_tb_log()
RETURNS TRIGGER AS $$
BEGIN
IF ( NEW.createtime >= DATE '2017-01-01' AND NEW.createtime < DATE '2018-01-01' ) THEN
INSERT INTO tb_log_2017 VALUES (NEW.*);
ELSIF ( NEW.createtime >= DATE '2018-01-01' AND NEW.createtime < DATE '2019-01-01' ) THEN
INSERT INTO tb_log_2018 VALUES (NEW.*);
ELSE
RAISE EXCEPTION 'Date out of range. Fix the function_insert_tb_log() function!';
END IF;
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
3、创建触发器
CREATE TRIGGER trigger_insert_tb_log
BEFORE INSERT ON tb_log
FOR EACH ROW
EXECUTE PROCEDURE function_insert_tb_log();
备注:维护表的时候,只要执行第1步和第2步就可以了,比如到2019年的时候,再用第1步的格式去创建2019年的分表(tb_log_2019),然后修改一下第2步的逻辑,执行一下就可以了。
** 使用Hibernate的时候注意,hibernate的save方法有期待返回的保存结果,分表之后保存并不会返回保存结果,所以要在实体里加入下面这行代码:
@SQLInsert(sql = "insert into tb_log (id,column1,column2) values (?,?,?)")
postgresql 创建分表的更多相关文章
- Mysql数据库一个小程序实现自动创建分表。
每当跨月的时候也是系统出问题最多的时候,没有表和字段缺失是两个最常见的错误. 为了解决这个问题,研究了一下mysql的 information_schema 表: information_schema ...
- postgreSQL 创建user表时引发的表名大写与双引号问题
在postgreSQL里面,user是一个保留字. 如果你想创建user表,你可能会遭遇一些问题! 如图: 可以看到,这里是无法创建user表的. 你可能会说,我只是没有加双引号"" ...
- 复制表结构创建分表 再设置自增ID
CREATE TABLE table_name1 LIKE table_name ALTER TABLE test AUTO_INCREMENT=x
- PostgreSQL 务实应用(三/5)分表复制
问题的提出 在项目中,有些表的记录增长非常快,记录数过大时会使得查询变得困难,导致整个数据库处理性能下降.此时,我们会考虑按一定的规则进行分表存储. 常用的分表方式是按时间周期,如每月一张,每天一张等 ...
- Postgresql分表与优化
--1.创建主表 CREATE TABLE tbl_partition ( date_key date, hour_key smallint, client_key integer, item_key ...
- EFCore.Sharding(EFCore开源分表框架)
EFCore.Sharding(EFCore开源分表框架) 简介 引言 开始 准备 配置 使用 按时间自动分表 性能测试 其它简单操作(非Sharing) 总结 简介 本框架旨在为EF Core提供S ...
- .NET ORM 分表分库【到底】怎么做?
理论知识 分表 - 从表面意思上看呢,就是把一张表分成N多个小表,每一个小表都是完正的一张表.分表后数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面.分表后单表的并发能力提高了 ...
- 重磅来袭,使用CRL实现大数据分库分表方案
关于分库分表方案详细介绍 http://blog.csdn.net/bluishglc/article/details/7696085 这里就不作详细描述了 分库分表方案基本脱离不了这个结构,受制于实 ...
- discuz X3.1 关于分表 和 分表数据迁移
// *********** 关于读取分表的数据*********** { // forum_thread 分表代码片段 -- 帖子列表 { // 定位某个板块的帖子落在哪个表(forum_threa ...
随机推荐
- form 表单上传文件及传输数据的编码格式
form中的 action 控制请求往什么地方提交 method 请求方式 如果不写默认是get 请求 如果想传文件 必须要把默认的urlencoded的改成enctype="multi ...
- 深圳-2020-java面试题分享
记录一下最近面试接触的面试题. 深圳掌众传媒: union 和union all区别 union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序: union All:对两个结果集进行 ...
- Integer中的奇妙位运算
Integer中的奇妙位运算 参考资料 https://segmentfault.com/a/1190000015763941 highestOneBit(int i) 函数的作用是获得传入参数的最高 ...
- mySQL入门之多表操作
外键 初识外键 外键:引用另一个表中的一列或多列,被引用的列应该具有主键约束或唯一性约束.(外键用于建立和加强两个表数据之间的连接,保证数据的完整和统一性) 主表:被引用的表 从表:引用外键的表 -- ...
- dart时间处理的几个方法
一.时间处理的方法 1.获取当前时间 new DateTime.now(); 2.设置时间 new DateTime(2020, 11, 11, 12, 37 , 36); 3.解析时间 DateTi ...
- Moviepy音视频开发:视频转gif动画或jpg图片exe图形化工具开发案例
☞ ░ 前往老猿Python博文目录 ░ 一.引言 老猿之所以学习和研究Moviepy的使用,是因为需要一个将视频转成动画的工具,当时在网上到处搜索查找免费使用工具,结果找了很多自称免费的工具,但转完 ...
- 第14.14节 爬虫实战准备:csdn博文点赞过程http请求和响应信息分析
如果要对csdn博文点赞,首先要登录CSDN,然后打开一篇需要点赞的文章,如<第14.1节 通过Python爬取网页的学习步骤>按<第14.3节 使用google浏览器获取网站访问的 ...
- 第15.2节 PyCharm支持Python解释器的配置调整
上节介绍了PyCharm的安装与简单使用,本节介绍PyCharm相关的配置调整,以支持在PyCharm环境下集成Python解释器进行程序的编译. 一. 工程配置调整 在执行文件前,可能需要对PyCh ...
- C++中对一个布尔类型的变量按位取反结果不变
C++中对一个bool类型的变量按位取反是无效的.例如: bool a = true; bool b = ~a; // b的值还是true
- bugkuctf 这 是 一 个 神 奇 的 登 录 界 面
首先结合源码可以看出这是一道sql注入题. 然后开始萌新的日常操作,尝试单引号闭合,可是并没有用,而且因为单引号注入的题太多,导致并没有立刻开始尝试双引号,之后想起双引号(对,双引号木得牌面)得到如下 ...