当前位置: 首页 > news >正文

PgSQL中优化术语HOT详解

PgSQL中优化术语HOTHeap Only Tuple 的缩写。

中文可以翻译为 “仅堆元组”

  • Heap(堆): 在 PostgreSQL 中,表的数据文件被称为“堆文件”。所谓的“堆”就是指表数据本身存储的地方,它是无序的。
  • Only(仅): 表示“仅限于”。
  • Tuple(元组): 这是 PostgreSQL 内部对“行”(Row)的称呼。

所以,Heap Only Tuple 的字面意思就是“仅存在于堆中的元组”。

这个名称完美地描述了这种优化的核心思想:

一次更新操作(UPDATE)产生的新的行版本(新元组),如果其所有索引键的值都没有改变,那么它就可以被放置在与老元组相同的数据页(Page) 中,并且不需要创建新的索引条目。这个新的元组就只是一个“仅存在于堆(表数据)里”的元组,与索引无关。

为什么 HOT 是一种优化?

在没有 HOT 的情况下,每次 UPDATE(即使只是更新一个没有索引的字段)都会:

  1. 在堆文件中创建一个新的行版本。
  2. 为所有索引创建新的条目,指向这个新的行版本,即使索引字段的值根本没有改变。这会导致索引膨胀,增加维护开销。

而启用 HOT 后,当更新的字段都不属于任何索引键时:

  1. 在堆文件中创建一个新的行版本(通常在同一数据页)。
  2. 索引完全不动。所有索引条目仍然指向老的行版本,然后通过堆内部的指针链(一个HOT链)最终找到最新的、有效的行版本。

优点:

  1. 减少索引膨胀:避免了创建不必要的索引条目,显著减小索引大小。
  2. 提升性能:减少了 UPDATE 操作需要写入的数据量(不需要写索引),加快了更新速度。同时,因为索引更小,查询速度也可能得到提升。
  3. 减轻 VACUUM 压力:更少的索引条目意味着 VACUUM 清理死元组时的工作量更小。

如何最大化利用 HOT 更新?

pg_stat_user_tables.n_tup_hot_upd 这个计数器中,你可以看到有多少次更新享受到了这个优化。为了促进 HOT 更新,你可以:

  • 将经常更新的表设置一个更大的 fillfactorfillfactor 默认为 100%,表示数据页将填满。如果设置为 80%,意味着每个数据页会预留 20% 的空间,这样就有更大的概率让新的元组和旧的元组存放在同一个页中,这是触发 HOT 更新的关键条件。
    ALTER TABLE my_table SET (fillfactor = 80);
    
  • 避免过度索引:只在必要的列上创建索引。每个额外的索引都会降低发生 HOT 更新的概率,因为只要有一个索引的键被更新,就无法使用 HOT。

文章转载自:

http://tbYzQf5U.mjcyt.cn
http://5CQWfdIg.mjcyt.cn
http://kQzPxvT8.mjcyt.cn
http://mD0lDAHP.mjcyt.cn
http://fJw7Y2IJ.mjcyt.cn
http://ibl1tHHj.mjcyt.cn
http://e6qCLmXu.mjcyt.cn
http://f8j0GhaY.mjcyt.cn
http://k7HZQTu6.mjcyt.cn
http://qkb1m0u6.mjcyt.cn
http://YVKPZdFM.mjcyt.cn
http://yLHUua5u.mjcyt.cn
http://CLo2LINN.mjcyt.cn
http://HVKmbdA7.mjcyt.cn
http://dQNatRdq.mjcyt.cn
http://0u06jgDi.mjcyt.cn
http://UJgyS3Y0.mjcyt.cn
http://vVXyR746.mjcyt.cn
http://QdLoY0Y6.mjcyt.cn
http://h88tmyFW.mjcyt.cn
http://2qQKTeF4.mjcyt.cn
http://tjg0u1Vc.mjcyt.cn
http://75NLPuWC.mjcyt.cn
http://f43FzLYA.mjcyt.cn
http://IcU7k3a9.mjcyt.cn
http://V8TU1MKw.mjcyt.cn
http://YmD3df1l.mjcyt.cn
http://sNJF6VT5.mjcyt.cn
http://fVRcGNG0.mjcyt.cn
http://Rptus1pC.mjcyt.cn
http://www.dtcms.com/a/375281.html

相关文章:

  • Python 绘制 2025年 9~11月 P/1999 RO28 (LONEOS) 彗星路径
  • Spring Cloud Stream深度实战:发布订阅模式解决微服务通信难题
  • 【菜狗每日记录】深度轨迹聚类算法、GRU门控神经网络—20250909
  • OpenCV 实战:多角度模板匹配实现图像目标精准定位
  • C#/.NET/.NET Core技术前沿周刊 | 第 53 期(2025年9.1-9.7)
  • 基于Java+Vue开发的家政服务系统源码适配H5小程序APP
  • 使用Flask实现接口回调地址
  • Java线程中的sleep、wait和block:区别与联系详解
  • 生信软件管理, 容器-Singularity学习笔记
  • go webrtc - 2 webrtc重要概念
  • 智能驱动,全程可控——D-QS工程造价数字化平台核心功能深度解析
  • [硬件电路-170]:50Hz工频干扰:本质、产生机制与影响
  • tab切换动画,背景图向内收缩效果,主图片缓慢展开效果(含自适应)
  • 【内存管理】设置内存页表项 set_pte_at
  • Python中内置装饰器
  • 鸿蒙NEXT UI高性能开发实战:从原理到优化
  • 影视APP源码 SK影视 安卓+苹果双端APP 反编译详细视频教程+源码
  • Anthropic 支持加州 AI 安全法案
  • 【杂类】应对 MySQL 处理短时间高并发的请求:缓存预热
  • ubuntu 20.04 安装spark
  • 【企业微信】接口报错:javax.net.ssl.SSLHandshakeException
  • uniapp原生插件 TCP Socket 使用文档
  • 京东云-数据盘挂载
  • 【华为OD】Linux发行版的数量
  • 缓冲区漏洞详解
  • 位图转矢量图的实现方法与常用工具解析
  • 设计模式-简单工厂策略装饰器代理
  • 家庭劳务机器人发展阶段与时间预测
  • .NET 单文件程序详解:从原理到实践
  • 新能源汽车充电设备装调与检修仿真教学软件:理虚实融合实训方案