PostgreSQL 文章下架 与 热更新和填充可以提升数据库性能

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,(共2150人左右 1 + 2 + 3 + 4 +5) 新人直接分配到5群,另欢迎 OpenGauss 的技术人员加入。

最近写了一篇揭露人性的文章,被下架了,看来是写对了,的确是不适宜公开传阅了,我一点都不惊讶,很多事情只可意会,不能宣之于口.

f59687c53d4b747c5cd858fde7f5469d.png

话归正处,咱们今天继续说PostgreSQL ,对于PostgreSQL中的重要的功能实际上都是尤其是内部的一些功能本身,都是围绕着POSTGRESQL 的原理,MVCC 中UNDO 实现的方式而来的,如果你一直埋怨PG 不能按你心愿,那么你一定是没有理解他本身的设计原理。

ca3adef89e48b8cdad93e9c4aa440887.png

今天要说的就是基于PG的原理的 HOT UPDATE 和 FillFactor ,如果这两个理解了,并且对于fillfactor做好了,那么对于使用PG 会有良好的适用性。

HOT UPDATE,对于PG来说这是一个重要的功能,在我们理解来,表和索引是一体的,在更新表的数据的同时,索引里面的数据也会更新,当然如果要启动 heap only tuple 的这个功能,是要特定的条件的。

1  更新的数据必须与原来的这行数据在一个页面内,这是启动数据更新heap Only Tuple 的前提。

2   要完成这个前提,对于POSTGRESQL的表设计中的 fillfactor要有认知和好的设计,这可和 mysql 那样的数据库的简单实用的思路不一样了。

下面我们说说根因,

为了实现高并发,PG实用了多版本并非控制,来存储行,对于UPDATE来说有一个问题,更新行需要不是在原有的位置来修改,而是插入新的行,这就需要为每个更新的行添加新的索引条目,那么必然索引中的对于原有行的指向是要变动的,这就会导致这个操作很复杂,导致我们的操作变得比较“贵”

为了解决这个问题,提出了HOT heap-Only-Tuples , 通过这样的方式来减少在进行数据行的更新后,新的索引行的产生情况。我这里大致画一个简图来说明这样操作后的好处是什么。

76d65fef7c47427eef94230ac02ab612.png

为了大家看清楚,将上图拆分在进行粘贴

2ad6ad28e20921178275be54dea523cc.png

9bbb99369fc473f1152a864122bc402e.png

从上图我们可以很清楚的看到,图一为更新数据前的,图2为更新数据后,因为更新数据后,会直接插入一行,所以第二张图就会将原有的数据行的位置进行标记,然后在新的位置插入更新后的数据行,这里可以注意,因为使用了 HOT,所以索引1 的指针还是没有变化而,变化的仅仅是指针1 将自己的指针指向了指针3.

以前读取数据是 索引1 ---指针1---数据 1, 现在的读取的方式是索引1--指针1--指针3--数据1.

因这样的方式仅仅变动的是业内的指针重定向,所以这个样的方式相对于修改索引1的指针指向指针3 要方便的多,节省了大量的数据处理的资源。

那么说到这里,如果要满足这样的操作必须保证更新后的行和被更新的行在一个页面内,才可以进行此操作,如果是下面的情况那么HOT无法进行工作的,下图展示的是由于原有更新行的数据并为插入到原有的数据页面中,而是插入到了新的页面中,所以索引必须指向新的位置,而不能再指向原有的页面了。

386a6c9b9e3930b9e136fdb85eb1ae12.png

所以说到这里,要保证一个页面可以容纳UPDATE后,还写入本页的插入的数据的方法里面,必须有保证原有页面内的空间有冗余,这也就谈到我们说的第二个问题 fillfactor. 填充率。

对的填充率,填充率在POSTGRESQL中尤其的重要,对于一个在PG里面经常被UPDATE的表,fillfactor 在首次填充率一般都不建议超过85%。当然这样操作后的后果是,数据页面在第一次的插入后,会保留15%的空间,者就导致这样的数据页面比100%填充的页面要浪费15%的空间。

那么这里,空间换时间,时间换空间的道理,在POSTGRESQL HOT, Fillfactor 里面又再次的应验了。

postgres=# \c test
You are now connected to database "test" as user "postgres".
test=# SELECTrelname AS table_name,seq_scan AS sequential_scans,idx_scan AS index_scans,n_tup_ins AS inserts,n_tup_upd AS updates,n_tup_hot_upd AS hot_updates
FROMpg_stat_user_tables
ORDER BYhot_updates DESC;table_name | sequential_scans | index_scans | inserts | updates | hot_updates 
------------+------------------+-------------+---------+---------+-------------test_data  |               14 |           4 |      16 |       6 |           6test       |                0 |             |       0 |       0 |           0
(2 rows)

最后是如何你来查看你的表中设置的fillfactor是对的,用上面的语句来去查看你的表中 hot_updates的次数,和UDPATE的次数的对比,也可以算一个百分比,即可。

ALTER TABLE your_table SET (FILLFACTOR = 80);

修改一个表的填充率也很简单,直接对于这个表即刻进行填充率的修改,当然这仅仅是对这个表中新加的页面生效。

Adjournment

de441d4b2ebcd0c573b6090e1e15541a.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/298393.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

武汉星起航电子商务有限公司一站式解决方案引领跨境电商新篇章

随着全球电子商务的迅猛发展,越来越多的创业者希望进入跨境电商领域,发掘无限商机。武汉星起航电子商务有限公司正是这样一个平台,凭借其独特的一站式解决方案,帮助创业者顺利开启跨境电商之旅,实现业务增长。 作为一…

【蓝桥杯】GCD与LCM

一.概述 最大公约数(GCD)和最小公倍数(Least Common Multiple,LCM) 在C中,可以使用 std::__gcd(a, b)来计算最大公约数 1.欧几里德算法/辗转相除法 int gcd(int a,int b){return b?gcd(b, a%b):a; } 2…

SourceTree 克隆仓库

随笔记录 目录 1. 背景介绍 2. SourceTree 2.1 本地创建文件夹 2.2 获取Git 远程仓库路径 2.3 sourceTree 克隆代码 3. FAQ 3.1 填写 ssh 仓库路径后,sourceTree 一直提示正在检查源,无法识别git 远程仓库 1. 背景介绍 Sourcetree 是 Windows …

【Apache Doris】周FAQ集锦:第 2 期

【Apache Doris】周FAQ集锦:第 2 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目! 在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户和…

蓝桥杯第十四届C++A组(未完)

【规律题】平方差 题目描述 给定 L, R,问 L ≤ x ≤ R 中有多少个数 x 满足存在整数 y,z 使得 。 输入格式 输入一行包含两个整数 L, R,用一个空格分隔。 输出格式 输出一行包含一个整数满足题目给定条件的 x 的数量。 样例输入 1 5 样例输出 …

Tidb和MySQL性能简单测试对比

一、单SQL性能对比 由于TiDB的并发能力优秀,但是单个SQL执行延迟较差,为了客观对比,所以只用1个线程来压测tidb和mysql,以观察延迟情况 二、并发SQL性能对比 TiDB:v6.5.2 MySQL:8.0.26 (单机) 三、结论 …

c/c++ | socket tcp client server

突然想着,花一个socket tcp 客户-服务通信 这应该是很经典的流程了吧 感觉还是要训练这种随手画图的能力,毕竟文字的描述还是不及图片强烈 参考01

策略模式图

策略模式 小小的图解 主要的三个角色 Strategy—抽象策略角色ConcreateStrategy—具体策略角色Context—上下文角色 封装了对具体策略的调用可以使用set的依赖注入也可以使用构造方法 核心是上下文角色 只要调用上下文角色就行,实现解耦 策略 工厂 将上下文角…

基于SpringBoot和Vue的金融融资管理系统的设计和实现【附源码】

1、系统演示视频(演示视频) 2、需要交流和学习请联系

深入了解 Python 中标准排序算法 Timsort

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ Timsort:一个非常快速的、时间复杂度为 O ( n l o g n ) O (n \ log\ n) O(n log n)、稳健(即不改变等值元素间的相对顺序)的排序算法,在处理真实世界数…

拥塞控制算法系列之:Swift-谷歌2020年SIGCOM-包级别端到端TIMELY拥塞控制算法

核心要点: 谷歌 2020 SIGCOM基于delay的AIMD拥塞拆分EC和FC,时延敏感场景优势分别计算EC和FC的wnd(最核心)保障吞吐和低延迟。Swift 因利用延迟的简单性和有效性而闻名包级别的论文:https://dl.acm.org/doi/pdf/10.11…

【C++】二叉搜索数

目录 一、二叉搜索树的概念 二、二叉搜索树的模拟实现 1、定义节点 2、构造二叉树 3、析构二叉树 ​4、拷贝二叉树 5、二叉树赋值 6、插入节点 🌟【非递归方式】 🌟【递归方式】 7、打印节点 8、搜索节点 🌟【非递归方式】 &…

DDR3接口

mig IP核的配置 首先添加mig IP核   然后确认以下工程信息,主要是芯片型号以及编译环境,没什么问题后点击next.   如下图所示,这一页选择"Create Design",在"Component Name"一栏设置该IP元件的名称&…

Prometheus+grafana环境搭建Nginx(docker+二进制两种方式安装)(六)

由于所有组件写一篇幅过长,所以每个组件分一篇方便查看,前五篇链接如下 Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客 Prometheusgrafana环境搭建rabbitmq(docker二进制两种方式安装)(二)-CSDN博客 Prometheusgrafana环…

第十届蓝桥杯大赛个人赛省赛(软件类) CC++ 研究生组2.0

A立方和 #include<iostream> #include<cmath> using namespace std; int main(){int n, t, flag, x;long long ans 0;for(int i 1; i < 2019; i){t i;flag 0;while(t && !flag){x t % 10;if(x 2 || x 0 || x 1 || x 9) flag 1;t / 10;}if(fl…

prompt 工程案例

目录 prompt 工程是什么&#xff1f; 案例 vllm 推理加速框架 prompt 工程是什么&#xff1f; prompt&#xff1a;提示词&#xff0c;也就是我们使用网页版输入给大模型的内容就叫 prompt&#xff0c;那什么是 prompt 工程呢&#xff1f; 简单理解其实就是利用编写的 prom…

3个 JavaScript 字符串截取方法

在 JavaScript 中&#xff0c;可以使用 substr()、slice() 和 substring() 方法截取字符串. substring() substring() 方法返回一个字符串在开始索引到结束索引之间的一个子集&#xff0c;或从开始索引直到字符串的末尾的一个子集。语法如下&#xff1a; str.substring(inde…

cmake中报错undefined reference to `pthread_create‘的解决方法

出现报错&#xff1a; 解决方法 一般网上会建议在终端指令g/gcc后面增加参数-pthread,但是我们没有用到g/gcc指令. cmake的解决方法是在CMakeLists.txt文件里面增加一行. add_executable(server2 main.cpp) target_link_libraries(server2 pthread)问题就解决了

uniapp切换中英文

一、安装 npm install uni-i18n --save 二、创建中英文切换的文件 1.英文en.js文件 2.中文zh_CN.js文件 三、 main.js中引用 // Vue i18n 国际化 import VueI18n from /common/vue-i18n.min.js; Vue.use(VueI18n);// i18n 部分的配置&#xff0c;引入语言包&#xff0c;注意路…

c# wpf template itemtemplate+ListBox

1.概要 2.代码 <Window x:Class"WpfApp2.Window7"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expression/blend/…