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

PostgreSQL 执行计划:参数、节点与常见问题

PostgreSQL 执行计划:参数、节点与常见问题

EXPLAIN是 PostgreSQL 里最常用的性能排查工具。一条 SQL 在大表上跑得慢,可能是索引不对,可能是统计信息过期,也可能是优化器选了次优路径。这篇文章讲清楚执行计划的参数怎么用、核心节点怎么看,以及生产环境里最常见的三类慢查询问题。

示例

EXPLAIN(ANALYZE,BUFFERS,FORMATTEXT)SELECTt.data_key,t.station_id_c,t.datatimeFROMhourly_obs_202607 tWHEREEXISTS(SELECT1FROMstation_info sWHEREs.station_id_c=t.station_id_cANDs.admin_code_chnLIKE'4105%'ANDs.chn_station=1);

一、EXPLAIN 参数

EXPLAIN只给预估计划。加上ANALYZEBUFFERS,才拿到实际耗时和 I/O 数据——这是排查慢查询的标准组合。

1. ANALYZE

ANALYZE让数据库真正执行这条 SQL,返回每个节点的实际耗时和实际行数。把预估成本和实际耗时放一起对比,就能看出优化器的估算偏差有多大。

注意ANALYZE会真实执行 SQL。排查写操作(INSERT/UPDATE/DELETE)时,记得包在事务里回滚:

BEGIN;EXPLAINANALYZEDELETEFROMhourly_obs_202607WHEREdata_key=1;ROLLBACK;

2. BUFFERS

显示查询过程中的缓存和磁盘 I/O(需要和 ANALYZE 一起用)。

  • shared hit:数据在共享内存里命中,没走磁盘。
  • shared read:内存没命中,从磁盘读。
  • temp written:内存不够用,数据写到磁盘临时文件。

3. FORMAT

指定输出格式。默认TEXT,人类可读的树状文本。也支持JSONXMLYAML,方便导到可视化工具里。


二、核心节点

执行计划是一棵节点树。下面几个节点最常见,搞清楚它们,慢查询定位就快很多。

1. 表扫描

Seq Scan(全表顺序扫描)
从头到尾读整张表。小表没问题,大表只查少量数据的话,说明少索引或统计信息过期。

Index Scan(索引扫描)
先查索引找到 TID,再回表读完整行。查询条件区分度高、返回行数少(比如不到 1%)的时候合适。返回行数多了,大量随机 I/O 回表会让性能急剧下降。

Index Only Scan(仅索引扫描)
查询需要的字段全在索引里,不用回表。最理想的扫描方式——覆盖索引能省掉大量磁盘 I/O。

Bitmap Heap Scan(位图堆扫描)
先扫索引,把匹配行的 TID 放进内存位图,再按位图顺序读堆表。比普通 Index Scan 强的地方:把随机 I/O 变成了顺序 I/O。适合中等数据量的范围查询。

2. 关联连接

Nested Loop(嵌套循环)
外层表扫 N 行,内层表每行查一次。小表驱动大表的时候很快。外层表大、内层表没索引的话——成本指数级爆炸。

Hash Join(哈希连接)
扫小表在内存建哈希表,然后扫大表做 O(1) 匹配。大表连大表、等值连接没索引的时候最好用。但如果小表太大,超出work_mem,哈希表会溢出到磁盘,性能就崩了。

Merge Join(归并连接)
两张表都要先按关联字段排好序,然后像拉链一样同步推进匹配。大表等值连接、关联字段上都有索引的时候好用。如果Merge Join下面挂着两个Sort节点——说明数据本来无序,排序开销可能很大。


三、三个常见慢查询问题

1. Hash Join 内存溢出

大表 JOIN 耗时 30 秒,计划里长这样:

Hash Join (actual time=2500.123..28500.456 rows=500000 loops=1) -> Hash (actual time=2400.000..2400.000 rows=2000000 loops=1) Buckets: 1048576 Batches: 32 Memory Usage: 65536kB

Hash节点下的Batches: 32。正常情况哈希表在内存里建完,Batches 是 1。超过 1 就说明表太大超了work_mem,数据库把哈希表切片写到磁盘上了。内存 O(1) 查找变成磁盘 I/O,速度差好几个数量级。

怎么修:

  • 临时:当前会话调大work_memSET work_mem = '256MB';
  • 长期:关联字段加索引,让优化器走 Merge Join 或 Nested Loop;或者做大表分区。

2. Merge Join 带双排序

查询耗时 15 秒,Merge Join 下面挂着两个 Sort:

Merge Join (actual time=1200.456..14500.123 rows=100000 loops=1) -> Sort (actual time=500.123..600.456 rows=1000000 loops=1) Sort Method: external merge Disk: 85400kB

Merge Join 要求两边数据有序。没索引,优化器只能强加 Sort。而且Sort Method: external merge Disk说明排序数据也超了work_mem——两次排序加一次归并全在走磁盘。

怎么修:

  • 关联字段加索引,数据天然有序,两个 Sort 直接消失。
  • 加不了索引的话,调大work_mem让排序在内存完成。

3. Index Scan 变成随机 I/O 制造机

查询走了索引,但还是耗时 8 秒:

Index Scan using idx_orders_status on orders t (actual time=0.045..7800.123 rows=500000 loops=1) Buffers: shared hit=15000, shared read=450000

shared read=450000,非常高。匹配数据占了表的大部分——数据库在索引树里找到 50 万个 TID,然后挨个回表。堆表物理排列不按这个字段来,50 万次回表变成疯狂的随机 I/O。走索引比全表扫描还慢。

怎么修:

  • 建覆盖索引(INCLUDE查询字段),避免回表,计划会变成 Index Only Scan。
  • 如果必须回表且返回比例高,SET enable_indexscan = off;强制走 Bitmap 或 Seq Scan,随机 I/O 转顺序 I/O。

四、排查顺序

遇到慢 SQL,按这个来:

  1. 看 Buffers:有没有大量shared readtemp written——找到 I/O 瓶颈在哪。
  2. 看大表扫描:大表走了 Seq Scan?Index Scan 的 loops 或回表量是不是太高?
  3. 看 Join 节点:Hash Join 的 Batches 是不是大于 1?Merge Join 是不是带了 Sort?

这套方法能让你在几秒内定位到拖后腿的节点。

http://www.jsqmd.com/news/1251553/

相关文章:

  • AI生成3D模型在建筑施工中的应用与挑战
  • 知识城局改装修公司哪家好:派福装饰焕新大师 - MXyuyu
  • 2026 年靖西可靠的农村自建房钢网公司有哪些,自建房防盗,别再花冤枉钱了! - 行业甄选官
  • 智慧建筑裂缝检测数据集与labelme标注技术解析
  • 大厂面试官追问海外课程难点?留学生用高分攻坚经历证明学习能力「蒸汽求职分享」
  • 欧米茄杭州网点地址及售后热线电话2026年7月最新客户信息公示 - 欧米茄官方服务中心
  • 2026年Costco验厂咨询公司排行榜,你知道几家? - 品牌排行榜
  • TVP5151超低功耗模拟视频解码器:原理、配置与硬件设计实战
  • OPPO、vivo、荣耀号码认证:多终端拨测矩阵与异常复现
  • 2026哈尔滨保温卷帘门/欧式卷帘门厂家选购指南:4个常见坑+5条硬标准,源头厂家哪家强? - mobible
  • 无锡半导体展哪家好?适配采购需求,2026无锡半导体展展会推荐 - 品牌深度评测
  • TVP5146M2视频解码芯片:从模拟信号到数字流的完整解析与实战
  • TAS2521音频编解码器I2C寄存器配置详解与实战调试指南
  • 微软PazaBench第二版:非洲语言语音识别基准测试平台详解
  • GLM-5.1混合专家架构解析与工程实践
  • 亨得利武汉售后电话 手表维修保养服务权威公示(2026年7月最新) - 亨得利官方
  • 语义化主题 Token:品牌色、深浅色与组件一致性
  • 2026年GRS认证是什么,你了解吗? - 品牌排行榜
  • 深入解析MSP432E4 Bootloader:从原理到实战的固件更新指南
  • C语言网络编程2026:高性能服务器与协议栈开发实战
  • AI公司为何抢购旧书?高质量数据如何解决AI幻觉与模型退化
  • AI Agent落地困境与数据底座建设实践
  • 2026年Disney验厂服务公司哪家性价比高?看这篇就够了! - 品牌排行榜
  • AI短剧创作全流程:从剧本到视频的自动化生成
  • 宁波本地防水补漏精选TOP5推荐:正规漏水检测维修公司上门师傅推荐:厕所/棚顶/屋面/飘窗/阳台/地下室/厨房渗漏水精准测漏维修(2026最新) - 即刻修防水
  • 2026黑龙江软质快速卷帘门/工业卷帘门哪家好?本地优质厂家选购指南:4个常见坑与5条硬标准 - mobible
  • ChatGPT邮件日历插件实战:从权限配置到批量处理技巧
  • 基于Transformer的智能人才匹配引擎架构与实践
  • 帝舵2026年7月最新地址公布:宁波客户售后服务中心热线 - 帝舵中国官方服务中心
  • 2026还在用的去水印工具:在线免费去水印软件哪个好用 - 免费软件工具方法教程