瀚高硬核助力 PG 社区:Postgres 19 迎来并行 TID 范围扫描,速度提升 3 倍

运放+三极管构建LED恒流驱动电路:原理、设计与调试全解析 在电子工程领域,恒流源是一种能够提供稳定输出电流的电路,其核心原理基于负反馈控制机制。通过将输出电流采样转化为电压信号,并与一个稳定的参考电压进行比较,系统自动调节功率器件的导通状态,从而抵消输入电压波动或负载变化带来的影响,实现电流恒定。这种技术对于驱动LED、激光二极管等电流敏感型器件具有重要价值,能确保亮度、色温的一致性,并延长器件寿命。本文以经典的运放结合三极管方案为例,深入剖析其如何实现精准的电流“钳位”。该方案利用通用运算放大器作为比较器,配合三极管构成调整管,通过采样电阻实时监测电流,形成了一 阅读详情

对于任何需要维护超大表(更新旧数据、分批删除、数据迁移)的 DBA 或开发者来说,使用 ctid(元组物理位置)将大表切分为多个小块进行处理是标准操作。然而,直到现在,这种操作都有一个巨大的痛点:它严格依赖单进程。

随着最近的一个 Commit (0ca3b169) 合并入 PostgreSQL 19 (master 分支),TID 范围扫描(TID Range Scans)终于支持并行了。

该功能由IvorySQL 社区的 Cary Huang 提出并主导开发,由微软的 David Rowley 协助测试及审阅,并最终提交。他们密切合作以完善并行安全逻辑,确保工作进程正确处理扫描限制——最终促成了这个落地到 master 分支的健壮实现。

瀚高以“用开源链接世界”为使命,强调开源技术在数据库基础软件领域的核心作用,致力于通过共享和合作,推动行业发展,同时链接和赋能全球用户。开源技术是中国软件技术发展的必由之路,瀚高作为亚太地区 PostgreSQL 国际社区顶级贡献者之一,长期深度参与 PostgreSQL 国际社区发展与建设。自 2025 年 7 月以来,瀚高被 PostgreSQL 社区采纳的贡献就已超过 2000 行代码。

根据基准测试,新特性的速度提升高达 3 倍。

1. 核心痛点:规划器(Planner)的权衡

Postgres 自版本 14 起就支持了 TID Range Scans。这允许你基于物理块号扫描表的特定切片:

SELECT * FROM my_large_table WHERE ctid >= '(0,0)' AND ctid < '(10000,0)';

这是像 AWS DMS 这样的工具或逻辑复制初始化器拆分海量表的标准方式。问题在于,直到现在这种扫描节点严格来说都是单工作进程(single worker) 的。

这迫使 Postgres 查询规划器陷入了两难境地。当你在大数据集上运行查询时,规划器必须在以下两者之间做出选择:

  • TID Range Scan: I/O 高效(只读取你请求的块),但是单工作进程。

  • Parallel Seq Scan(并行顺序扫描): CPU 高效(占用所有 CPU 内核),但 I/O 浪费(可能会为了过滤而读取超出你范围的块)。

规划器经常会错误地选择并行顺序扫描,CPU 收益似乎超过了 I/O 损耗带来的负面影响。这导致数据库为了利用可用的工作进程,读取了比必要多得多的数据。

2. 修复方案:并行性与可变分块

由 Cary Huang 开发并由 David Rowley 提交的代码,引入了允许 Tid Range Scan 参与并行查询计划的基础架构。该逻辑有效地将块范围分配给可用的并行工作进程。不再是一个进程从块 0 扫描到 N,多个工作进程可以并发地获取数据块。

实现(约 500 行代码)重用了并行顺序扫描中的“块分块(block chunking)”逻辑。但它不仅仅是将块范围平均分配给工作进程,因为如果表的某个部分数据密度更高,这种简单分配可能导致负载不均衡。

相反,它使用了衰减块大小策略 (decaying chunk size strategy):

  • 大块开始 (Large Start): 工作进程开始时领取大块的块,以最大限度地减少共享状态上的锁定开销。
  • 逐渐减小 (Tapering Down): 随着扫描的进行,分块大小会缩小。
  • 颗粒化结束 (Granular Finish): 到扫描结束时,工作进程每次只领取 1 个块。

这种“缓慢减少”确保了我们不会最后只剩下一个工作进程在处理一个巨大的最终块,而其他工作进程却闲置着。它强制所有进程大致在同一时间跨过终点线。

3. 基准测试数据

为了看到实际效果,我创建了一个包含 1000 万行的表 bench_tid_range,并使用 ctid 范围条件对表的前 50% 运行了 count(*) 查询。

测试环境:

  • 数据量:1000 万行
  • 查询:SELECT count(*) FROM bench_tid_range WHERE ctid >= '(0,0)' AND ctid < '(41667,0)'
环境工作进程数 (Workers)执行时间 (中位数)加速比
Before (Pg 18)0448 ms1.00x
After (Pg 19)0435 ms1.03x
After (Pg 19)1238 ms1.88x
After (Pg 19)2174 ms2.58x
After (Pg 19)3151 ms2.97x
After (Pg 19)4150 ms2.98x
After (Pg 19)5147 ms3.05x
After (Pg 19)6143 ms3.14x
After (Pg 19)7147 ms3.04x
After (Pg 19)8147 ms3.04x

1.png

我们可以看到,仅仅启用 1 个工作进程(这实际上给了我们 2 个扫描进程:Leader + 1 个 Worker),执行时间就大幅下降。对于这个特定的工作负载,“最佳平衡点”似乎在 2-3 个工作进程左右。

4. 为什么不直接用“并行顺序扫描”?

你可能会问:“为什么 Postgres v18 不直接选择并行顺序扫描?用 4 个工作进程扫描整个表难道不比用 1 个进程扫描半个表快吗?”

我通过强制设置 enable_tidscan = off 并使用 4 个工作进程测试了这一点:

  • 执行时间: ~230 ms。
  • I/O: 访问了所有 ~83k 个页面。

新的并行 TID 范围扫描(~150 ms)仍然比暴力/强制的并行顺序扫描快 35%,而且它产生的 I/O 负载只有后者的一半(只访问了 ~41k 个页面)。这可谓两全其美:快速的执行时间(并行)和高效的资源使用(类似索引的范围界定)。

5. 这对工具意味着什么

如果你维护在 Postgres 实例之间移动数据的内部脚本,你可能编写了手动计算块范围并将巨大的表划分为块、然后生成进程来运行它们的代码。

随着 PostgreSQL 19 的推出,这种复杂性可能可以被删除了。你可以发出更广泛的 TID 范围查询,并相信规划器会有效地在集群的 I/O 和 CPU 资源之间分配工作。

6. 如何复现测试

这是设置测试表和运行基准测试的 SQL:

 

-- 1. 创建表 DROP TABLE IF EXISTS bench_tid_range; CREATE TABLE bench_tid_range (id int, payload text); -- 2. 插入 10M 行以生成 ~41k 个页面 INSERT INTO bench_tid_range SELECT x, 'payload_' || x FROM generate_series(1, 10000000) x; -- 3. Vacuum 以设置可见性映射并冻结(对于稳定的基准测试很重要) VACUUM (ANALYZE, FREEZE) bench_tid_range; -- 4. 为会话启用并行 SET max_parallel_workers_per_gather = 4; -- 尝试 2, 4, 8 SET min_parallel_table_scan_size = 0; -- 即使对于较小的表也强制并行扫描 -- 5. 运行查询 EXPLAIN (ANALYZE, BUFFERS) SELECT count(*) FROM bench_tid_range WHERE ctid >= '(0,0)' AND ctid < '(41667,0)';

7. 结论

这是一项令人欣喜的“底层”改进。它或许不会改变您日常的临时查询,但对于构建自定义数据维护脚本的数据库管理员和开发人员而言,并行执行基于 TID 的扫描功能是优化工具包中一项强大的新工具。

8. 参考

本文部分内容是来自 Grant Zhou 和 Robins Tharakan 撰写的英文博客。

【SystemVerilog基础】SystemVerilog Assertion 概述 断言主要是描述复杂的设计行为;是传统验证方法学一个很好的补充,可以检查到电路内部细节,相当于一种白盒验证,传统的验证方法学是纯粹的黑盒验证!property跟上面的sequence差别不大,唯一有差别可能多了两个implication(|->,|=>)注意,当有前置条件时,不满足前置条件不会fail,而是伪真!上面这个因为没有前置条件,每个周期都会去检查!注意:当没有前置条件时,不满足条件会直接fail! 阅读详情

相关推荐

NVIDIA驱动版本太低?手把手教你解决CUDA与PyTorch版本冲突问题

本文针对深度学习开发中常见的NVIDIA驱动版本过低导致的CUDA与PyTorch版本冲突问题,提供了从根源理解到实战解决的完整指南。文章详细解析了驱动、CUDA与PyTorch的依赖关系,并给出了升级驱动、降级PyTorch、使用Conda环境管理及Docker容器化四种核心解决方案,帮助开发者快速诊断并构建稳定的GPU开发工作流。

grpc6streamer的博客 971

DeepSeek总结的PostgreSQL 19新功能:第一部分

PostgreSQL 19新特性概览:连接优化与性能监控升级 PostgreSQL 19将带来多项实用改进,主要包括连接管理和性能监控方面的增强。在连接服务方面,新增了通过servicefile参数指定服务文件的功能,并支持psql变量设置。性能监控工具pg_stat_statements增加了通用/自定义计划计数器,改进了FETCH命令和IN子句的规范化处理。此外,EXPLAIN输出新增了Memoize节点的详细估算信息,帮助优化查询计划分析。其他改进包括btree_gin扩展对整数类型的支持、临时表截断

l1t的专栏 1170

点云数据增强及预处理

数据增强: 1. random world flip:沿着x或者y轴,翻转点云 点云的x或者y,要翻转 3d box中心的x或者y,要翻转 3d box的朝向要翻转 point segmentation label,点云的相对顺序没有发生变化 2. random_world_rotation:沿着点云原点,旋转点云 点,x,y,绕z轴旋转 3d box,绕z轴旋转,中心和朝向都要变化 point segmentation label,点云的相对顺序没有发生变化 3. random_world_scaling

huang_victor的博客 4011

PostgreSQL 19:超高速聚合的全新突破

Citus:7 个常用高级 SQL 工具原文链接:作者:Hans-Jürgen Schönig。

IvorySQL的博客 1011

2021英伟达暑期实习面经(芯片设计)

2021英伟达暑期实习面经(芯片设计前端/DFT) 准备了将近一个月,终于赶在三月的最后一天拿到了offer,暑期实习算是上岸了,后面还有阿里/华为等一些国内公司的面试,但既然拿到了nv的offer,后面的先就当积累面试经验吧~ 网上关于nv的实习or秋招面经很少,硬件岗的更少(约等于没有好吧)。之前准备面试的时候,在网上找了半天,好像就只在牛客网上见过一篇关于nv硬件岗的面经,幸好当时认真看了哈哈。所以既然幸运上岸了,想趁自己还记得,record一下,希望可以帮到有缘人呀~ 好了,废话不多说,开始正题。

Hadleysjtu的博客 1万+

PostgreSQL 19即将发布:面向生产环境的全面进化

PostgreSQL 19 已经进入 Beta 测试阶段,预计会在今年秋季正式发布。本文列举了与工程生产密切相关的几个方向,方便大家做一个参考。

Tony.Dong的专栏 430

从Mule ESB到Apache Camel:手把手教你设计一个轻量级企业集成框架的‘心脏’

本文深入探讨了从Mule ESB到Apache Camel的轻量级企业集成框架设计实践,对比了两者在协议支持、消息处理能力和部署灵活性等方面的差异。通过实际代码示例和性能优化技巧,帮助开发者构建高效的核心模块,适用于现代微服务架构下的系统集成需求。

weixin_28738165的博客 375

PostgreSQL 19新特性之随机日期和时间

这些内置函数可以简化日期和时间相关的随机数据生成代码。PostgreSQL 中的随机函数。

Tony.Dong的专栏 481

HFSS实战项目——高带外抑制特性SIW带通滤波器

本文对单级滤波器和双级滤波器的设计、工作原理及仿真结果进行了详细分析,并验证了双级SIW带通滤波器在性能方面的优越性,为微波通信系统中滤波器的设计和应用提供了重要参考。

2401_87464239的博客 1816

android studio 2022打开了v1 签名但是生成的apk没有v1签名问题

我使用了Android Studio Flamingo | 2022.2.1 Patch 2版本的IDE编译了一个apk,但是apksigner查看apk的签名信息时,发现只有v2签名,没有v1签名。试着改小一下minSdkVersion 为23重新编译apk,再检测一下签名版本v1居然打开了!参考网上搜索到的方法,手动在build.gradle里面添加。但是编译出来的apk还是只有v2的签名。里面提到了v1签名还和。

hedalei的博客 466

DeepSeek总结的PostgreSQL 19新功能:第二部分

PostgreSQL 19 新特性摘要 PostgreSQL 19 在 2025 年 9 月的 CommitFest 中引入多项重要改进: SQL 语法增强: 新增 GROUP BY ALL 语法,自动包含所有非聚合表达式 窗口函数支持 IGNORE NULLS 选项 开发体验优化: 更精确的函数参数错误提示 新增 debug_print_raw_parse 调试参数 默认启用 log_lock_waits 参数 功能扩展: PL/Python 支持事件触发器 random() 函数支持日期/时间范围 新增

l1t的专栏 1064

5G射频到底是啥?方案怎么搭?工作流程、SAW选型、PA选型一口气讲透(工程师秒懂版)

很多人一提 5G 射频,脑子里先冒出来的是几个零件名:👉 PA👉 LNA👉 SAW👉 天线👉 开关但真正做方案时,这些东西不是一堆分立器件,而是一条完整的“信号流水线”。更准确地说,。Qualcomm 对 RFFE 的定义就是“把信息转换成可发送的射频信号,并把接收到的信号转换回有用信息”的那一整套组件。

weixin_43199439的博客 537

PostgreSQL 19 New Features

可以将现有的关系表暴露为属性图,并使用模式匹配语法进行遍历,从而消除了大多数工作负载对独立图数据库的需求。与嵌入在 SQL 注释中的 Oracle 或 MySQL 提示不同,建议存在于 GUC 设置中,并包含一个反馈机制,告诉你每个提示是否被采纳。每个工作者处理一个索引。对于 4 个工作者和 5 个索引,索引清理阶段完成的时间大约等于最大的单个索引所需的时间,而不是五个索引的总和。暴露了更多细节,并且按进程类型的日志记录允许你提高 autovacuum 或归档器的详细程度,而不会让日志的其他部分泛滥成灾。

mirana的专栏 898

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

DeepSeek总结的PostgreSQL 19 即将引入的新功能GROUP BY ALL

PostgreSQL 19将引入GROUP BY ALL语法,自动将所有非聚合列添加到分组条件中。该功能由Tom Lane提交,符合SQL标准且已在其他数据库中实现。示例显示,它能简化包含连接和聚合的复杂查询,自动排除聚合函数列,减少代码冗余。新语法特别适合快速数据探索,在保持逻辑清晰的同时提升编写效率。这一改进体现了PostgreSQL对现代SQL标准的持续跟进。

l1t的专栏 571

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Postgresql杂谈 19—详解Postgresql中的多版本更新机制

MVCC(Multi-Version Concurrency Conctrol,多版本控制并发),是数据库中一种常见的存在并发时保证数据一致性的方法。包括Oracle、Mysql、Postgresql在内许多主流数据库都有一套自己的MVCC方法实现。从实现逻辑上来讲,大体分为两种: 第一种,就是Oracle和Mysql采用的,在更新数据时,把原来的数据放到回滚段中,如果有其它事务需要读取原来的数据,则需要从回滚段中进行读取。 第二种,是Postgresql采用的...

Hyman的博客 1879

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

PostgreSQL笔记19:进程与内存架构精解

PostgreSQL采用客户端/服务器模型,核心架构包括postmaster守护进程、Backend进程和共享内存/本地内存管理。postmaster负责初始化配置、分配共享内存和启动后台进程,并为每个客户端连接fork独立的Backend进程。内存分为共享内存(shared_buffers、wal_buffers等)和本地内存(work_mem等),支持并行查询的动态共享内存。关键后台进程包括Checkpointer(定期刷脏页)、Background Writer(异步写缓冲)和WAL Writer(预

Wang的专栏 377

PostgreSQL 19 临发版前砍掉 SQL/PGQ:换回来的是不停机 REPACK

9 月 24 日,PostgreSQL 19 的第四个 beta 版放出。按社区节奏,RC1 排在 10 月 15 日,GA 预计 10 月内。这个版本本来要带几条很吸睛的大特性,Beta 4 公告里社区干的头一件事是砍功能。

media_chuanbo的博客 218

体育生误入 DBA 行业,后悔了,问换哪行?

说没有希望的,更多是那个人站在他自己当前的认知和情况下得出的一个“临时”的结论,都是感性所为,任何行业都有上升期和成熟期,也都有一部分人选择继续深耕,一部分人选择转向新的领域。但转行不能因为别人说了什么就认为是什么,我见过一些DBA ,转行做销售,做售前,等等,甚至有的身体条件好,转身做了健身教练的也有。所以最终我没有在那个帖子下面留下任何一句话,只有俩字 呵呵,但也并不是留给他的,是留给我自己的,换行,干什么都行,只要能养活自己,自己干的过去,不想死的那种,我看就行。

sql server的专栏 346

DeepSeek总结的PostgreSQL 19查询提示功能

PostgreSQL 19可能引入的pg_plan_advice扩展提供了一种新的查询计划优化方式。它通过生成结构化建议字符串(如连接顺序、扫描方法等)并允许通过GUC或存储机制应用这些建议,帮助优化查询性能。与传统的提示工具不同,它采用"机制而非策略"的设计理念,保持核心极简,同时支持扩展开发。该方案解决了部分传统提示工具的可维护性问题,但对数据规模适应性等挑战仍需注意。目前该补丁仍在讨论中,尚未确定是否会被纳入PostgreSQL核心。

l1t的专栏 532

PostgreSQL 19新特性之GROUP BY ALL

错误本身没有问题,因为不指定 job_id 分组字段的话逻辑上存在问题。查询结果中同一个部门(dept_id)、同一个性别(sex)可以有不同的职位(job),需要分别进行统计。为了避免每次都需要输入完整的分组字段,PostgreSQL 19 增加了一个新的语法扩展:GROUP BY ALL。不仅简单查询支持新的语法,连接查询、子查询等都可以使用。这种语法更加简洁,尤其是当分组字段很多的时候。

Tony.Dong的专栏 378

PostgreSQL 各个版本之间重要变化

到这里,对与 PostgreSQL 相信你已经有了大致合适的版本选择。

顺其自然~专栏 1250

PostgreSQL 日报| PostgreSQL 19 RC1 正式发布(10 月 16 日)

PostgreSQL 全球开发组发布了 PostgreSQL 19 RC 1,这是 PostgreSQL 19 的第一个候选版本,内容与正式版基本一致,正式发布前可能还会合入少量修复。这一特性在数据库层面实现了应用的响应式能力,无需修改查询语法或引入额外基础设施,基于 Neon 现有的 PostgreSQL 兼容平台构建。为此,Genie Ontology 应运而生,旨在让 AI 真正理解业务运转的逻辑——包括每个指标的含义、哪些数据源具有权威性,以及基于权限控制每位用户只能看到其被允许访问的内容。

IvorySQL的博客 161

DeepSeek总结的PostgreSQL 19 中的 SQL/PGQ:无需图数据库的图查询

PostgreSQL 19 引入了 SQL/PGQ 标准的实现,通过 GRAPH_TABLE 功能允许用户在关系表上定义属性图并执行图查询。该功能将图模式重写为关系连接,利用现有索引和优化器,适合处理浅层固定深度的图查询(如社交网络分析),性能与传统 SQL 连接相当。但对于深层可变长度遍历(如六度分隔),由于缺乏专用图数据库的"免索引邻接"优化,PostgreSQL 仍不具优势。这一特性降低了图查询的语法门槛,使得原本复杂的关系分析(如权限审计、数据血缘追踪)更易实现,扩展了关系数据库的实用场景。

l1t的专栏 482

DeepSeek总结的PostgreSQL 19 的新功能REPACK

文章摘要: PostgreSQL 19 引入的 REPACK 功能通过物理重写表文件实现空间回收,比 VACUUM 更彻底。文章详细解析了 repack.c 的实现机制,包括两种工作模式:非并发模式直接锁定重写,而并发模式通过逻辑解码和快照重放保持表可用。核心流程涉及表重写、索引重建和存储交换,其中并发处理通过后台工作进程捕获并应用变更,最后短暂锁定完成交换。REPACK 在保留表逻辑标识的同时优化物理存储,是理解 PostgreSQL 表重组机制的重要案例。

l1t的专栏 522

PostgreSQL教程

数据库,postgresql自己整理的文档

qq_39887703的博客 2920
上一篇: PostgreSQL 19:超高速聚合的全新突破
下一篇: PostgreSQL 中的“脏页(Dirty Pages)”是什么?
IvorySQL
博客等级 码龄5年 745粉丝 566原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值