讲师中心 微信公众号
AI工具推荐 视频效率加速

为什么Navicat中PG的`VACUUM`后查询会变快?

星静姑娘_9894

星静姑娘_9894

发布时间:2026-06-29 09:03:24

|

368人浏览过

|

来源于php中文网

原创

VACUUM后查询变快是因为清除了死元组,减少扫描时的无效行过滤开销;它不缩减表大小,但提升I/O效率、支持索引仅扫描、优化后续插入,并需配合ANALYZE更新统计信息。

为什么 VACUUM 后查询变快?不是“删数据”而是“清障碍”

因为 vacuum 并不直接让查询逻辑变短,而是移除了查询执行时必须绕开或跳过的“死元组”(dead tuples)。postgresql 的 mvcc 要求查询扫描页面时逐行检查可见性——哪怕某行已被 update 或 delete 标记为无效,它仍物理存在、仍占页空间、仍被扫描器读取。死元组越多,一次 select 扫描的无效行就越多,i/o 和 cpu 开销自然上升。

常见错误现象:表大小没变小,但 EXPLAIN ANALYZE 显示 Seq Scan 的 rows removed by filter 高得异常;或者 pg_stat_all_tables.n_dead_tup 持续 > 10% n_live_tup。

  • VACUUM 清理后,页面内有效行更紧凑,相同 I/O 可读更多活数据
  • 更新了可见性映射(VM),使仅索引扫描(Index Only Scan)能真正跳过堆页访问
  • 更新了 FSM(Free Space Map),后续 INSERT 更可能复用本地空闲空间,减少页面分裂和随机写

Navicat 里点一下“VACUUM”到底执行了什么?

Navicat 对 PostgreSQL 表右键 → “Maintenance” → “Vacuum”,默认发出的是不含参数的 VACUUM 命令,等价于:

VACUUM table_name;

它不会锁表(只加 ShareUpdateExclusiveLock,允许并发读写),但会做三件事:

  • 扫描全表,识别所有对当前及历史事务均不可见的死元组
  • 清理对应索引项(如 index_page 中指向已删 TID 的条目)
  • 更新 pg_class.relpages、reltuples 和 pg_stat_all_tables 统计值

注意:Navicat 不会自动触发 ANALYZE,除非你勾选 “Analyze table” 选项——而统计信息不准正是很多查询计划退化(比如该走索引却走全表)的根源。

navicatmysql
navicatmysql

Navicat For MySQL

下载

为什么有时候 VACUUM 了也没变快?

典型原因不是命令没跑,而是清理不彻底或治标不治本:

  • 表刚被大量 UPDATE,但 n_dead_tup 还没达到 autovacuum 触发阈值(默认 50 + 0.2 × n_live_tup),手动 VACUUM 能见效;但若持续高频更新,必须调低 autovacuum_vacuum_scale_factor
  • 用了 VACUUM FULL(Navicat 里叫 “Vacuum Full”)——它重写整个表、释放空间给操作系统,但会锁表、耗时长、需要双倍磁盘空间,且对查询加速无额外帮助,反而可能因重建索引引入短暂延迟
  • 死元组集中在某些热页,而 VACUUM 又受限于 maintenance_work_mem,导致部分页未被处理(日志里出现 skipping page due to high cost)
  • 查询本身依赖过期统计信息,而你只跑了 VACUUM 没跑 ANALYZE,规划器仍按旧分布选错执行计划

真正要盯住的两个监控指标

别只看 Navicat 的“执行成功”,重点查这两个字段:

SELECT relname, n_dead_tup, n_live_tup,
       round(n_dead_tup * 100.0 / NULLIF(n_dead_tup + n_live_tup, 0), 2) AS dead_pct
FROM pg_stat_user_tables
WHERE n_dead_tup > 1000
ORDER BY dead_pct DESC LIMIT 5;

如果 dead_pct > 10%,说明表已明显“亚健康”;若长期 > 30%,大概率已有性能毛刺。另一个关键点是 last_autovacuum 时间——如果它比 last_analyze 早很多,说明 autovacuum 在清理,但 analyze 没跟上,得检查 autovacuum_analyze_* 参数是否被压得太低。

复杂点在于:vacuum 效果不是线性的。一次清理可能只让查询快 5%,但连续三次未清理,可能让某次查询从 50ms 涨到 800ms——因为死元组堆积引发缓冲区竞争、预读失效、索引膨胀连锁反应。这个临界点很难提前预警,只能靠定期盯指标。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

更多
postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

233

2023.10.10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4569

2023.11.02

postgresql常用命令有哪些
postgresql常用命令有哪些

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。更详细的postgresql常用命令,大家可以访问下面的文章。

647

2023.11.16

postgresql常用命令介绍
postgresql常用命令介绍

postgresql常用命令有l、d、d5、di、ds、dv、df、dn、db、dg、dp、c、pset、show search_path、ALTER TABLE、INSERT INTO、UPDATE、DELETE FROM、SELECT等。想了解更多postgresql的相关内容,可以阅读本专题下面的文章。

1396

2023.11.20

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

480

2026.02.12

PostgreSQL 性能优化与查询执行计划实战
PostgreSQL 性能优化与查询执行计划实战

本专题深入解析PostgreSQL性能优化核心,聚焦查询执行计划的实战应用。通过EXPLAIN命令精准定位瓶颈,结合索引策略、SQL改写与参数调优,系统提升查询效率。从执行计划解读到性能调优全流程,助你掌握数据库性能诊断与优化实战能力。

150

2026.05.08

PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践
PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践

本文详解如何利用Next.js(搭配Drizzle ORM)与Go后端构建高性能应用,充分发挥PG在JSONB非结构化存储与pgvector向量检索上的优势。从数据建模到Docker容器化部署,打造支持AI时代的“One Database”工程化解决方案。

901

2026.05.08

PostgreSQL高级特性、内核机制与现代数据架构
PostgreSQL高级特性、内核机制与现代数据架构

本专题从MVCC并发控制与WAL日志等内核机制出发,详解JSONB、PostGIS及pgvector等高级特性。探讨如何利用单一引擎支撑关系型、向量及图数据等现代数据架构需求,助您掌握构建高并发、智能化应用的核心技术。

244

2026.05.08

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn