当前位置: 首页 > news >正文

postgresql(功能最强大的开源数据库)继承特性和分区实现

    PostgreSQL实现了表继承,在多重表继承下,对上亿条不同类别的数据条目进行按型号、按月份双层分区管理,既可在总表查阅所有条目的共有字段,也可在各类型字表查询附加字段,非常高效。

    分区是通过继承的方式来实现的,每个分区实际上都是一个独立的表。

1,继承

    我们创建两个表来说明继承的特性:创建一个人类表和leader表,全球很多人,但是只有少数人是国家leader人。我们希望能够快速地检索任何国家的leader,继承特性有助于解决这个问题。

    创建人类表:

mydb=#create table human(hid int,name varchar(20));

    创建leader表,继承人类表:

mydb=#create table leader(flag int default 1) inherits(human);

通过继承,leader表将继承它父表human的所有列。leader通过一个额外的flag列来表示它为leader。

mydb=# \d human资料表 "public.human"栏位 |         型别          | 修饰词 ------+-----------------------+--------hid  | integer               | name | character varying(20) | mydb=# \d leader资料表 "public.leader"栏位 |         型别          | 修饰词 ------+-----------------------+--------hid  | integer               | name | character varying(20) | flag | integer               | 缺省 1继承: human

查找所有的人

mydb=# select * from human;hid |  name  -----+--------1 | 小花2 | 小明3 | 小华4 | 小丽5 | 小李7 | 朱元璋8 | 特兰普

查找不是领导人的人

mydb=# select * from only human;hid | name -----+------1 | 小花2 | 小明3 | 小华4 | 小丽5 | 小李

查找领导人

mydb=# select * from leader;hid |  name  | flag -----+--------+------7 | 朱元璋 |    18 | 特兰普 |    1

2,分区

分区在某些情况下可以使得查询性能显著提升。

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

如果需求计划使用划分设计,可以通过增加或移除分区来完成批量载入和删除。 ALTER TABLE NO INHERIT 和 DROP TABLE 都远快于一个批量操作。这些命令也完全避免了由批量 DELETE 造成的 VACUUM 负载。

很少使用的数据可以被迁移到便宜且较慢的存储介质上。

通过继承实现分区:

mydb=# create table login_log(login_id int not null,user_name varchar(20),login_time date);mydb=# create table login_log_201801(check(login_time>=DATE '2018-01-01' and login_time<=DATE '2018-01-31')) inherits(login_log);mydb=# create table login_log_201802(check(login_time>=DATE '2018-02-01' and login_time<=DATE '2018-02-28')) inherits(login_log);mydb=# create table login_log_201803(check(login_time>=DATE '2018-03-01' and login_time<=DATE '2018-03-31')) inherits(login_log);

在时间列上建立索引,确保性能:

mydb=# create index idx_login_log_201801_time on login_log_201801(login_time);mydb=# create index idx_login_log_201802_time on login_log_201802(login_time);mydb=# create index idx_login_log_201803_time on login_log_201803(login_time);

通过insert into login_log,利用触发器和函数,使得数据根据登陆日期重定向到不同的分区。

函数创建:

CREATE OR REPLACE FUNCTION insert_login_log()RETURNS TRIGGER AS $$BEGINif(new.login_time>=DATE '2018-01-01' and new.login_time<=DATE '2018-01-31') theninsert into login_log_201801 values(new.*);elsif(new.login_time>=DATE '2018-02-01' and new.login_time<=DATE '2018-02-28') theninsert into login_log_201802 values(new.*);elsif(new.login_time>=DATE '2018-03-01' and new.login_time<=DATE '2018-03-31') theninsert into login_log_201803 values(new.*);elseRAISE EXCEPTION 'Date	out of range!';end if;RETURN NULL;END;$$LANGUAGE plpgsql;

触发器创建:

CREATE TRIGGER insert_log_triggerBEFORE INSERT ON login_logFOR EACH ROW EXECUTE PROCEDURE insert_login_log();

数据录入:

insert into login_log values(1,'小明','2018-01-10');insert into login_log values(2,'小明','2018-02-13');insert into login_log values(3,'小明','2018-03-20');insert into login_log values(4,'小丽','2018-01-31');insert into login_log values(5,'小丽','2018-02-20');insert into login_log values(6,'小丽','2018-03-11');

查询全部数据:

mydb=# select * from login_log;login_id | user_name | login_time ----------+-----------+------------1 | 小明      | 2018-01-104 | 小丽      | 2018-01-312 | 小明      | 2018-02-135 | 小丽      | 2018-02-203 | 小明      | 2018-03-206 | 小丽      | 2018-03-11

查询分区表login_log_201801数据:

mydb=# select * from login_log_201801;login_id | user_name | login_time ----------+-----------+------------1 | 小明      | 2018-01-104 | 小丽      | 2018-01-31

查询分区表login_log_201802数据:

mydb=# select * from login_log_201802;login_id | user_name | login_time ----------+-----------+------------2 | 小明      | 2018-02-135 | 小丽      | 2018-02-20

查询分区表login_log_201803数据:

mydb=# select * from login_log_201803;login_id | user_name | login_time ----------+-----------+------------3 | 小明      | 2018-03-206 | 小丽      | 2018-03-11

3,注意点

a、分区表并不能完全的继承父表的所有属性,比如唯一约束、主键、外键。而检查约束与非空约束是可以继承的。

b、修改父表的结构,子表结构同时被修改。

c、reindex、vacuum命令不会影响到子表。

d、不要在父表上定义检查约束,除非你想约束所有分区。

e、不要在父表上创建索引和或唯一约束,因为没有任何意义。应该在每个分区上分别创建。

f、 合理的设计中,父表一般不存入数据,分区过滤时,父表的扫描代价为零。

g、在postgresql 10中,实现了分区的功能,用户可以通过相应语法直接实现分区功能,喜欢的朋友可以研究下。

相关文章:

postgresql(功能最强大的开源数据库)继承特性和分区实现

PostgreSQL实现了表继承&#xff0c;在多重表继承下&#xff0c;对上亿条不同类别的数据条目进行按型号、按月份双层分区管理&#xff0c;既可在总表查阅所有条目的共有字段&#xff0c;也可在各类型字表查询附加字段&#xff0c;非常高效。 分区是通过继承的方式来实现的&…...

论文笔记(五十六)VIPose: Real-time Visual-Inertial 6D Object Pose Tracking

VIPose: Real-time Visual-Inertial 6D Object Pose Tracking 文章概括摘要I. INTRODACTIONII. 相关工作III. APPROACHA. 姿态跟踪工作流程B. VIPose网络 文章概括 引用&#xff1a; inproceedings{ge2021vipose,title{Vipose: Real-time visual-inertial 6d object pose tra…...

微服务治理详解

文章目录 什么是微服务架构为什么要使用微服务单体架构如何转向微服务架构服务治理服务治理治的是什么服务注册与发现服务熔断降级服务网关服务调用服务负载均衡服务配置中心 微服务解决方案SpringCloud体系EurekaHystrixGatewayOpenFeignRibbonConfig SpringCloud Alibaba体系…...

“南海明珠”-黄岩岛(民主礁)领海基线WebGIS绘制实战

目录 前言 一、关于岛屿的基点位置 1、领海基点 二、基点坐标的转换 1、最底层的左边转换 2、单个经纬度坐标点转换 3、完整的转换 三、基于天地图进行WebGIS展示 1、领海基点的可视化 2、重要城市距离计算 四、总结 前言 南海明珠黄岩岛&#xff0c;这座位于南海的…...

Oracle数据库 创建dblink的过程及其用法详解

前言 ‌dblink是Oracle数据库中用于连接不同数据库实例的一种机制‌。通过dblink&#xff0c;用户可以在一个数据库实例中直接查询或操作另一个数据库实例中的表、视图或存储过程。‌ dblink的作用主要体现在以下几个方面&#xff1a; ‌跨数据库操作‌&#xff1a;允许用户…...

Linux从0——1之shell编程4

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…...

pycharm快速更换虚拟环境

目录 1. 选择Conda 虚拟环境2. 创建环境3. 直接选择现有虚拟环境 1. 选择Conda 虚拟环境 2. 创建环境 3. 直接选择现有虚拟环境...

MVVM框架

MVVM由以下三个内容构成&#xff1a; Model:数据模型View:界面ViewModel:作为桥梁负责沟通View和Model 在JQuery时期&#xff0c;如果需要刷新UI&#xff0c;需要先取到对应的 DOM 再更新 UI&#xff0c;这样数据和业务的逻辑就和⻚⾯有强耦合。 在 MVVM 中&#xff0c;UI 是…...

数据仓库在大数据处理中的作用

数据仓库&#xff08;Data Warehouse&#xff0c;简称DW或DWH&#xff09;是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合&#xff0c;用于支持管理决策。以下是对数据仓库及其在大数据处理中作用的详细解释&#xff1a; 一、数据仓库的定义 面向主题&#x…...

前端Javascript、Vue、CSS等场景面试题目(二)

前端面试场景题目&#xff08;一&#xff09;-CSDN博客 针对您提供的前端场景面试题目&#xff0c;以下是详细的回答&#xff1a; 1. 如何通过 CSS 实现美观的自定义复选框和单选按钮&#xff1f; 方法&#xff1a;使用 CSS 伪元素 ::before 和 ::after&#xff0c;以及隐藏…...

鸿蒙学习生态应用开发能力全景图-开发者支持平台(5)

鸿蒙相关平台作用&#xff1a;  开发者社区&#xff1a;开发者技术交流平台&#xff0c;帮助开发者探索开发实践、交流心得经验、获悉业界动态、答疑解惑。  开发者学堂&#xff1a;聚合官方鸿蒙生态课程&#xff0c;课程有慕课、微课、直播课、训练营等多种形式&#xff…...

计算机网络各层设备总结归纳(更新ing)

计算机网络按照OSI&#xff08;开放式系统互联&#xff09;模型分为七层&#xff0c;每一层都有其特定的功能和对应的网络设备。以下是各层对应的设备&#xff1a; 1. 物理层&#xff08;Physical Layer) 设备&#xff1a;中继器&#xff08;Repeater&#xff09;、集线器…...

3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用)

3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用) 文章目录 3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用)前言1. Spring Cloud Eureka 的概述1.1 服务治理概述1.2 服务注册与发现 2. 实践&#xff1a;创建单机 Eureka Server 注册中心2.1 需求说明 图解…...

品牌如何利用大数据工具,进行消费者洞察分析?

存量竞争的时代&#xff0c; 消费者聆听是品牌持续增长的关键&#xff0c;借助大数据的消费者数据洞察&#xff0c;可以帮助品牌分析消费者的所思所想及行为特征&#xff0c;获取消费者对产品的需求痛点、使用感受&#xff0c;对品牌的评价口碑等&#xff0c;从而帮助品牌更好地…...

鸿蒙实现 web 传值

前言&#xff1a;安卓和 IOS 加载 H5 的时候&#xff0c;都有传值给到 H5 或者接收 H5 值&#xff0c;鸿蒙也可传值和接收 H5 的内容&#xff0c;以下是鸿蒙传值给 H5 端的具体操作 一: 定义好 H5 和鸿蒙传值的方法名&#xff0c;两端必须保持方法名一致 // xxx.ets import …...

uniapp vuex的使用

实现组件全局&#xff08;数据&#xff09;管理的一种机制&#xff0c;可以方便的实现组件之间共享数据&#xff0c;不同于上述三种传递值的方式。 可以把vuex当成一个store仓库&#xff0c;可以集中管理共享的数据&#xff0c;并且存储在vuex中的数据都是响应式的&#xff0c…...

RabbitMQ实战启程:从原理到部署的全方位探索(上)

文章目录 一、RabbitMQ简介1.1、概述1.2、特性 二、RabbitMQ原理架构三、RabbitMQ应用场景3.1 简单模式3.2 工作模式3.3 发布订阅3.4 路由模式3.5 主题订阅模式 四、同类中间件对比五、RabbitMQ部署5.1 单机部署5.1.1 安装erlang5.1.2 安装rabbitmq 5.2 集群部署&#xff08;镜…...

【论文复现】轻松利用自适应特征融合实现去雾

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 智慧医疗 介绍创新点网络结构特征提取阶段自适应融合阶段图像重建阶段上下文增强模块CEM特征融合模块AFM 结果分析 提示 论文题目&#xff1…...

【大数据学习 | HBASE高级】hbase-phoenix 与二次索引应用

1. hbase-phoenix的应用 1.1 概述&#xff1a; 上面我们学会了hbase的操作和原理&#xff0c;以及外部集成的mr的计算方式&#xff0c;但是我们在使用hbase的时候&#xff0c;有的时候我们要直接操作hbase做部分数据的查询和插入&#xff0c;这种原生的方式操作在工作过程中还…...

高级java每日一道面试题-2024年11月09日-缓存中间件篇-Redis和Memecache有什么区别?

如果有遗漏,评论区告诉我进行补充 面试官: Redis和Memecache有什么区别? 我回答: 一、基础特性 数据类型支持 Redis: 支持多种数据类型&#xff0c;包括字符串&#xff08;String&#xff09;、哈希&#xff08;Hash&#xff09;、列表&#xff08;List&#xff09;、集合…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...