来源: postgr.es
27
PostgreSQL 默认不允许函数接收超过 100 个参数。这个限制看起来像一个普通配置项,但 并不是可以在运行时通过 修改的 GUC。它属于 PostgreSQL 构建时使用的内部上限,调整后通常需要重新编译 PostgreSQL,并重建机器上的所有扩展。 这意味着,问题不只是“把一个数字从 100 改成 200”,而是要评估服务器、客户端头文件、...
来源: postgr.es
31
当一个 PostgreSQL 扩展项目从“能构建”走向“值得被依赖”,真正棘手的问题往往不再是 Dockerfile 能否跑通,而是:镜像里到底有什么?这些文件来自哪里?依赖是否完整?漏洞扫描器能否看见它们?未来出现新的供应链事件时,谁负责重建和发布? 围绕 CNPG-Extensions 的实践说明,SBOM、provenance 和 attesta...
来源: postgr.es
37
看到 PostgreSQL 的 时,很容易把它理解成“每个服务进程最多只能打开这么多文件”。但它更准确的含义是一个文件描述符池:当池子满了,PostgreSQL 会关闭暂时不用的旧文件;之后需要访问这些文件时,再重新打开它们。 这个区别很重要。调低参数不一定会让访问立即失败,调高参数也不等于系统会无条件提供更多文件描述符。真正变化的,往往是文件重新打开...
来源: postgr.es
24
PostgreSQL 的逻辑复制通常安静得让人忘记它的存在,直到发布端的 目录突然出现成千上万个文件,磁盘告警随之响起。更棘手的是,这些文件可能在大事务提交后立即消失,只留下一个恢复正常的目录和几项累计统计。 问题往往不是复制槽失效,也不一定是订阅端落后,而是逻辑解码正在为尚未提交的大事务暂存数据。订阅越多,同一份 WAL 就会被重复解码和暂存越多次。...
来源: postgr.es
28
现在的编码代理已经很会写 PostgreSQL:GIN、GiST、部分索引、表达式索引、,以及以租户 ID 开头的复合索引,通常都能写对。真正的问题不再是索引无效,而是每个索引单独看都合理,叠到同一张高频更新表上却形成了昂贵的写放大。 一组针对 30 份模型生成 schema 的实验加载并检查了 838 个索引。只有 10 个找不到明确需求,其余大多具...
来源: postgr.es
30
看起来像一个容量参数,很容易让人产生这样的直觉:把它从 100 调到 500,数据库就能同时处理五倍请求。实际情况恰恰不同。它更接近一份内存预算和一道熔断器,决定数据库最多接纳多少客户端连接,却不能增加 CPU 核心、存储 IOPS 或内存带宽。 真正需要回答的问题不是“能连多少”,而是“多少连接可以同时做有效工作,以及连接积压时应该在哪里排队”。 每...
来源: postgr.es
32
给 AI Agent 配一个专用 PostgreSQL 角色时,很多团队会执行两条熟悉的加固命令:限制单条语句的执行时间,并让事务默认只读。 从管理员视角看,角色配置已经被限制:查询最多运行两秒,事务默认不能写入。但这份安全感有一个关键前提:客户端不能在连接建立时覆盖这些参数。 写入的是会话启动时的默认值,不是数据库层面的强制约束。连接创建后,会话本身...
来源: postgr.es
21
PostgreSQL 19 为聚合函数开放了一个新的 planner support hook:。它允许扩展在规划阶段改写聚合表达式,而不需要修改 PostgreSQL 核心代码。 这个能力看似只是一个新的扩展接口,实际用途却很直接:清理应用生成器留下的冗余 ,或者针对数据的固定精度和小数位,为 替换更快的实现。 考虑下面两个查询: 对于普通的 来说,...
来源: postgr.es
27
任务关键型 PostgreSQL 迁移,真正的终点不是“按计划上线”,而是数据完整、系统稳定,并且出了问题仍然能在目标时间内恢复。为了换取一次干净的切换,把上线日期推迟一周,往往比在凌晨面对数据不一致和无法回退更便宜。 一场优秀的迁移结束后,业务人员只会觉得系统正常运行。这种“没人记得迁移发生过”的平静,不是运气,而是明确的验收标准、反复的演练、可执行...
来源: postgr.es
43
PostgreSQL 18 新增了 。这个参数背后是一笔拖了十年的技术债:从 PostgreSQL 9.5 开始,复制源(replication origin)没有自己的容量参数,只能借用 的数值。到了 PostgreSQL 18,复制槽和复制源终于可以独立规划。 这不是单纯给配置文件多加一行。对于逻辑复制订阅端,它意味着调整复制槽数量时,不会再无意中...