:用 pg_relation_size + pg_size_pretty 精确测量索引占用磁盘空间)
文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载索引能显著加速查询但并非免费每一个索引都会在磁盘上占据实实在在的空间。本文基于 til 仓库 postgres/get-the-size-of-an-index.md 的实战笔记系统讲解如何用 PostgreSQL 内置管理函数pg_relation_size()查询单个索引的磁盘占用并结合pg_size_pretty()把字节数转换为人类可读的单位同时覆盖索引名的查找方法、原始字节与美化输出的差异以及同系列函数的扩展用法。读完本文你将能随时评估任意索引的存储成本在加索引提速与磁盘与写放大开销之间做出量化决策。为什么需要关心索引的磁盘占用索引的收益很直观对正确的列建立索引可以让某些查询获得巨大的性能提升。但正如 get-the-size-on-disk-of-an-index.md 所提醒的索引并不是免费的——它们会占用磁盘空间。对于绝大多数场景索引的占用可以忽略不计但至少值得心里有数而当面对超大表时索引的体积可能相当可观——实践中单个索引占用超过 1GB 磁盘的情况并不罕见。了解每个索引的实际占用有助于回答几个实际问题这张表建了那么多索引到底吃掉多少磁盘某个长期未被使用的索引是否值得保留规划磁盘容量与备份体积时索引开销是否被低估核心方法一行 SQL 查出索引大小PostgreSQL 提供了管理函数pg_relation_size()它可以返回任意 relation表、索引、物化视图等在磁盘上占用的字节数。查询时直接传入索引的名字即可。假设一张users表上建有users_pkey主键索引和users_unique_lower_email_idx唯一索引可以分别执行 select pg_size_pretty(pg_relation_size(users_pkey)); pg_size_pretty ---------------- 240 kB select pg_size_pretty(pg_relation_size(users_unique_lower_email_idx)); pg_size_pretty ---------------- 704 kB这里用pg_size_pretty()包裹了pg_relation_size()的返回值输出直接从原始字节数变成了240 kB704 kB这类直观的单位——这正是 pretty-print-data-sizes.md 中介绍的美化输出技巧与 get-the-size-of-a-table.md 中pg_relation_size()用法的组合应用。先找到索引名用 \d 查看表结构pg_relation_size()需要你提供准确的索引名。索引名并不总是像users_pkey那样容易猜到比如 Rails 默认会生成index_users_on_email这类名称。最稳妥的做法是先查看表结构\d users\d是 psql 的元命令它会展示指定表的完整信息包括所有列、约束以及该表上的全部索引及其名称。拿到确切的索引名后再执行尺寸查询即可。该用法在 get-the-size-on-disk-of-an-index.md 中有完整演示select pg_size_pretty(pg_relation_size(index_users_on_email)); pg_size_pretty ---------------- 41 MB (1 row)这个索引算是比较小的在数据量大的表上同类索引体积可能达到 1GB 以上。原始字节与人类可读pg_size_pretty 的换算逻辑pg_relation_size()本身返回的是以字节为单位的bigint。如果不做处理输出是一串难以快速感知大小的数字例如 get-the-size-of-a-table.md 中查询reservations表的结果 select pg_relation_size(reservations); pg_relation_size ------------------ 1531904而pg_size_pretty()接收一个bigint自动选出最合适的人类可读单位来展示从 bytes 到 kB、MB、GB 逐级换算。下面的例子直观展示了它的换算节奏 select pg_size_pretty(1234::bigint); pg_size_pretty ---------------- 1234 bytes select pg_size_pretty(123456::bigint); pg_size_pretty ---------------- 121 kB select pg_size_pretty(1234567899::bigint); pg_size_pretty ---------------- 1177 MB select pg_size_pretty(12345678999::bigint); pg_size_pretty ---------------- 11 GB因此查询索引尺寸时推荐的标准写法就是pg_size_pretty(pg_relation_size(索引名))。同一套方法体系库、表、索引的尺寸查询pg_relation_size()并不是孤立的函数它与本仓库中记录的一系列尺寸查询函数共享同一套方法论可以对照掌握数据库级get-the-size-of-a-database.md 用pg_database_size(hr_hotels)获取整个数据库的字节数再配合pg_size_pretty()显示为12 MB表级get-the-size-of-a-table.md 用pg_relation_size(reservations)获取单张表的占用返回原始字节数1531904索引级即本文的主题同样是pg_relation_size(索引名)pg_size_pretty()。三者的组合用法在 pretty-print-data-sizes.md 末尾有完整示范 select pg_size_pretty(pg_database_size(hr_hotels)); pg_size_pretty ---------------- 12 MB从这张尺寸查询全景可以看出只要记住pg_relation_size()针对单个对象与pg_size_pretty()美化输出两个核心函数就能覆盖索引、表、库三个粒度的磁盘占用评估。进阶统计一张表上所有索引的总占用如果想评估的是某张表的所有索引合计占了多少空间而不是逐个索引去数PostgreSQL 还提供了同系列的管理函数pg_total_relation_size()它返回表本身 其上的所有索引 TOAST 数据的合计占用可用于估算一张表及其索引的整体存储成本。这类函数与pg_relation_size()属于同一族的管理接口用法一致传入表名或索引名必要时继续用pg_size_pretty()包裹输出。从本文的视角出发一个实用的评估习惯是先用\d 表名列出全部索引名再对每个索引执行select pg_size_pretty(pg_relation_size(索引名));最后汇总对比找出性价比最低的冗余索引。注意事项与适用前提使用上述方法时有几点需要留意这些限制来自 get-the-size-of-a-table.md 及函数本身的特性索引必须位于当前连接的数据库中pg_relation_size()解析的是当前数据库里的对象名查询其他数据库中的索引需要先切换连接名称解析依赖搜索路径search path直接传裸名字时函数按搜索路径查找对象跨 schema 时建议使用 schema 限定的完整名称如public.users_pkey返回的是字节数pg_relation_size()的输出是bigint字节值直观呈现请务必包一层pg_size_pretty()数值会随数据变化索引体积会随表数据的增删而增长若用于容量规划建议结合数据量的增长趋势做估算而不是只看当前快照。仓库内相关文档索引本主题在 til 仓库的 postgres 目录下形成了一条完整的知识链可按需深入get-the-size-of-an-index.md本文主体来源索引尺寸查询的最小示例get-the-size-on-disk-of-an-index.md索引磁盘占用的补充说明含\d查找索引名与 1GB 级真实案例get-the-size-of-a-table.mdpg_relation_size()在表级的使用与原始字节输出get-the-size-of-a-database.mdpg_database_size()在数据库级的使用pretty-print-data-sizes.mdpg_size_pretty()的单位换算行为与组合调用示范。赞分享文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载相关推荐如何用Gdu快速找出磁盘空间占用元凶终极磁盘分析指南如何用Gdu快速找出磁盘空间占用元凶终极磁盘分析指南 你是否曾经遇到过磁盘空间突然爆满的困扰想要快速找到那些占用大量空间的元凶文件却不知道从何下手GCLI开发工具Dust磁盘分析工具快速定位磁盘空间占用的终极指南Dust磁盘分析工具快速定位磁盘空间占用的终极指南 Dust是一款用Rust语言开发的磁盘分析工具作为传统 du 命令的增强版它提供了更直观的磁盘空间可视CLI开发工具SteamCleaner一键释放游戏平台占用的磁盘空间SteamCleaner一键释放游戏平台占用的磁盘空间 还在为电脑存储空间不足而烦恼吗您的游戏客户端可能正是罪魁祸首SteamCleaner这款专业的磁盘桌面应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考