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

PG数据库如何检查膨胀的表和索引

一 检查表膨胀
select

 to_char(now(),'yyyy-mm-dd hh24:mi:ss') "time",current_database() current_database ,relname as "table_name(表名)",schemaname as "schema_name(模式名)",pg_size_pretty(pg_relation_size('"'||schemaname|| '"."'||relname||'"')) as "table_size(表大小)",n_dead_tup as "n_dead_tup(无效记录数)",n_live_tup as "n_live_tup(有效记录数)",to_char(round(n_dead_tup*1.0/(n_live_tup+n_dead_tup)*100,2),'fm990.00') as "dead_rate(无效记录比例%)"

from

pg_stat_all_tables

where n_live_tup+n_dead_tup <> 0 ;
image
正常不存在表膨胀,因为有自动清理垃圾的进程。

异常处理,对膨胀表做vacuum analyze操作。

二 检查索引膨胀
select to_char(now(),'yyyy-mm-dd hh24:mi:ss') "time", current_database() AS db, schemaname, tablename,bs, reltuples::bigint AS tups, relpages::bigint AS pages, otta, ROUND(CASE WHEN otta=0 OR sml.relpages=0 OR sml.relpages=otta THEN 0.0 ELSE sml.relpages/otta::numeric END,1) AS tbloat, CASE WHEN relpages < otta THEN 0 ELSE relpages::bigint - otta END AS wastedpages, CASE WHEN relpages < otta THEN 0 ELSE bs(sml.relpages-otta)::bigint END AS wastedbytes, CASE WHEN relpages < otta THEN $$0 bytes$$::text ELSE (bs(relpages-otta))::bigint || $$ bytes$$ END AS wastedsize, iname, ituples::bigint AS itups, ipages::bigint AS ipages, iotta, ROUND(CASE WHEN iotta=0 OR ipages=0 OR ipages=iotta THEN 0.0 ELSE ipages/iotta::numeric END,1) AS ibloat, CASE WHEN ipages < iotta THEN 0 ELSE ipages::bigint - iotta END AS wastedipages, CASE WHEN ipages < iotta THEN 0 ELSE bs(ipages-iotta) END AS wastedibytes, CASE WHEN ipages < iotta THEN $$0 bytes$$ ELSE (bs(ipages-iotta))::bigint || $$ bytes$$ END AS wastedisize, CASE WHEN relpages < otta THEN CASE WHEN ipages < iotta THEN 0 ELSE bs(ipages-iotta::bigint) END ELSE CASE WHEN ipages < iotta THEN bs(relpages-otta::bigint) ELSE bs(relpages-otta::bigint + ipages-iotta::bigint) END END AS totalwastedbytesFROM ( SELECT nn.nspname AS schemaname, cc.relname AS tablename, COALESCE(cc.reltuples,0) AS reltuples, COALESCE(cc.relpages,0) AS relpages, COALESCE(bs,0) AS bs, COALESCE(CEIL((cc.reltuples((datahdr+ma- (CASE WHEN datahdr%ma=0 THEN ma ELSE datahdr%ma END))+nullhdr2+4))/(bs-20::float)),0) AS otta, COALESCE(c2.relname,$$?$$) AS iname, COALESCE(c2.reltuples,0) AS ituples, COALESCE(c2.relpages,0) AS ipages, COALESCE(CEIL((c2.reltuples(datahdr-12))/(bs-20::float)),0) AS iotta -- very rough approximation, assumes all cols FROM pg_class cc JOIN pg_namespace nn ON cc.relnamespace = nn.oid AND nn.nspname <> $$information_schema$$ LEFT JOIN ( SELECT ma,bs,foo.nspname,foo.relname, (datawidth+(hdr+ma-(case when hdr%ma=0 THEN ma ELSE hdr%ma END)))::numeric AS datahdr, (maxfracsum(nullhdr+ma-(case when nullhdr%ma=0 THEN ma ELSE nullhdr%ma END))) AS nullhdr2 FROM ( SELECT ns.nspname, tbl.relname, hdr, ma, bs, SUM((1-coalesce(null_frac,0))coalesce(avg_width, 2048)) AS datawidth, MAX(coalesce(null_frac,0)) AS maxfracsum, hdr+( SELECT 1+count()/8 FROM pg_stats s2 WHERE null_frac<>0 AND s2.schemaname = ns.nspname AND s2.tablename = tbl.relname ) AS nullhdr FROM pg_attribute att JOIN pg_class tbl ON att.attrelid = tbl.oid JOIN pg_namespace ns ON ns.oid = tbl.relnamespace LEFT JOIN pg_stats s ON s.schemaname=ns.nspname AND s.tablename = tbl.relname AND s.inherited=false AND s.attname=att.attname, ( SELECT (SELECT current_setting($$block_size$$)::numeric) AS bs, CASE WHEN SUBSTRING(SPLIT_PART(v, $$ $$, 2) FROM $$#"[0-9]+.[0-9]+#"%$$ for $$#$$) IN ($$8.0$$,$$8.1$$,$$8.2$$) THEN 27 ELSE 23 END AS hdr, CASE WHEN v ~ $$mingw32$$ OR v ~ $$64-bit$$ THEN 8 ELSE 4 END AS ma FROM (SELECT version() AS v) AS foo ) AS constants WHERE att.attnum > 0 AND tbl.relkind=$$r$$ GROUP BY 1,2,3,4,5 ) AS foo ) AS rs ON cc.relname = rs.relname AND nn.nspname = rs.nspname LEFT JOIN pg_index i ON indrelid = cc.oid LEFT JOIN pg_class c2 ON c2.oid = i.indexrelid) AS sml ;

索引膨胀依赖于统计信息。统计信息未更新,索引膨胀信息不准确。一般每年统一做一次重建索引即可。

异常处理,重建索引。

reindex index 索引名 ;

三 使用插件pg_repack解决PG数据库表和索引膨胀问题
请参考链接:https://vip.kingdee.com/article/436533799976162048

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

相关文章:

  • 计算机毕业设计之基于SSM的民宿管理系统
  • 代驾APP开发需要哪些功能?同城代驾系统源码给你标准答案
  • 2026年福州视频服务推荐榜单:短视频拍摄/视频代运营/企业宣传片,专业团队助力高效获客与品牌传播 - 品牌企业推荐师(官方)
  • 导师严选! 降AI率网站 千笔AI VS WPS AI,专科生专属神器!
  • 2026年阿里企业邮箱开通电话是多少?快速联系官方客服指南 - 品牌2025
  • 【技巧】:下载安装包的依赖包
  • 救命神器!AI论文平台 千笔ai写作 VS 文途AI,专为本科生打造!
  • 蕲春艾草合作企业 - 中媒介
  • Claude Opus 4.6 真的用不起了!我换成了国产 M2.5,实测真香!!
  • 2026年最新企业微信怎么开通?企业注册与认证完整指南 - 品牌2025
  • 神蕲艾谷基地升级 - 中媒介
  • 2026年 AI智搜GEO推广优化排名服务商推荐榜单:福州/莆田/三明地区专业AI搜索与GEO营销解决方案深度解析 - 品牌企业推荐师(官方)
  • 如何解决PG数据库告警日志占用空间过大
  • PG数据库如何检查top事务
  • 中艾农业的创始人是谁? - 中媒介
  • 2026户外庭院遮阳伞怎么选?五大户外家具品牌实力解析,遮阳伞与配套方案全攻略 - 深度智识库
  • Solution - P1903 【模板】带修莫队 / [国家集训队] 数颜色 / 维护队列
  • 倪海厦
  • 湖北中艾农业集团是做什么的? - 中媒介
  • 世纪联华购物卡回收时需要注意哪些问题呢? - 京回收小程序
  • 2026 Q1临沂财税公司 TOP5 推荐(九县三区精准覆盖)代理记账・工商注册口碑榜单 - 品牌智鉴榜
  • 监测并记录linux的进程jvm内存和gc信息的脚本
  • 农家散养鸡烧鸡 - 中媒介
  • 2月必看!市场口碑好的LED草坪灯品牌推荐,照亮你的草坪,工矿灯安装/老式工矿灯/不锈钢防水壁灯,草坪灯生产厂家推荐 - 品牌推荐师
  • 2026年企业必看!阿里企业邮箱授权销售中心电话与服务详解 - 品牌2025
  • 探讨婚纱摄影选购,上海三川摄影费用贵吗? - mypinpai
  • 东美阿胶批发代理 - 中媒介
  • 企业必看2026年企微服务热线指南:人工客服接通技巧 - 品牌2025
  • 2026年旗杆厂家实力推荐:沈阳福道金属制品有限责任公司,锥形/电动/不锈钢旗杆等全系供应 - 品牌推荐官
  • openclaw配置浏览器功能报token校验失败