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

PostgreSQL 中 VACUUM FULL 对索引的影响

PostgreSQL 中 VACUUM FULL 对索引的影响

是的,VACUUM FULL 会重建表上的所有索引。这是它与普通 VACUUM 命令的一个重要区别。

一、VACUUM FULL 的工作原理

  1. 表重建过程

    • 创建表的全新副本
    • 只将有效数据写入新存储
    • 删除原始表文件
    • 将新文件重命名为原表名
  2. 索引处理

    • 在表数据完全重写后
    • 所有索引会被完全重建
    • 索引统计信息也会更新

二、与普通 VACUUM 的对比

特性VACUUMVACUUM FULL
是否锁表不锁表(并发允许)排他锁(阻塞操作)
空间回收不返还给操作系统空间返还操作系统
索引处理不重建索引完全重建所有索引
执行速度慢(尤其大表)
对系统影响

三、索引重建的影响

  1. 积极影响

    • 消除索引膨胀
    • 提高索引扫描效率
    • 更新索引统计信息
    • 优化索引结构(减少碎片)
  2. 负面影响

    • 重建期间消耗大量CPU/IO资源
    • 对大表可能导致长时间不可用
    • 需要额外的临时空间(约原表大小)

四、使用建议

  1. 适用场景

    -- 表有大量更新/删除操作后
    -- 索引明显膨胀(用pg_stat_all_indexes查看)
    -- 准备进行重要性能敏感操作前
    
  2. 替代方案

    -- 常规维护使用普通VACUUM
    VACUUM ANALYZE table_name;-- 使用CREATE TABLE...AS重建(更灵活)
    BEGIN;
    CREATE TABLE new_table AS SELECT * FROM old_table;
    DROP TABLE old_table;
    ALTER TABLE new_table RENAME TO old_table;
    -- 重建约束和索引...
    COMMIT;
    
  3. 监控方法

    -- 检查索引膨胀情况
    SELECT schemaname || '.' || relname AS table,indexrelname AS index,pg_size_pretty(pg_relation_size(indexrelid)) AS index_size,idx_scan AS index_scans
    FROM pg_stat_user_indexes
    ORDER BY pg_relation_size(indexrelid) DESC;
    

五、注意事项

  1. 生产环境慎用

    • 在低峰期执行
    • 考虑使用pg_repack扩展(在线重组)
  2. 空间需求

    -- 确保有足够空间(约原表+索引大小的2倍)
    SELECT pg_size_pretty(pg_total_relation_size('table_name'));
    
  3. 后续操作

    -- 重建后更新统计信息
    ANALYZE table_name;-- 检查重建效果
    SELECT n_dead_tup FROM pg_stat_user_tables WHERE relname = 'table_name';
    

VACUUM FULL 是强大的维护工具,但因其重建索引和锁表的特性,应在充分了解影响后谨慎使用。对于关键业务表,建议优先考虑 pg_repack 等在线重组工具。

http://www.xdnf.cn/news/3199.html

相关文章:

  • 【TUST“码蹄杯”编程之星】4.30 每日一题
  • 抓取工具Charles配置教程(mac电脑+ios手机)
  • 算法四 习题 1.3
  • Vue 项目中运行 `npm run dev` 时发生的过程
  • 代码随想录算法训练营Day39
  • 数据科学与计算
  • Ecology中拦截jquery.ajax请求接口后的数据
  • 【Linux更新openSSH服务】
  • GNU gettext 快速上手
  • 论文公式根据章节自动编号教程
  • DeepSeek-Prover-V2-671B 简介、下载、体验、微调、数据集:专为数学定理自动证明设计的超大垂直领域语言模型(在线体验地址)
  • 涨薪技术|0到1学会性能测试第42课-apache监控与调优
  • 应对过度处方挑战:为药物推荐任务微调大语言模型(Xiangnan He)
  • K8S - HPA + 探针实战 - 实现弹性扩缩与自愈
  • 详解 MyBatis-Plus 框架中 QueryWrapper 类
  • Compose笔记(二十一)--AnimationVisibility
  • 学习笔记——《Java面向对象程序设计》-常用实用类
  • Python爬虫(11)Python数据存储实战:深入解析NoSQL数据库的核心应用与实战
  • OpenCV实战教程:从零开始的计算机视觉之旅
  • 鸿蒙NEXT开发动画(方块动画旋转)
  • ESP32开发-作为TCP服务端接收数据
  • 配置和使用基本存储
  • 大型连锁酒店集团数据湖应用示例
  • 关于vue+iview中tabs嵌套及实际应用
  • 如何在uni-app中自定义输入框placeholder的样式
  • 2025年“深圳杯”数学建模挑战赛D题-法医物证多人身份鉴定问题
  • TCP和UDP的数据传输+区别
  • JavaScript的3D库有哪些?
  • 第六章 QT基础:9、Qt中数据库的操作
  • 自主采集高质量三维重建数据集指南:面向3DGS与NeRF的图像与视频拍摄技巧【2025最新版!!】