HGDB索引膨胀的检查与处理思路
文章目录环境文档用途详细信息环境系统平台Linux x86-64 Red Hat Enterprise Linux 7版本4.5.8文档用途本文档主要介绍HGDB索引膨胀的定义、产生的原因、如何检查以及遇到索引膨胀如何处理包括预防和解决详细信息索引膨胀的定义假设对一个索引进行顺序的数据插入那么索引分裂应该只会发生在最右边的叶子结点若对索引进行无序的插入那么中间的叶子结点会进行了分裂多出了很多空闲空间索引扫描的时候需要扫描更多的页造成了io和存储空间上的浪费产生膨胀索引的原因1、表中的每个行版本“元组”都有一个未死亡的索引条目。当 VACUUM 删除死元组时它还必须删除相应的索引条目这会在索引页中创建空白空间。此类空间可以重复使用但如果没有新条目添加到页面则该空间仍为空2、频繁更新相同的行在VACUUM清理老元组前表和索引会维护相同行的很多版本。若索引页填满HGDB会将索引页分裂成2个在VACUUM执行完清理之后最终会得到2个臃肿的页面而不是1个索引膨胀的检查提前安装好pgstattuple插件用于返回一个关系的物理长度、死亡元组的百分比以及其他信息create extension pgstattuple;如下查询用于查看free_space占用前5的索引空闲空间越大说明索引使用率越低select oid::regclass,(pgstattuple(oid)).* from pg_class where relkind‘i’ order by free_space desc limit 5 offset 0;如下查询查看具体表中的各个索引大小selectrelname,pg_relation_size(oid)/1024||KASsizefrompg_classwhererelkindiandrelnamestu_dex;除了扩展也可以通过如下的sql查看索引膨胀的相关信息膨胀大小、膨胀率等便于对膨胀的索引做优化SELECTcurrent_database(),nspnameASschemaname,tblname,idxname,bs*(relpages)::bigintASreal_size,bs*(relpages-est_pages)::bigintASextra_size,100*(relpages-est_pages)::float/relpagesASextra_pct,fillfactor,CASEWHENrelpagesest_pages_ffTHENbs*(relpages-est_pages_ff)ELSE0ENDASbloat_size,100*(relpages-est_pages_ff)::float/relpagesASbloat_pct,FROM(SELECTcoalesce(1ceil(reltuples/floor((bs-pageopqdata-pagehdr)/(4nulldatahdrwidth)::float)),0-- ItemIdData size computed avg size of a tuple (nulldatahdrwidth))ASest_pages,coalesce(1ceil(reltuples/floor((bs-pageopqdata-pagehdr)*fillfactor/(100*(4nulldatahdrwidth)::float))),0)ASest_pages_ff,bs,nspname,tblname,idxname,relpages,fillfactor,is_na-- , pgstatindex(idxoid) AS pst, index_tuple_hdr_bm, maxalign, pagehdr, nulldatawidth, nulldatahdrwidth, reltuples -- (DEBUG INFO)FROM(SELECTmaxalign,bs,nspname,tblname,idxname,reltuples,relpages,idxoid,fillfactor,(index_tuple_hdr_bmmaxalign-CASE-- Add padding to the index tuple header to align on MAXALIGNWHENindex_tuple_hdr_bm%maxalign0THENmaxalignELSEindex_tuple_hdr_bm%maxalignENDnulldatawidthmaxalign-CASE-- Add padding to the data to align on MAXALIGNWHENnulldatawidth0THEN0WHENnulldatawidth::integer%maxalign0THENmaxalignELSEnulldatawidth::integer%maxalignEND)::numericASnulldatahdrwidth,pagehdr,pageopqdata,is_na-- , index_tuple_hdr_bm, nulldatawidth -- (DEBUG INFO)FROM(SELECTn.nspname,i.tblname,i.idxname,i.reltuples,i.relpages,i.idxoid,i.fillfactor,current_setting(block_size)::numericASbs,CASE-- MAXALIGN: 4 on 32bits, 8 on 64bits (and mingw32 ?)WHENversion()~mingw32ORversion()~64-bit|x86_64|ppc64|ia64|amd64THEN8ELSE4ENDASmaxalign,/* per page header, fixed size: 20 for 7.X, 24 for others */24ASpagehdr,/* per page btree opaque data */16ASpageopqdata,/* per tuple header: add IndexAttributeBitMapData if some cols are null-able */CASEWHENmax(coalesce(s.null_frac,0))0THEN8-- IndexTupleData sizeELSE8((328-1)/8)-- IndexTupleData size IndexAttributeBitMapData size ( max num filed per index 8 - 1 /8)ENDASindex_tuple_hdr_bm,/* data len: we remove null values save space using it fractionnal part from stats */sum((1-coalesce(s.null_frac,0))*coalesce(s.avg_width,1024))ASnulldatawidth,max(CASEWHENi.atttypidpg_catalog.name::regtypeTHEN1ELSE0END)0ASis_naFROM(SELECTct.relnameAStblname,ct.relnamespace,ic.idxname,ic.attpos,ic.indkey,ic.indkey[ic.attpos],ic.reltuples,ic.relpages,ic.tbloid,ic.idxoid,ic.fillfactor,coalesce(a1.attnum,a2.attnum)ASattnum,coalesce(a1.attname,a2.attname)ASattname,coalesce(a1.atttypid,a2.atttypid)ASatttypid,CASEWHENa1.attnumISNULLTHENic.idxnameELSEct.relnameENDASattrelnameFROM(SELECTidxname,reltuples,relpages,tbloid,idxoid,fillfactor,indkey,pg_catalog.generate_series(1,indnatts)ASattposFROM(SELECTci.relnameASidxname,ci.reltuples,ci.relpages,i.indrelidAStbloid,i.indexrelidASidxoid,coalesce(substring(array_to_string(ci.reloptions, )fromfillfactor([0-9]))::smallint,90)ASfillfactor,i.indnatts,pg_catalog.string_to_array(pg_catalog.textin(pg_catalog.int2vectorout(i.indkey)), )::int[]ASindkeyFROMpg_catalog.pg_index iJOINpg_catalog.pg_class ciONci.oidi.indexrelidWHEREci.relam(SELECToidFROMpg_amWHEREamnamebtree)ANDci.relpages0)ASidx_data)ASicJOINpg_catalog.pg_class ctONct.oidic.tbloidLEFTJOINpg_catalog.pg_attribute a1ONic.indkey[ic.attpos]0ANDa1.attrelidic.tbloidANDa1.attnumic.indkey[ic.attpos]LEFTJOINpg_catalog.pg_attribute a2ONic.indkey[ic.attpos]0ANDa2.attrelidic.idxoidANDa2.attnumic.attpos)iJOINpg_catalog.pg_namespace nONn.oidi.relnamespaceJOINpg_catalog.pg_stats sONs.schemanamen.nspnameANDs.tablenamei.attrelnameANDs.attnamei.attnameGROUPBY1,2,3,4,5,6,7,8,9,10,11)ASrows_data_stats)ASrows_hdr_pdg_stats)ASrelation_statsORDERBYnspname,tblname,idxname;预防索引膨胀实例级vacuum命令运行的最小延迟:alter system set autovacuum_naptime15s;在一个表上触发vacuum的被插入、被更新或被删除元组的最小数量:alter system set autovacuum_vacuum_threshold25;在一个表上触发analyze的被插入、被更新或被删除元组的最小数量:alter system set autovacuum_analyze_threshold10;决定是否触发vaccum时作为一个分数将它加到autovacuum_vacuum_threshold上:alter system set autovacuum_vacuum_scale_factor0.01;决定是否触发analyze时作为一个分数将它加到autovacuum_vacuum_threshold上:alter system set autovacuum_analyze_scale_factor0.05;autovacuum触发条件:pg_stat_all_tables.n_dead_tup大于 autovacuum_vacuum_threshold pg_class.reltuples * autovacuum_vacuum_scale_factorautoananlyze触发条件:pg_stat_all_tables.n_mod_since_analyze大于 autovacuum_analyze_threshold pg_class.reltuples * autovacuum_analyze_scale_factor表级1、设置合适的autovacuum_vacuum_scale_factor大表如果频繁的有更新或删除和插入操作, 建议设置较小的autovacuum_vacuum_scale_factor来降低空间的浪费加快对表的vacuum操作频率对更新频繁的表单独调整alter table tablename set (autovacuum_vacuum_scale_factor0.05);2、设置表的fillfactor对频繁更新的表调低fillfactor参数alter table tablename set (fillfactor85);解决索引膨胀1、重建索引创建新索引 create index CONCURRENTLY new_index ;删除旧索引 drop index old_index ;或者重建索引 reindex index 索引名称 CONCURRENTLY ;analyze tablename;2、执行vacuum full完全清理这样可以恢复更多的空间但是花的时间更多并且在表上施加了排它锁

相关新闻

管理立校 质量兴校

管理立校 质量兴校

管理立校 质量兴校--邯郸市文侯中等职业学校稳步发展,成为河北省职教新标杆当前,2026年邯郸中职招生工作全面开启,邯郸市文侯中等职业学校报名现场人气爆棚,前来咨询报名的家长与学生络绎不绝。作为一所民办中职学校,自…

2026/6/27 6:34:37阅读更多 →
2026深度实测|Work模式与Composer Vibe Coding迭代对比,中文开发选型指南

2026深度实测|Work模式与Composer Vibe Coding迭代对比,中文开发选型指南

作为一个写代码喜欢边听播客边写的人,AI 编程工具的自动补全频率很关键——太频繁会打断我听播客的节奏。我长期使用口述需求驱动编码、AI自主迭代修正的vibe coding开发模式,日常高频开发Spring Boot后端CRUD接口、迭代社区论坛业务功能,对工…

2026/6/27 6:29:37阅读更多 →
一个人做产品的 100 天:从想法到上线

一个人做产品的 100 天:从想法到上线

没有团队,没有融资,一个人从零搭建起一套制造业 MES 系统。这篇文章复盘我这 100 天的真实经历——包括技术选型、踩过的坑,以及最重要的:我是怎么活下来的。 一、为什么是制造业? 2025 年初,我还是一个在…

2026/6/27 6:29:37阅读更多 →
智能合约安全审计

智能合约安全审计

智能合约安全审计:守护区块链世界的基石 随着区块链技术的快速发展,智能合约已成为去中心化应用(DApp)的核心组件。由于代码一旦部署便难以修改,任何漏洞都可能引发巨额资金损失。智能合约安全审计因此成为保障项目安…

2026/6/27 7:39:40阅读更多 →
英雄联盟回放管理神器:ROFLPlayer让你的比赛复盘更简单

英雄联盟回放管理神器:ROFLPlayer让你的比赛复盘更简单

英雄联盟回放管理神器:ROFLPlayer让你的比赛复盘更简单 【免费下载链接】ROFL-Player (No longer supported) One stop shop utility for viewing League of Legends replays! 项目地址: https://gitcode.com/gh_mirrors/ro/ROFL-Player 还在为英雄联盟回放文…

2026/6/27 7:39:40阅读更多 →
Redis 不只是缓存:数据结构与应用场景

Redis 不只是缓存:数据结构与应用场景

Redis 不只是缓存:数据结构与应用场景 提到Redis,许多人首先想到的是高性能缓存系统。Redis的真正魅力远不止于此。它支持多种数据结构,如字符串、哈希、列表、集合和有序集合,使其在分布式锁、消息队列、实时排行榜等场景中大放…

2026/6/27 7:39:40阅读更多 →
人力资源分析:员工流失预测与绩效评估模型

人力资源分析:员工流失预测与绩效评估模型

人力资源分析:员工流失预测与绩效评估模型 在竞争激烈的商业环境中,企业如何留住核心人才并提升员工绩效成为管理者的重要课题。人力资源分析通过数据驱动的方法,为企业提供科学的决策支持。员工流失预测与绩效评估模型结合机器学习与统计学…

2026/6/27 7:39:40阅读更多 →
5分钟掌握HS2-HF_Patch:Honey Select 2终极汉化去码补丁完整指南

5分钟掌握HS2-HF_Patch:Honey Select 2终极汉化去码补丁完整指南

5分钟掌握HS2-HF_Patch:Honey Select 2终极汉化去码补丁完整指南 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF_Patch是专为《Honey Select…

2026/6/27 7:39:40阅读更多 →
在线编程学习资源推荐(免费+付费)

在线编程学习资源推荐(免费+付费)

在数字化时代,编程已成为一项必备技能,无论是职业发展还是个人兴趣,学习编程都能带来巨大价值。面对海量的在线学习资源,如何选择适合自己的平台成为许多初学者的难题。本文将推荐一些优质的免费和付费在线编程学习资源&#xff0…

2026/6/27 7:34:40阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/26 11:03:22阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/27 5:46:02阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/26 9:29:01阅读更多 →
10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声&#xff1a;Retrieval-based-Voice-Conversion-WebUI完整指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrie…

2026/6/27 0:04:03阅读更多 →
Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider&#xff1a;3分钟AI智能分层&#xff0c;彻底告别手动抠图时代 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 还在为复杂的图像分层工作烦…

2026/6/27 0:04:03阅读更多 →
Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

1. 项目概述&#xff1a;为什么X-Frame-Options是Web安全的“防盗门”&#xff1f;最近在排查一个老项目的安全审计报告时&#xff0c;又被提到了“点击劫持”风险&#xff0c;矛头直指缺失的X-Frame-Options响应头。这已经不是第一次了&#xff0c;很多开发团队&#xff0c;尤…

2026/6/27 0:04:03阅读更多 →