我们来看一下 p e 的时间日期类型啊,总共有下面六种啊,前面两种的话都是表示这个时间错啊,这个的话是不带失去的一个时间错,这个是带失去的一个时间错啊,他们都是八个字结,后面这个 n 是代表这个进度啊,比如说我们经常使用的这个函数是 laptop la 啊, 你看实际说的话,他是表示前面的这个是日期,后面这个是时间,对吧?后面这个是精度吗?咱们说了啊,这是一二三四五六,默认的话就是六位啊,这个的话是咱们的这个东八区啊啊,比如说我们再来进行一个查看 啊,然后是二零二三年一月一号。好,我们来进行一下 time step, 是不是啊?把这个日期给显示出来了时, 时间的话他没有的话是就从这个零啊,零时零分零秒开始的啊啊?如果说我们后面这样再加一些时间,比如说现在,是啊,十七幺幺 二二三,好,是不是也是把这个给写出来的啊?如果说我们后面的话要这个精度,一二三四五六,是不是啊?咱们可以来 这个定一下他这个进度,比如说两位啊,你看是不是这里只有两位了啊?这个是这个的话他是会四舍五入的,比如说我们这里给他加大一些,这里设置成五,是不是这里变成幺三了啊? 呃,但是下我们说了这个的话,它是不带死去的啊,如果说我们后面要加这个 with times 中 看,是不是啊变成了这个东巴区了啊?啊?然后这个的话是时期,呃,这个日期类型呢?它是占了四个字节的,比如说我们来 select, 二零二三年一月一号, 对头,是不是啊?这个是日期类型啊?这个比较简单,然后下面这个的话是时间类型呢?表示其实就是这个,把后前面这一段,把这个日期给它去掉,就变成这个时间类型了啊。这个的话是不带时区的,这个是带时区的,这个是占了八个字节,这个是十二个字节 啊,比如说我们还是以 select club, 哎, 好,然后我们来 time, 是不是啊?然后咱们还可以制定它这个精度,对不对? 呃,比如说两位是不是变成两位了啊?当然现在他是没有带四驱的,咱们可以来位置太阳目中。好,现在就带了这个四驱了啊,这个是时间类型的啊,后面这个是时间间隔类型的啊,他是占了八个字节的啊。 呃,然后的话我们可以来看一下,比如说 select 啊,咱们可以以 second 一秒钟, 是不是这里是一秒钟,然后一分钟的话是这样的啊, minute 是不是这里就变成了一 分钟了啊?也可以是这个一个小时啊,他这个很灵活的 o u r 一个小时,看见没?这个表示一个小时啊。然后的话也可以是这个一天啊, one day 一天,或者说是一个一个月, 是不是一个月,或者说是一年啊?都是可以的 啊,总共时间类型的话就是这么几个啊,其实都是比较简单的,都是。
粉丝7795获赞1.7万

我们来看一下 p g 里面查看系统信息的常用命令啊。首先第一个的话是查看版本的信息啊,我们这里直接来啊, select 不任性 啊,可以看到我们这里是十四点六这个版本的啊。然后第二个,呃,命令的话是查看数据库的一个启动时间啊,用到这个 post master star time 啊。然后我们来试一下 pg post master star time 啊,这就是它的一个启动时间啊。然后第三个的话是加载这个配置文件的时间啊,如果说你这个数据库没有 low 得过它,其实就是它的一个启动时间,咱们可以来看一下啊, p g comfort low 的太 啊,这里是已经加载过了,和这个不太一样。然后我们重新来加载一下啊,你看 reload 看哦,我们来加载一下,然后再来查询一下,你看是不是就变了啊,变成我刚刚的这个时间了啊 啊。然后这个的话是查看我们数据库的一个时区啊,然后我们来秀 temp 中 啊,这个的话是上海,这个是亚洲,上海这个市区,其实就是我们的这个东巴区,我们可以来查看一下这个时间, 你看是不是后面这个是东八区啊,加零八就是代表东八区的意思。然后这个的话是查看当前的一个用户啊, select current user 啊,是 percept 过一次。其实看这里也可以看到 啊,这个前面的这个前缀就是当前的一个用户,或者说你看这里这个 user press 啊,也可以这么来查看啊。然后这个的话是查看当前的这个啊,数据库,我们连接的这个数据库 啊, database 是不是 please grace 还是这里也可以看到啊, database pressed grace 啊啊,然后这个的话是查看客户端的一个 address 地址和它的一个端口啊,我们来看一下 啊,然后是 clander a dress 啊,然后是 client 的一个 port 啊,这里什么都没有,是因为我们是用这个啊, socket 来进行连接的啊,你可以看到我们是用用 socket 来进行连接的,我们现在不用 socket 来进行连接。然后我们来看一下, 呃,幺九二点幺六八点幺点幺零二啊,没有这个调目,我们来看幺二七点零点零点幺。好,登进去了,然后我们再来试一下, 哎,是不是啊?这是咱们客户的一个地址,是因为我是本机上链接的嘛,所以说是这个回馈地址,然后他用的这个端口是四二五零四啊, 然后下面这个的话就是服务端的一个地址啊,然后我们来看一下 server, 我注意是,然后是 server 的一个 port 好,可以看到这里也是幺二七点零点零幺啊,然后这个是默认的一个端口,不是三二 啊,然后这个的话是查看,查咱们这个进程的一个 id 啊,当前会获得一个进程 id 啊, p g bank end 啊,是 p i d。 好,可以看到是幺七三五啊,咱们这里可以再来开一个 幺七三五,咱们看一下有没有他可以看到这个绘画,是不是这个幺七三五的这个进程啊?幺七三五。 呃,然后后面这个的话是查看这个配置参数了啊,这个的话就是挺简单的,你直接绣就把它绣出来,就就像咱们之前查看这个时区一样啊,你说需要的 buffers 啊,这个是咱们配置的这个共享内存啊,用了二百五十六兆啊,然后这个的话是查看当前的这个日志训练号啊,我们来看一下啊。 pg current 或 l s n 当前这个日字训练号是这个啊,啊,然后这个的话是查看咱们正在写的这个万日字啊,他,他给的这个参数就是把这个当前的这个日字训练号给进去,咱们可以来看一下。 呃,我自己考吧, one name。 好,然后我们把这个这个函数给他写进去。好,这个的话就是咱们当前正在写的这个 word 字。好,我们可以到 进里面来看一下。 pg data。 啊,是哪个?就是这个啊,咱们当前正在写的这个,嗯,常用的这个查看系统的姓命令的话就只有这么只有这些啊,并不太多这个。

如果想在 linux 环境下快速体验 p g 数据库的功能,往往会遇到一些小麻烦。 一、使用各个 linux 发行版本中自带的 p g 软件包,通常版本比较旧,无法体验最新功能。二、安装 p g 官方的最新软件包,不同的 linux 发行版本的安装方法都不一样,整个过程稍显麻烦。 三、红帽 linux 的 e l 八下编辑好的 p g 软件包只能在 e l 八下运行,无法直接拷贝到 e l 七下使用,也不能拷贝到 debm 或 open 下使用。 四、最后最重要的一点是,当 linux 大 版本升级之后,主机上的 p g 数据库通常会出现锁影损坏的情况,必须重建锁影才可以正常使用,具体请见链接。 那么是否存在一套拷贝到任意 linux 机器都可以直接使用的通用软件包呢?答案是肯定的,中启陈树科技发行的 p g 绿色便携软件包就可以满足这个需求,而且此软件包是完全免费的。 中启陈树科技是一家专注数据库技术的公司,所出产品必属珍品。此 p g 绿色软件包 可以拷贝到任意 linux 下直接使用。经过测试,在红帽 linux 的 red hat 七、 red hat 八、 red hat 九以及基于红帽的三重 s blocky linux、 alma linux、 oracle linux 都可以直接运行, gabion、 obunto 等等常见的 linux 发行版也不在话下。用此绿色包搭建的数据库,实力在操作系统大版本升级之后,无需考虑锁影损坏的问题,还可以搭建跨 linux 操作系统大版本的流复制机型, 数据库的物理备份和恢复也无需考虑 linux 操作系统的版本兼容问题。 p g 十八点一已经发布,带来了诸多性能优化与功能升级,大家赶紧用我们重磅推出个绿色 p g 软件包,实际体验 p g 数据库的强大吧。 运行绿色版本的 p g 与官方的 p g 版本基本没有其他区别,除了需要设置一个环境变量, 下面我们以一个实际的例子来说明此绿色便携版本的使用方法。 注意,如果要下载 im 六四 cpu 架构的版本,需要替换 x 八六六四为二尺六四,需要 p g 十六点一一或者 p g 十七点七的版本替换下十八点一为对应的版本号。安装 p g 绿色便携版 bash 执行脚本, 并文件里面实际上是一个 tar 压缩文件,执行命令时会将其解压到 u s r 下面,这里数据库软件就安装好了。创建操作系统,用户 p g 登录用户设置下环境变量,能够快速搭建数据库。想了解详情请见链接,欢迎大家使用。

咱们今天来聊点硬核的 postgrace, 这个数据库世界里的常青树,很多人都在用,但你有没有想过它到底为什么这么稳? 今天咱们就把它一层一层的剥开,看看它最核心的架构设计。咱们要聊的不只是它能做什么,而是它内部那些堪称魔法的机制是如何保证了它的高性能和高可能性的。 ok, 这是咱们今天的探索路线。首先,我们会从所有多用户数据库都绕不开的一个坎开始并发问题。 然后呢,我们会一起深入到他的机房,看看他的核心引擎和那些关键进程。之后就是重头戏了,我们会想起拆解 posgr 的 两大法宝, m v c c 和 w a l。 最后我们再来看看是什么让他不单单是个数据库,更成了一个功能强大的开发平台。好,咱们就从最头疼的一个问题开始。 你想想看啊,一个热门的电商网站,同一秒钟里可能有成千上万人在下单,查库存、改购物车,那系统要怎么保证你查到的库存是准的?他下的单不会跟别人的搞混,而且整个数据库还不会因为这么大的访问量而喷阅或者数据错乱, 这就是所有数据库系统必须解决的最根本的并发症。那么处理并发症基本上就两条路,你看左边这个是比较传统的方法。枷锁什么意思呢?就是一个人在写数据的时候,其他人想读就得等着,反过来有人在读,其他人想写也得排队。 这虽然能保证数据不出错,但结果就是系统里到处都是红灯,大家都在排队,性能自然就上不去了,这就是所谓的锁竞争。而 post grass 走了一条更聪明的路,也就是右边这个 m v c c 多版本并发控制,它的核心思想简直是天才, 读和写各走各的路,互不干扰。每个操作港道的都是数据库在某个时间点的一个快照,这样大家就不用再排队了,我们后面会详细看它是怎么做到的。 想要彻底搞明白 m v c c, 咱们得先退一步,从更高的视角看看整个 post grace 引擎是怎么搭建起来的。它的基础就是一个经典的客户端赋服务器模型。 这个模型其实很简单,你的应用程序就是客户端,当他需要读写数据的时候,就会发送一个请求给一个叫 postgress 的 主服务进程。 你可以把这个主进程想象成一个总指挥,他负责聆听所有请求,管理着磁盘上所有的数据文件,并且协调内部的一切工作。 但他可不是一个人在战斗,这个总指挥非常聪明,他知道怎么把活分出去。他有一支专业的后台小分队, 你看有专门负责把内存里修改过的数据写回硬盘的后台写入进程,这样主进程就不用自己去等慢吞吞的硬盘操作了。还有负责打藏点点的检查点进程,确保出问题了能恢复 那个 w a l。 写如进城是保证数据不丢的关键,我们待会细说。最后这个自动清理启动器就是 m v c c 能正常工作的保洁员,每一个进城都各司其职,整个系统才能跑得又快又稳。 好了,重头戏来了,咱们来聊聊 post grass 的 第一个黑科技, m v c 系。 要理解他最好的方式就是把他想象成一台时间机器。当你的一个事物开始时,他就拿到了一张那个瞬间的完整的数据库照片,也就是快照。接下来,不管别人怎么修改数据,在你的这个事物结束之前,你看到的永远都是这张照片里的内容, 就好像时间静止了一样。这句话是从官方文档里摘出来的,它完美地总结了 m v c c 的 最大好处,读取永远不会阻塞写入,写入也永远不会阻塞读取。 这简直就是并发控制领域的终极理想。这意味着什么呢?这意味着你可以一边跑一个需要好几个小时的复杂数据分析查询,一边还能同时处理成千上万个高频的 online 交易请求,两者之间互不打扰。这在性能上觉得是一个巨大的费略。 那这个所谓的快照和多版本到底是怎么实现的呢?它的原理其实非常巧妙, 当你更新一行数据的时候, pos graph 并不会直接在老数据上修改,而是会另外创建一个这行数据的新版本。 同时,它会把老版本的数据留着,并给它打上一个失效时间的标记。这样一来,在那个失效时间之前,开始的事物看到的就还是老版本的数据,而之后开始的新事物看到的自然就是新版本的数据了。 通过这种方式,数据库里就同时存在了多个版本的数据,满足了不同时间点上事物的需求。 我们来跟着一个 update 命令走一遍。第一步,你的程序发了一个更新请求。第二步, progress 找到了那行老数据,但注意它没有删掉它,而是把它标记成过时了。 第三步,它创建了一个全新的行,包含了你更新后的数据,这样老的事物还能继续读老的数据,新的事物就能读到新的数据了。 那这些过时的老数据怎么办呢?总不能一直留着吧?这就轮到我们前面提到的那个保洁员 vacuum 进程出场了,它会定期检查确认哪些老版本的数据已经不可能再被任何事物看到了,然后就把它们彻底清理掉,把空间回收回来。 好的 m v c c 解决了高病发的性能问题,但数据的安全呢?万一服务器突然断电了,我刚提交的数据会不会丢?为了解决这个问题, posgrace 拿出了它的第二个法宝, 预写式日记,也就是 wall, 你 可以把它理解成是数据库的一个永不损坏的黑箱子。 他的核心思想是一条铁律,任何对数据的修改都必须先记录在日记里,然后才能去真正的修改词盘上的数据文件。也就是说,先写日记,再写数据。而且写日记这个动作是把操作记录顺序的追加到文件末尾, 这比在数据文件里找到对应位置再去修改的随机写入要快的多得多。所以 postgress 遵循的原则就是先快速地把要做什么记下来,然后再找个合适的时间慢慢地去做,这正是它能够保证数据绝对不丢的基石。 这张图把整个儿提交流程拆解的特别清楚,你看第一步,你的修改操作先在内存里完成了。第二步,也是最关键的一步,一条描述我要做什么修改的日历记录被写入到了此盘上的 w a l 文件里。 只有当操作系统确认这条日历已经安全落盘了,第三步才会发生。数据库告诉你的应用程序。 ok, 你 的提交成功了, 这个时候你的数据就已经绝对安全了。至于第四步,也就是真正把数据写到主数据文件里,那可能是几秒甚至几分钟之后的事了。就算在第三步和第四步之间数据库坑背了也完全没关系。 启冲之后, posgrace 只要把 w a l 网址拿出来重放一遍,所有提交成功的数据就都恢复了,一个都不会少。 那数据库是怎么知道日制处理到哪儿了呢?它用了一个叫日制序列号,也就是 lsn 的 东西来跟踪, 你可以把它简单地理解成一个不断变大的页码,每条新的日制记录都会让这个页码增加。通过这个 lsn 数据库就能精确地知道空会恢复应该从哪里开始,或者在数据同步的时候要把哪些日制传给备用服务器。 ok, 到现在我们已经知道了, postrest 非常可靠,并发性能也很强。但真正让它在开发者圈子里封神的是它的另一个特性,极高的可扩大性。 它已经远远不只是一个存数据的地方了,你甚至可以在数据本身之上去构建你的应用。这种开放的设计理念可不是后来才加上的,而是从它诞生之初就刻在 dna 里了。 它的前身还是一个大学研究项目的时候,设计目标就不是做一个封闭的系统,而是要做一个允许研究人员和用户自己动手去扩展和定制的平台。 可以说它天生就是为了被魔改而生的。这种设计带来了什么好处呢?你看,你可以自己创建数据类型,比如创建一个专门存地理坐标的类型或者化学分子式。 你还可以在数据库里直接用 python、 pearl 这样的语言写复杂的业务逻辑,而不仅仅是 sql。 更厉害的是,通过外部数据包装器,你可以让 postgress 去连接另一个 my sql 数据库,甚至是一个网页 a p i, 然后像查询本地表一样去查询它们。 你还可以根据自己的数据特点创建全新的锁引类型,比如专门用来锁引地理空间数据的 gist 锁引。这些功能都让 postgress 的 能力边界大大拓展了。 所以你看,当一个数据库不仅能存你的数据,还能理解你的自定义数据,能运行你的业务逻辑,甚至还能去调用外部的服务时,它就已经不再是一个被动的仓库了,它变成了你的应用平台里一个非常活跃、非常核心的组成部分。 这就给我们留下了一个非常有意思的问题,去思考当数据库的能力可以无限扩展时,数据库和应用程序之间的边界到底在哪里?

记录一下我微信时安装秘密和数据库的过程,包括秘密克斯瑞和秘密克 four。 首先安装这个软件可以默认他的一个安装地址,但是我因为 c 盘第三对,因为安装这个数据两个数据库的话至少要一百多个 g, 所以我还是想换一下安装地址 放在我的地盘吧,咪咪口 正常安装就行了,这个要一样的默认就行,然后密码的话一二三四,一二三四,随便是 举手就行,然后这个都是默认,然后给他安装 next, 这边允许所有程序操作这个报错。没关系啊,警告,没关系,直接点确定, 然后完成,完成以后,首先第一步要右击计算结果此电脑,然后管理服务服务,把这个数据铺这个服务开启, 首先属性登录改成本地账户应用确定,然后再启动 啊,启动好了,启动完以后,然后我们就正式安装我们的绿科数据库了, 点击刚才我们安装的这个软件里面有一个这个 sql, 然后回车回车回车回车。然后这边立马就是我们刚刚安装程序的时候输入的一二三四, ok, 然后进入到这个界面就证明安装成功了。 那么接下来就是间接数据库了,我们首先安装 amy 和 siri 吧, 根据我这个啊,首先复制这个 drop dead base exist, 妹妹靠 strike, 就是如果存在,因为客 sui 就会,就先把它给删除掉,然后这边不存在就不管它了,然后这个创建一个妹妹和手指铺用户名这个, 然后连接数据库存, 嗯,半夜人吧,然后 连接数据库,连接成功以后,然后就创建我的这个 bo, 然后设置 mix three 的路径,设置成功,然后就是我们这个,这个就是安装数据库,数据库的话 我是放在地盘里面的这个 mimic three, mimic three 首先要把这几个文件,一个 note data 七 z i p, 然后 crate table, 然后增加这个缩影的文件,然后 check 的文件,然后这个数据库的这个电子表格文件,然后另外还有一个这个 concepts, 这个后面会讲到,那么首先就是把这个路径复制过来,就是一个斜杠 i, 然后它的一个路径,这个就是创建表格的问题, 创建表格表格创建好以后呢,设置一个,就是如果出错就是记录一下, 然后设置我们那个数据文件的数据库,这个数据文件的表格文件的地址,也就是我们这个因为克斯瑞克尼尼克 dtbs 一点四,然后点回去了。 设置好以后,然后就是设置我们的中文密码,然后就是导入我们的这是 note, 这个七 z, 首先,嗯,在这个之前你应该就系统安装我们的这个 ccp 的一个这个解压锁包文件,呃,软件我之前安装过了,所以这边就直接直接复制,也是斜杠 i, 然后这个文件所在地址,然后回车, 嗯,然后这个就是正在安装我们的这个秘密口数据库,这个第三个文件,嗯,非常大,是零,可能要花费好几个小时,所以这边我们就先等待吧。 那这个十一点半到三点半,四个小时,四个小时才装完,咱们看一下啊,看一下装在这个秘密壳里面的,看一下多大啊?四四十六点几 几个 g 啊?因为这个底盘是固态的,那个机械硬盘最近装的比较慢,如果中间 c 盘是固态的,肯定会快一点啊, 那么接下来就是装这个,呃,这个缩影文件复制,然后一样的就是找到这个 index, 这个文件所在的地址,写到 i, 然后回车, 然后也是一样等待这个,所以我就装好之后就可以用。然后最后一步就是检查这个啊,然后一样的,这个也要花蛮长时间的,现在是三点半啊,你看不到, 当然了,我们再等等吧,那这个结束了啊,嗯,三点半到四点半,大概一个多小时,一个小时多一点点吧,那么这个就,嗯,所以严重完成了,所以 完成一会,然后我们再这个就 check 一下,看看有没有安装成功啊。直接也是一样的啊, check 文件在这,然后前面切开 i, 输入他的一个地址,稍微等一下。 明明和 sorry 数据库一共有二十六个表格,那么如果安装成功的话,这边会显示二十六个这个 past 的表格啊, 那,嗯,这个回收完以后,他就会显示有二十六行记录,然后所有的的二十六行啊,然后这个就安装成功了,我们可以直接查掉,然后我们打开这个软件啊, pig 这个小大象的软件 一次启动有点慢, 然后这个就是我们安装时候输的密码一二三四,然后同样的这个也是一二三四, 你可以看到数据库里面有一个 mimic three, 然后里面的话架构里面有个 mimic three, 有个比如像表,那比如 mimic curve 这个 order automation, 那么我们查询一下工具,查询工具,然后比如说我们这个 就差一百条记录吧,啊,那么就查到一百条记录,一秒死死三三号秒一百条记录,那么这个米米克狮子库就装完了,装完了以后呢?那我们另外还有一个米米斯瑞,还有一个可可石化的一个师图, 嗯,怎么做呢?就是首先要把我们这个 coss 文静放在这个里面,这个在官网都可以吓到的,然后我们仍然是运行这个 这个,然后链接到数据库,首先要登录还是一样回车,回车,回车,四个回车以后,然后按一二 三四,然后链接数据后设置数据后,然后这个选择我们这个文件夹的地址, cd 到这个地方,然后写到 i, 选择里面 concept 里面的这个 make a concept 点 sql 这个文件,然后开始也是一样的,这个巫师话也要一段过程 一段时间啊,四点五十三,那可是话就装好了啊,一共是人这么多。 然后我们看一下可说话的结果, 密码一二三四, micro three 加勾 mix three, 护花使徒都有了,嗯,比如我这边有一个 first day hit i see you the tears, 采取一下看看 i see you tears 还是一百多吧。嗯, isio, 好,这样就 ok 了。手机给我转完了, 那么接下来同样的方法去装 mimicafer 一样的 mimicafare, 然后仍然是打开这个 一二三四,输入密码一二三四,然后首先如果存在密密 oppo 数据库,就把它删除掉,不存在,那它就新建一个, 然后新建一个密密克夫儿,然后链接密密克夫儿水库。哦,要稍微等一下,这个 机械硬盘可能真的是运行速度比较慢,苹果版的这个 mig four 安装的话好像就二十几分钟就好了,不知道这个 windows 机械硬盘装要多长时间啊?互联硬盘装其实也很快, 我们看一下啊,我们看一下目前它的一个内存是多大?一米克斯瑞是包括它的一个刻式化仕途,一共是五十一个 g, 这个是链接 vip fro 数据库,链接成功以后,然后是创建,然后设置路径, 然后是雪刚爱,我是 crazy 表格, crazy 就是 mimic board 里面的这个 crazy 点 s q air, 然后就要会车一样的啊。装好了以后,然后就是我们讲的这个是设置,如果出错,把它记录一下, 坚持一,然后这个就是设置他的一个数据库的数据。呃,末路,我是在 micfor 里面这个 micfor 一点零回撤, 然后设置他的一个阿斯柯玛,中文阿斯柯玛,然后,嗯, load, load, 这 七 z, 这个点 sq f 问题,然后这个就跟那个二十六个表格一样,因为克罗斯瑞的二十六个表格一样,他装载他的一个这个,嗯,同样也是要一段时间啊,现在是六点 十三,六点十三,嗯,等会再看, 呃,九点零七吧。这个装好了,美女看 four 数据库不需要 check, 那我们来运行一下啊, 看一下 mini curls, three minute four 装完以后这个有多大 一层啊?哇,一百二十八 g 啊,两个数据会一百多 g 啊。然后 那么这个 mimica, three mimic four 的出现呢?然后同样的是架构里面有,比如说 icu, minicle, icu, 它里面有表格,比如说 icus dis。 同样呢,我们也去看一下它的一个, 你看一下一百条记录,查询一下 一百条吧,还是差一百条记录啊。一百条 ok, now mimics, three mimic four 都装好了,两个手提裤,一百二十八个 g, 完美。

数据量明明没变,磁盘却直接爆满了。别下山数据了,没用的来,今天咱们聊聊 post graduate 里最坑爹但也是也是大场面试必问的表膨胀。兄弟们, 你们有没有遇到过这种情况?核心订单表维持在一千万行,每天就是改改状态,结果呢?行数没变, 词盘占用却像坐火箭一样往上涨。本视频完整笔记,我都整理进了两百万字的 java 加 ai 面试提库里了,里面包含了主流技术栈与几十个项目场景题,还有各个工作年限的简历模板,以及 java 和 ai 大 模型的学习路线, 查询也越来越慢。这时候很多转行做 p g 的 同学第一反应就是删历史数据啊。我告诉你,在 p g 里,你越删,空间可能越不释放。为什么会这样,这得从根儿上说起。 如果你是卖 circle 玩家,你习惯的是原地更新,改了就是改了,但在 posgrid circle 里,机制完全不一样, p g 没有 android log, 它搞的是追加更新。 什么意思呢?在 p g 里, update 等于 delete 加 insert。 你 改一条数据, p g 是 先把旧的那行标记为死源组 dead top, 也就是尸体,然后在旁边新插一行。这就吓人了。 你想想,如果你每秒有几千个 update, 那 就等于每秒产生了这就几千具尸体。 如果清理不及时,你的表就像这张图一样,看着是满的,其实全是无法附用的,费空间,这就是表膨胀。 那怎么知道我的表种没种?别猜,直接上代码。大家截个图,用这个 circle 查 p g status tables, 重点看 ndt2。 如果膨胀率 blood ratio 超过百分之二十,你就得报警了。有人会问了,老师, p g 不是 有 auto-turbo? 超过百分之二十你就得报警了?有人会问了,老师, pg 不是 有 auto-turbo 自动清理进程吗?它在摸鱼吗? 他倒是想干活,但有时候干不了。看这张图,只要你的数据库里有一个连接,处于 idol in transaction 事务空闲状态。比如有个开发连着生产库跑,长事务没提交 auto vacuum 就 完全不敢动, 因为 m v c c 机制要求它保留旧数据给那个长事物看。结论就是,只要有一个长事物卡着,你的膨胀速度就会远超清理速度。那现在磁盘快满了,怎么就千万别手滑去敲 welcome 那 会所表业务直接挂掉, 老板会杀人的。生产环境首选 pj repack, 在 线重组业务几乎无感,但是这里有个大坑, pj repack 也是要建新表的,它需要大概一点一倍的剩余空间。 如果你的磁盘已经红了,用了百分之九十五,这时候你是跑不起来的,所以运为红线百分之八十,报警时必须介入,别等到百分之一百再哭。只选只能救急, 怎么才能根治呢?这就要请出 pg 的 杀手锏, hot heap only top 机制。它的原理是更新时新数据直接塞在旧数据那个页面里, 完全不改缩影,这样开销最小。但是号的生效有两个死命令,缺一不可,第一,数据页里得有空地儿 free space。 第二,你的 update 语句不能修改任何缩影列。 所以实战中最大的坑是什么?看这里,很多人习惯给 update time 加,所以你每次更新数据都会变时间,一变时间,所以就得改 hold 直接失效, 所以严禁在频繁修改的字段上建,所以这就是锁瘾洁癖。那怎么保证页面有空地儿呢?调参数,把 fill fact 填充因子设为百分之八十, 意思就是每页我只填百分之八十,预留百分之二十给未来的更新,用以空间换时间,强制触发 hot。 好 了,最后咱们总结一下 p g 表膨胀治理的三板斧 tier 一, 紧急排查,先杀尝试五,再用 p g repack, 注意此盘水位。 tier 二,架构调优, 去掉没用的高频,所以把 feel factor 设为百分之八十 t 二三参数调优,让 auto vacuum 跑得更勤快点学会了吗?我是 fox, 关注我技术面试不迷路。

面试官问你, pos sql 的 主键是拒促锁影吗?如果你张嘴就来?是啊,主键存数据锁影是必加数。那恭喜你当场挂科。很多兄弟被 my sql 的 八股文洗脑了, 以为全世界的数据库都是 micro, 但在 p g 里,主键就是个普通的二 g, 所以 为什么会这样?我放在这份两百万次 java 与 ai 大 学习笔记里了,里面包含 jvm ready、 mq 微服务、 ai 大 模型等三十多个技术站与一百多个项目场景实战笔记,还有不同工作年限同学的鉴定模板。大家看这张图, micro 是 i o t 缩影组织表, 数据就住在主键必加数的叶子节点里,井里井井有条。但 p g 是 堆表 hepu table, 它的数据像一堆乱炖的砖头, 随便堆在字牌上,根本没有顺序。所以 p g 的。 所以里存的不是数据,也不是主键 id, 而是一个物理地址,指真叫 ct 的。 那这有什么好处呢?看这里, maccode 查二级,所以得先回表查主键,再查数据。要走两棵树, p g 呢?拿着 c t i d 直接飞到物理地址去拿数据,少走一趟弯路。读性能贼快,但是有得必有失。如果我 update 改了一条数据,导致它的物理位置变了, c t d 变了, mexico 只需要改主键二级,锁影不用动。但在 p g 里, 所有指向这一行的缩影全部都要改一遍,这就叫写放大 write amplification, 写性能压力山大。再来个更坑的。面试官问, p g 里有覆盖缩影吗? 你以为只查缩影列就不用回表了?错, p g 的 缩影里不存事物信息,就算缩影里有数据, p g 也不知道它是不是活的,必须回表去看一眼 visibility check, 除非你勤快地跑。 vacuum 更新了 vm 可见性印刷表, 告诉 p g 这页全是干净的,他才敢走。 index only scan 被虐了这么久, p g 到底强在哪儿?它强在武器库,太丰富了。搞 jason, 别用 my circle 的 虚拟列了 p g 的 j 的 倒排,所以查 jason 比 mongodb 还快。搞互联网持续数据几十亿,行 用 brain, 所以 它不存指标,只存数据快的最大最小值几 tb 的 数据,所以只有几 mb。 最后送大家一个 p 八级的闭坑指南, 千万别在 p g 里用乱序 u u i d 做主键。为什么看这张图 u i d 是 乱序写入的,会把数据页弄得满天飞? p g 的 机制是,只要数据页脏了,第一次修改就要把整个页写入 ll 日制 four page right。 后果就是 l 日制暴涨 l 直接打满数据库卡死。解法是用 t s i d 或者 u u i d v。 七,保证有序性,没有最好的架构,别拿 micro 的 经验硬套 p g。