摘要: 点击查看代码 问题: postgresql的backend进程是通过buffer_tag访问缓冲区管理器的,那backend进程是怎么知道buffer_tag的呢? 回答: 这是一个非常好的、而且问到 PostgreSQL 内核关键路径的问题 👍 我直接按 “真正发生了什么” 的顺序来讲,避免概念 阅读全文
posted @ 2025-12-18 15:03 夜说 阅读(3) 评论(0) 推荐(0)
摘要: 点击查看代码 提示:max函数确保没有返回值时输出为null SELECT MAX(salary) AS SecondHighestSalary FROM ( SELECT DISTINCT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS rn 阅读全文
posted @ 2025-12-17 15:36 夜说 阅读(1) 评论(0) 推荐(0)
摘要: 点击查看代码 可以使用switch database to copy; 解决 阅读全文
posted @ 2025-12-10 13:27 夜说 阅读(5) 评论(0) 推荐(0)
摘要: 点击查看代码 客户端发起SQL语句,postmaster进程fork一个backend进程来对接(SQL语句会依次经过backed进程里面的解析器,分析器,重写器,计划器,执行器),最终返回处理的结果 一、一条sql语句(也就是一个字符串)会通过parsenode.h文件中的SelectStmt数据 阅读全文
posted @ 2025-12-10 11:39 夜说 阅读(11) 评论(0) 推荐(0)
摘要: 点击查看代码 seq_page_cost默认值为1.0,是顺序扫描一个页的成本 random_page_cost默认值为4.0,是随机扫描一个页的成本 这是基于HDD(普通硬盘)设置的 现在SSD磁盘使用的更多, 所以当磁盘为SSD时,random_page_cost应设置为1.0 阅读全文
posted @ 2025-12-09 14:06 夜说 阅读(5) 评论(0) 推荐(0)
摘要: 点击查看代码 说明: 0为无效事务id,1为initdb时的事务id,2为冻结事务id。 id1是旧的事务id, id2是新的事务id。 PG普通的事务id是3到2^32-1这个范围,当用到2^32-1时会回卷,会重新从3开始再次循环使用。 这在还没回卷时是没问题的,例如id1是100,id2是20 阅读全文
posted @ 2025-11-19 10:39 夜说 阅读(21) 评论(0) 推荐(0)
摘要: 点击查看代码 一、LOCALE由三部分提供: 1、builtin ##postgresql软件内部提供 2、icu ##第三方提供(默认提供,./configure --without-icu将不可用) 3、libc ##操作系统提供(不同操作系统有所差异,例如叫glibc) 二、默认使用操作系统的 阅读全文
posted @ 2025-11-06 15:50 夜说 阅读(90) 评论(0) 推荐(0)
摘要: 点击查看代码 小版本升级步骤:(例如12.2升级到12.3) 安装pg12.2到/usr/local/pg12.2里面,然后创建/usr/local/pg目录,ln -s /usr/local/pg /usr/local/pg12.2。 这样升级的时候安装pg12.3到/usr/local/pg12 阅读全文
posted @ 2025-11-04 16:28 夜说 阅读(15) 评论(0) 推荐(0)
摘要: 点击查看代码 例如原数据库的目录是/data/aaa/user.dbf ,%b参数会读取到user.dbf而不读取/data/aaa/目录, 使用set newname for database可以指定新目录进行恢复。 run{ allocate channel c1 device type dis 阅读全文
posted @ 2025-10-29 16:41 夜说 阅读(15) 评论(0) 推荐(0)
摘要: 点击查看代码 说明:oldestxmin是表上还在运行的事务中xmin最小的事务id 一、VACUUM正常情况下会以并发清理模式(VACUUM TABLE1;)进行,通过读取VM文件,获取有死元组的页面,清除这些死元组并重排页面内的活元组。 二、FREEZE冻结通常以懒惰模式伴随VACUUM的并发模 阅读全文
posted @ 2025-10-29 14:20 夜说 阅读(52) 评论(0) 推荐(0)