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实现了表继承,在多重表继承下,对上亿条不同类别的数据条目进行按型号、按月份双层分区管理,既可在总表查阅所有条目的共有字段,也可在各类型字表查询附加字段,非常高效。 分区是通过继承的方式来实现的&…...
论文笔记(五十六)VIPose: Real-time Visual-Inertial 6D Object Pose Tracking
VIPose: Real-time Visual-Inertial 6D Object Pose Tracking 文章概括摘要I. INTRODACTIONII. 相关工作III. APPROACHA. 姿态跟踪工作流程B. VIPose网络 文章概括 引用: inproceedings{ge2021vipose,title{Vipose: Real-time visual-inertial 6d object pose tra…...
微服务治理详解
文章目录 什么是微服务架构为什么要使用微服务单体架构如何转向微服务架构服务治理服务治理治的是什么服务注册与发现服务熔断降级服务网关服务调用服务负载均衡服务配置中心 微服务解决方案SpringCloud体系EurekaHystrixGatewayOpenFeignRibbonConfig SpringCloud Alibaba体系…...
“南海明珠”-黄岩岛(民主礁)领海基线WebGIS绘制实战
目录 前言 一、关于岛屿的基点位置 1、领海基点 二、基点坐标的转换 1、最底层的左边转换 2、单个经纬度坐标点转换 3、完整的转换 三、基于天地图进行WebGIS展示 1、领海基点的可视化 2、重要城市距离计算 四、总结 前言 南海明珠黄岩岛,这座位于南海的…...
Oracle数据库 创建dblink的过程及其用法详解
前言 dblink是Oracle数据库中用于连接不同数据库实例的一种机制。通过dblink,用户可以在一个数据库实例中直接查询或操作另一个数据库实例中的表、视图或存储过程。 dblink的作用主要体现在以下几个方面: 跨数据库操作:允许用户…...
Linux从0——1之shell编程4
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...
pycharm快速更换虚拟环境
目录 1. 选择Conda 虚拟环境2. 创建环境3. 直接选择现有虚拟环境 1. 选择Conda 虚拟环境 2. 创建环境 3. 直接选择现有虚拟环境...
MVVM框架
MVVM由以下三个内容构成: Model:数据模型View:界面ViewModel:作为桥梁负责沟通View和Model 在JQuery时期,如果需要刷新UI,需要先取到对应的 DOM 再更新 UI,这样数据和业务的逻辑就和⻚⾯有强耦合。 在 MVVM 中,UI 是…...
数据仓库在大数据处理中的作用
数据仓库(Data Warehouse,简称DW或DWH)是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。以下是对数据仓库及其在大数据处理中作用的详细解释: 一、数据仓库的定义 面向主题&#x…...
前端Javascript、Vue、CSS等场景面试题目(二)
前端面试场景题目(一)-CSDN博客 针对您提供的前端场景面试题目,以下是详细的回答: 1. 如何通过 CSS 实现美观的自定义复选框和单选按钮? 方法:使用 CSS 伪元素 ::before 和 ::after,以及隐藏…...
鸿蒙学习生态应用开发能力全景图-开发者支持平台(5)
鸿蒙相关平台作用: 开发者社区:开发者技术交流平台,帮助开发者探索开发实践、交流心得经验、获悉业界动态、答疑解惑。 开发者学堂:聚合官方鸿蒙生态课程,课程有慕课、微课、直播课、训练营等多种形式ÿ…...
计算机网络各层设备总结归纳(更新ing)
计算机网络按照OSI(开放式系统互联)模型分为七层,每一层都有其特定的功能和对应的网络设备。以下是各层对应的设备: 1. 物理层(Physical Layer) 设备:中继器(Repeater)、集线器…...
3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用)
3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用) 文章目录 3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用)前言1. Spring Cloud Eureka 的概述1.1 服务治理概述1.2 服务注册与发现 2. 实践:创建单机 Eureka Server 注册中心2.1 需求说明 图解…...
品牌如何利用大数据工具,进行消费者洞察分析?
存量竞争的时代, 消费者聆听是品牌持续增长的关键,借助大数据的消费者数据洞察,可以帮助品牌分析消费者的所思所想及行为特征,获取消费者对产品的需求痛点、使用感受,对品牌的评价口碑等,从而帮助品牌更好地…...
鸿蒙实现 web 传值
前言:安卓和 IOS 加载 H5 的时候,都有传值给到 H5 或者接收 H5 值,鸿蒙也可传值和接收 H5 的内容,以下是鸿蒙传值给 H5 端的具体操作 一: 定义好 H5 和鸿蒙传值的方法名,两端必须保持方法名一致 // xxx.ets import …...
uniapp vuex的使用
实现组件全局(数据)管理的一种机制,可以方便的实现组件之间共享数据,不同于上述三种传递值的方式。 可以把vuex当成一个store仓库,可以集中管理共享的数据,并且存储在vuex中的数据都是响应式的,…...
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 集群部署(镜…...
【论文复现】轻松利用自适应特征融合实现去雾
📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ 智慧医疗 介绍创新点网络结构特征提取阶段自适应融合阶段图像重建阶段上下文增强模块CEM特征融合模块AFM 结果分析 提示 论文题目࿱…...
【大数据学习 | HBASE高级】hbase-phoenix 与二次索引应用
1. hbase-phoenix的应用 1.1 概述: 上面我们学会了hbase的操作和原理,以及外部集成的mr的计算方式,但是我们在使用hbase的时候,有的时候我们要直接操作hbase做部分数据的查询和插入,这种原生的方式操作在工作过程中还…...
高级java每日一道面试题-2024年11月09日-缓存中间件篇-Redis和Memecache有什么区别?
如果有遗漏,评论区告诉我进行补充 面试官: Redis和Memecache有什么区别? 我回答: 一、基础特性 数据类型支持 Redis: 支持多种数据类型,包括字符串(String)、哈希(Hash)、列表(List)、集合…...
Go Routine 调度器任务执行机制
Go语言凭借其轻量级线程——Goroutine,成为高并发编程的热门选择。而Goroutine的高效执行,离不开Go调度器的精妙设计。本文将深入探讨Go调度器的任务执行机制,揭示其如何实现高效并发。 **Goroutine的轻量特性** Goroutine相比传统线程更加…...
LFM2.5-1.2B-Thinking-GGUF快速问答效果展示:对比云端大模型的响应速度与成本
LFM2.5-1.2B-Thinking-GGUF快速问答效果展示:对比云端大模型的响应速度与成本 1. 本地轻量模型的惊艳表现 最近在测试LFM2.5-1.2B-Thinking-GGUF这个轻量级模型时,它的表现着实让我惊喜。这个只有12亿参数的模型,在本地CPU环境下运行&#…...
告别命令行恐惧:用乐鑫官方Flash Download Tool图形化烧录ESP32-S3固件(保姆级图文教程)
告别命令行恐惧:乐鑫Flash Download Tool图形化烧录ESP32-S3全指南 第一次接触ESP32开发板时,那个闪烁的命令行窗口让我手足无措。直到发现乐鑫官方的Flash Download Tool,才发现原来固件烧录可以如此直观简单——不需要记忆任何命令参数&…...
OpenClaw多模型对比:Qwen3.5-4B-Claude与基础版任务实测
OpenClaw多模型对比:Qwen3.5-4B-Claude与基础版任务实测 1. 测试背景与模型选择 最近在搭建个人自动化工作流时,我发现OpenClaw的任务执行质量高度依赖底层大模型的推理能力。为了找到最适合复杂任务的模型,我决定对两个版本进行系统测试&a…...
百川2-13B-4bits量化模型微基准测试:OpenClaw常用任务性能对比
百川2-13B-4bits量化模型微基准测试:OpenClaw常用任务性能对比 1. 测试背景与动机 上周在折腾OpenClaw自动化办公流程时,发现我的RTX 3090显卡在运行13B模型时显存频繁告警。这让我开始关注量化模型的实际表现——特别是当OpenClaw需要连续调用模型完成…...
什么是JVM——餐厅类比
目录 一、核心前提 二、JVM 整体定位(餐厅类比总纲) 三、JVM 核心模块拆解(餐厅类比 1:1 对应) 模块 1:类加载器子系统 → 餐厅 “收单 归档员” 核心动作: 关键补充(对应你的内存疑问&a…...
RP2040离线语音唤醒SDK:轻量级关键词检测实战指南
1. 项目概述DSpotterSDK_Maker_RP2040 是专为 Arduino Nano RP2040 Connect 开发板设计的离线语音唤醒与指令识别 SDK,面向嵌入式开发者提供轻量级、低功耗、免联网的本地语音交互能力。该 SDK 并非通用 ASR(自动语音识别)引擎,而…...
告别手动调时间!用STM32F4的RTC闹钟和自动唤醒实现一个智能定时提醒器
STM32F4智能定时系统:RTC闹钟与自动唤醒实战指南 在物联网设备开发中,精确的时间管理和低功耗运行往往是产品成功的关键因素。STM32F4系列微控制器内置的RTC(实时时钟)模块,不仅提供精准的日历时钟功能,更通…...
旧设备焕新:OpenCore跨版本升级破局指南
旧设备焕新:OpenCore跨版本升级破局指南 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 痛点诊断:旧Mac的升级困境 每一台Mac都有其生命周期&…...
DDPG与TD3算法训练中tanh饱和区导致的边界值问题分析与调优
1. 为什么DDPG/TD3会卡在动作边界值? 第一次用DDPG训练机械臂控制任务时,我盯着监控曲线看了整整三天——那个该死的关节角度永远卡在30度的极限位置。后来换成TD3算法,发现同样会陷入这个怪圈。这就像新手司机开车总把方向盘打死,…...
