❝开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共3300人左右 1 + 2 + 3 + 4 +5 + 6 + 7 + 8 +9)(1 2 3 4 5 6 7群均已爆满,开8群近400 9群 200+,开10群PolarDB专业学习群100+)
PostgreSQL有一个大坑,但我之前没有想到这么的厉害,也为此吃了一个大亏,我就想请问了PostgreSQL官方你那个官方在设计PostgreSQL当前的模式中,有没有想过这个问题。
事情是这样的,最近一个数据库上跑了一个查询,查询一个月的数据,这些数据经常被UPDATE,且单表也到了50G左右,索引都添加了,平时虽然有IO的波动,但是还可以接受,直到矛盾爆发的一天,还是那个SQL下去后,磁盘瞬间每秒200多MB/S,最高接近了300MB/S。系统性能瞬间降低,影响了其他的SQL运行。
后续业务和我们进行分析,为什么平时都还好,但是现在不OK了,因为无论从条件和返回的数据量以及扫描的执行计划的行数等等都和平时无异议。
PG的其他问题都是小事,但突然来一次莫名其妙的“big problem”的确让人,匪夷所思。后来在查到一个指标的时候,才明白这和PG的本身的缺陷有关。
这个PG性能杀手就是,低密度页。首先解释什么叫低密度页,如果一个8KB的数据页面里面,频繁进行更新,就会制造大量的本来在本页面的行,因为PG的原理MVCC的原因,而数据放置在其他的页面,甚至是数据文件最后。

这就导致一个读放大的问题,在一些以BTREE为基础的数据组织的数据库中即使及在更新数据,他的数据位置还是在原来的位置,主要是数据的主键像锚钉一样,将数据的物理位置焊死。
PG是HEAP,堆表的形式,让一个表中的数据会出现在整体数据文件的不同的位置,导致为了获得很少的行数,而读取更多的额数据块,这叫做IO 放大。
而在PG的设计中,并未设计直接操控数据库服务器的磁盘系统,也就是IO的设计,整体读取数据都是依靠操作系统。当数据库发起数据读取的请求,操作系统内核会自动放大预读数据的窗口,因为在没有获得真正的数据之前,操作系统拿来的数据都需要进入数据库进行验证是否有需要的数据。
操作系统去调用数据文件,就是IOPS高的根本,且这样的效率并不高。
有人说,那我们不是有索引吗? 这点我们还要说,PG的索引大小,有一些复合型的索引并不小,甚至有的比表本身都不小。在我们进行查询的时候,索引是需要进入到内存中,同时我们要注意,数据库历史上是一直痛恨,随机IO的,如果数据可以顺序读取,比跳跃式的读取的性能要高很多。

虽然上面的这个方案也无法能确定,一个SQL查询会涉及到多少页面,但是这里我们也有一个标准。
如果一个页面,只有10多行,那你这个IOPS在进行一些复杂的SQL提取数据的时候,一定不会很好,如果你的一个页面能放到到50-60行,那么你的查询IOPS的效率应该还是可以的,所以宽表,页面里面大量的varchar,(这里我们以不启用toast的标准进行考虑,每个varchar都不大,但就是多),那么你的这个表的运行效率也不会很高。
同时这次的事情,也让我认识到,之前的一些认知的错误,PG无需进行分区表,单表承载力大的一些固有的对PG 的偏爱。总结,老毛病是治不了,但是对于PG的一些核心表
1 如果很大,可以进行分区的也可以考虑分区,但分区键要想好,不要到时候还有聚合的查询在等着
2 提升VACUUM 甚至一些情况的repack的操作,清理页面的碎片,让每个页面都有效利用。
3 如果真的要用POSTGRESQL ,且要在阿里云上,我们已经考虑 DUCKDB 了,阿里云支持 POSTGRESQL 后面挂一个DUCKDB 或者在RDS PG里面内嵌一个 DUCKDB。
最近作为阿里云的云数据库体验官,要来了一些福利,通过下面的链接,别人没有优惠的POSTGRESQL RDS 产品 + DUCKDB的组合,在这里只要7.5折扣。
https://www.aliyun.com/minisite/goods?userCode=qyua9rvi


和架构师沟通那种“一坨”的系统,推荐只能是OceanBase,Why ?
OceanBase Hybrid search 能力测试,平换MySQL的好选择
写了3750万字的我,在2000字的OB白皮书上了一课--记 《OceanBase 社区版在泛互场景的应用案例研究
OceanBase 6大学习法--OBCA视频学习总结第六章
OceanBase 6大学习法--OBCA视频学习总结第五章--索引与表设计
OceanBase 6大学习法--OBCA视频学习总结第五章--开发与库表设计
OceanBase 6大学习法--OBCA视频学习总结第四章 --数据库安装
OceanBase 6大学习法--OBCA视频学习总结第三章--数据库引擎
OceanBase 架构学习--OB上手视频学习总结第二章 (OBCA)
OceanBase 6大学习法--OB上手视频学习总结第一章
没有谁是垮掉的一代--记 第四届 OceanBase 数据库大赛
跟我学OceanBase4.0 --阅读白皮书 (OB分布式优化哪里了提高了速度)
跟我学OceanBase4.0 --阅读白皮书 (4.0优化的核心点是什么)
跟我学OceanBase4.0 --阅读白皮书 (0.5-4.0的架构与之前架构特点)
跟我学OceanBase4.0 --阅读白皮书 (旧的概念害死人呀,更新知识和理念)
OceanBase 学习记录-- 建立MySQL租户,像用MySQL一样使用OB
“合体吧兄弟们!”——从浪浪山小妖怪看OceanBase国产芯片优化《OceanBase “重如尘埃”之歌》
MongoDB “升级项目” 大型连续剧(3)-- 自动校对代码与注意事项
MongoDB “升级项目” 大型连续剧(2)-- 到底谁是"der"
MongoDB “升级项目” 大型连续剧(1)-- 可“生”可不升
MongoDB 大俗大雅,上来问分片真三俗 -- 4 分什么分
MongoDB 大俗大雅,高端知识讲“庸俗” --3 奇葩数据更新方法
MongoDB 大俗大雅,高端的知识讲“通俗” -- 2 嵌套和引用
MongoDB 大俗大雅,高端的知识讲“低俗” -- 1 什么叫多模
MongoDB 合作考试报销活动 贴附属,MongoDB基础知识速通
MongoDB 使用网上妙招,直接DOWN机---清理表碎片导致的灾祸 (送书活动结束)
MongoDB 2023年度纽约 MongoDB 年度大会话题 -- MongoDB 数据模式与建模
MongoDB 麻烦专业点,不懂可以问,别这么用行吗 ! --TTL
免费PolarDB云原生课程,听课“争”礼品,重塑云上知识,提高专业能力
非“厂商广告”的PolarDB课程:用户共创的新式学习范本--7位同学获奖PolarDB学习之星
“当复杂的SQL不再需要特别的优化”,邪修研究PolarDB for PG 列式索引加速复杂SQL运行
“PostgreSQL” 高性能主从强一致读写分离,我行,你没戏!
POLARDB 添加字段 “卡” 住---这锅Polar不背
PolarDB 版本差异分析--外人不知道的秘密(谁是绵羊,谁是怪兽)
PolarDB 答题拿-- 飞刀总的书、同款卫衣、T恤,来自杭州的Package(活动结束了)
PolarDB for MySQL 三大核心之一POLARFS 今天扒开它--- 嘛是火
PostgreSQL 新版本就一定好--由培训现象让我做的实验
说我PG Freezing Boom 讲的一般的那个同学,专帖给你,看看这次可满意
PostgreSQL 无服务 Neon and Aurora 新技术下的新经济模式 (翻译)
“PostgreSQL” 高性能主从强一致读写分离,我行,你没戏!
全世界都在“搞” PostgreSQL ,从Oracle 得到一个“馊主意”开始
PostgreSQL 加索引系统OOM 怨我了--- 不怨你怨谁
PostgreSQL “我怎么就连个数据库都不会建?” --- 你还真不会!
PostgreSQL 稳定性平台 PG中文社区大会--杭州来去匆匆
PostgreSQL 分组查询可以不进行全表扫描吗?速度提高上千倍?
POSTGRESQL --Austindatabaes 历年文章整理
PostgreSQL 查询语句开发写不好是必然,不是PG的锅
这个 PostgreSQL 让我有资本找老板要 鸡腿 鸭腿 !!
MySQL相关文章
一篇为MySQL用户,分析版本核心差异的文章--8.028-8.4的差异
那个MySQL大事务比你稳定,主从延迟低,为什么? Look my eyes! 因为宋利兵宋老师





