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

PostgreSQL 的 REINDEX 命令

PostgreSQL 的 REINDEX 命令

REINDEX 是 PostgreSQL 中用于重建索引的重要命令,它可以解决索引损坏、索引膨胀或性能下降等问题。

一 REINDEX 基本语法

-- 重建单个索引
REINDEX [ ( option [, ...] ) ] { INDEX | TABLE | SCHEMA } [ CONCURRENTLY ] name
REINDEX [ ( option [, ...] ) ] { DATABASE | SYSTEM } [ CONCURRENTLY ] [ name ]where option can be one of:CONCURRENTLY [ boolean ]TABLESPACE new_tablespaceVERBOSE [ boolean ]-- 示例
REINDEX INDEX 索引名;
REINDEX TABLE 表名;
REINDEX SCHEMA schema;
REINDEX DATABASE 数据库名;
REINDEX SYSTEM mydb;  -- 只重建系统目录索引

二 REINDEX 的主要用途

  1. 修复损坏的索引:在硬件故障或软件错误后
  2. 解决索引膨胀:当索引因大量更新/删除而效率低下时
  3. 更改存储参数后:如修改fillfactor后需要重建生效
  4. 升级PostgreSQL后:某些版本升级建议重建索引

三 REINDEX 的工作方式

  1. 创建索引的新副本
  2. 替换旧索引(原子操作)
  3. 删除旧索引
  4. 与VACUUM FULL不同,REINDEX不会影响表数据

四 REINDEX 与 CONCURRENTLY 选项

PostgreSQL 12+ 支持并发重建索引:

-- 不阻塞读写操作
REINDEX INDEX CONCURRENTLY 索引名;-- 特点:
-- 1. 需要更多时间和资源
-- 2. 可能失败(需手动清理失败的状态)
-- 3. 不会阻止表的DML操作

五 REINDEX 的替代方案

  1. DROP + CREATE INDEX

    -- 传统方法
    DROP INDEX idx_name;
    CREATE INDEX idx_name ON table_name(column);-- 并发版本
    CREATE INDEX CONCURRENTLY idx_new ON table_name(column);
    DROP INDEX idx_old;
    ALTER INDEX idx_new RENAME TO idx_old;
    
  2. 使用 pg_repack

    pg_repack -d dbname --only-indexes -t table_name
    

输出示例:

[pg16@test base]$ pg_repack -d white --only-indexes -t yewu1.t1
INFO: repacking indexes of "yewu1.t1"
INFO: repacking index "yewu1.idx_t1"
INFO: repacking index "yewu1.idx_t1_2"

六 REINDEX 的最佳实践

  1. 维护窗口执行:普通REINDEX会锁表
  2. 对大表使用CONCURRENTLY:减少业务影响
  3. 监控进度
    SELECT * FROM pg_stat_progress_create_index;
    
  4. 重建后分析
    ANALYZE table_name;
    

七 REINDEX 的注意事项

  1. 锁问题

    • 普通REINDEX获取排他锁
    • CONCURRENTLY模式使用ShareUpdateExclusiveLock
  2. 空间需求

    • 需要额外空间存储新旧两个索引
  3. 系统目录索引

    • 重建系统目录索引需要特殊权限
  4. 复制环境

    • 在主库执行REINDEX会生成大量WAL

更多详细信息请查看官方文档:

https://www.postgresql.org/docs/16/sql-reindex.html

REINDEX 是 PostgreSQL 数据库维护的重要工具,合理使用可以显著提升查询性能并解决索引相关问题。

谨记:心存敬畏,行有所止。

相关文章:

  • LeetCode 2071 你可以安排的最多任务数目 题解(附带自己的错误做题思路 过了25/49)
  • 个人健康中枢的多元化AI网络革新与精准健康路径探析
  • 【数据结构】励志大厂版·初阶(复习+刷题)排序
  • linux 使用nginx部署ssl证书,将http升级为https
  • CF1000E We Need More Bosses
  • 什么是DGI数据治理框架?
  • 【Python】一直没搞懂生成器是什么。。
  • Fine Structure-Aware Sampling(AAAI 2024)论文笔记和启发
  • Milvus(13):自定义分析器、过滤器
  • Prompt compress 技术探究-LLMLingua
  • 【Linux】深入理解程序地址空间
  • WPF中Behaviors
  • [特殊字符] 人工智能大模型之开源大语言模型汇总(国内外开源项目模型汇总) [特殊字符]
  • leetcode 59. 螺旋矩阵 II
  • 大连理工大学选修——图形学:第二章 计算机图形硬件及绘图系统
  • Git推送大文件导致提交回退的完整解决记录
  • 短信侠 - 自建手机短信转发到电脑上并无感识别复制验证码,和找手机输验证码说再见!
  • LLM论文笔记 28: Universal length generalization with Turing Programs
  • 365打卡第R6周: LSTM实现糖尿病探索与预测
  • idea结合CopilotChat进行样式调整实践
  • 印度扩大对巴措施:封锁巴基斯坦名人账号、热门影像平台
  • 我的诗歌阅读史
  • 5名中国公民在美国交通事故中遇难
  • 乘客被困停滞车厢超4小时,哈尔滨铁路局客服:列车晚点,表示歉意
  • 亚马逊一季度利润增超六成:云业务增速放缓,警告关税政策或影响业绩指引
  • 王受文已任中华全国工商业联合会领导班子成员