划分指的是将逻辑上的一个大表分成一些小的物理上的片。划分有很多益处:

  1、在某些情况下查询性能能够显著提升,特别是当那些访问压力大的行在一个分区或者少数几个分区时。划分可以取代索引的主导列、减小索引尺寸以及使索引中访问压力大的部分更有可能被放在内存中。

  2、当查询或更新访问一个分区的大部分行时,可以通过该分区上的一个顺序扫描来取代分散到整个表上的索引和随机访问,这样可以改善性能。

  3、如果需求计划使用划分设计,可以通过增加或移除分区来完成批量载入和删除。ALTER TABLE NO INHERITDROP 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 创建分表的更多相关文章

  1. Mysql数据库一个小程序实现自动创建分表。

    每当跨月的时候也是系统出问题最多的时候,没有表和字段缺失是两个最常见的错误. 为了解决这个问题,研究了一下mysql的 information_schema 表: information_schema ...

  2. postgreSQL 创建user表时引发的表名大写与双引号问题

    在postgreSQL里面,user是一个保留字. 如果你想创建user表,你可能会遭遇一些问题! 如图: 可以看到,这里是无法创建user表的. 你可能会说,我只是没有加双引号"" ...

  3. 复制表结构创建分表 再设置自增ID

    CREATE TABLE table_name1 LIKE table_name ALTER TABLE test AUTO_INCREMENT=x

  4. PostgreSQL 务实应用(三/5)分表复制

    问题的提出 在项目中,有些表的记录增长非常快,记录数过大时会使得查询变得困难,导致整个数据库处理性能下降.此时,我们会考虑按一定的规则进行分表存储. 常用的分表方式是按时间周期,如每月一张,每天一张等 ...

  5. Postgresql分表与优化

    --1.创建主表 CREATE TABLE tbl_partition ( date_key date, hour_key smallint, client_key integer, item_key ...

  6. EFCore.Sharding(EFCore开源分表框架)

    EFCore.Sharding(EFCore开源分表框架) 简介 引言 开始 准备 配置 使用 按时间自动分表 性能测试 其它简单操作(非Sharing) 总结 简介 本框架旨在为EF Core提供S ...

  7. .NET ORM 分表分库【到底】怎么做?

    理论知识 分表 - 从表面意思上看呢,就是把一张表分成N多个小表,每一个小表都是完正的一张表.分表后数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面.分表后单表的并发能力提高了 ...

  8. 重磅来袭,使用CRL实现大数据分库分表方案

    关于分库分表方案详细介绍 http://blog.csdn.net/bluishglc/article/details/7696085 这里就不作详细描述了 分库分表方案基本脱离不了这个结构,受制于实 ...

  9. discuz X3.1 关于分表 和 分表数据迁移

    // *********** 关于读取分表的数据*********** { // forum_thread 分表代码片段 -- 帖子列表 { // 定位某个板块的帖子落在哪个表(forum_threa ...

随机推荐

  1. SQL注入步骤

    1.判断是否存在注入,注入是字符型还是数字型2.猜解SQL查询语句中的字段数3.确定回显的字段数4.获取当前数据库5.获取表中字段名6.下载数据

  2. java47

    1. 1.List集合根据角标获取元素 import java.util.ArrayList; import java.util.List; public class List集合 { @Suppre ...

  3. [oBIX包使用教程] 使用 Python 通过 oBIX 协议访问 Niagara 数据

    oBIX 全称是 Open Building Information Exchange,它是基于 RESTful Web Service 的接口的标准,用于构建控制系统.oBIX是在专为楼宇自动化设计 ...

  4. linux搭建harbor与使用

    条件:安装docker&docker-compose 如未安装,请看:linux离线安装docker + docker-compose harbor 1.下载 下载地址:https://git ...

  5. 第4.6节 print、import及断言

    一.print函数 前面第二章介绍了print的语法,其语法如下: print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) ...

  6. 什么是Python迭代器?

    迭代器(Iterator):迭代器可以看作是一个特殊的对象,每次调用该对象时会返回自身的下一个元素,从实现上来看,一个迭代器对象必须是定义了__iter__()方法和next()方法的对象. Pyth ...

  7. PyQt(Python+Qt)学习随笔:desktop的宽带、高度widthMM、heightMM

    通过desktop获取桌面的高度和宽度,代码如下: desktop = app.desktop() srceenSize = desktop.width(),desktop.height() srce ...

  8. DVWA SQL Injection High

    High 虽然是high等级,但是通过源码审计发现与low等级一样,没有对传入的值做任何过滤,唯一不同的就是点击连接后打开了另外一个对话框,用户在新打开的页面输入 其余的步骤与low级别的一样:htt ...

  9. DFS,BFS 练习(深搜,广搜,图,leetcode)

    https://leetcode-cn.com/problems/route-between-nodes-lcci/ 节点间通路.给定有向图,设计一个算法,找出两个节点之间是否存在一条路径. 示例1: ...

  10. SpringCloud Alibaba学习笔记

    目录 目录 目录 导学 为什么学 学习目标 进阶目标 思路 Spring Cloud Alibaba的重要组件 环境搭建 Spring Boot必知必会 Spring Boot特性 编写第一个Spri ...