PostgreSQL pg_size_pretty() 函数使用指南

PostgreSQL pg_size_pretty() 是一个非常实用且高频使用的系统管理与格式化函数。在 PostgreSQL 运维监控与性能调优中,底层磁盘计算函数(如 pg_relation_size()、pg_database_size()、pg_tablespace_size())返回的均是原始的 64 位整数字节数(Bytes)。面对上百亿甚至数万亿的字节长串,肉眼难以直观判断其规模。

pg_size_pretty() 专门用于将庞大的字节数值转换为带合适单位的人类可读字符串(如 15 kB、240 MB、18 GB、3.5 TB),是构建 DBA 监控看板与空间统计报表的必备利器。

PostgreSQL pg_size_pretty() 语法

这里是 PostgreSQL pg_size_pretty() 函数的语法形式:

pg_size_pretty(bytes)

PostgreSQL 内部提供了两个重载版本以适配不同精度的入参:

  • pg_size_pretty(bigint) -> text
  • pg_size_pretty(numeric) -> text

参数

bytes
必需的。一个表示物理存储字节总数的数值,数据类型可为 bigint 或 numeric。

返回值

返回一个表示格式化存储大小的 text 字符串。

  • 该函数依据 1024 进制(二进制乘数标准)自动递进单位:bytes -> kB -> MB -> GB -> TB。
  • 如果参数为 NULL,则返回 NULL。

PostgreSQL pg_size_pretty() 示例

以下示例演示从基础数值转换到实战数据库表空间统计的常见场景。

基础数值格式化转换

SELECT 
    pg_size_pretty(8192::bigint) AS size_kb,
    pg_size_pretty(10485760::bigint) AS size_mb,
    pg_size_pretty(107374182400::bigint) AS size_gb,
    pg_size_pretty(10995116277760::bigint) AS size_tb;

输出:

 size_kb | size_mb | size_gb | size_tb 
---------+---------+---------+---------
 8192 bytes | 10 MB   | 100 GB  | 10 TB

联动查看当前数据库总容量

结合 pg_database_size() 查看当前登录数据库的直观大小:

SELECT 
    current_database() AS db_name,
    pg_size_pretty(pg_database_size(current_database())) AS pretty_size;

输出:

  db_name  | pretty_size 
-----------+-------------
 postgres  | 74 MB

查询库中物理空间占用前 3 大的数据表

SELECT 
    relname AS table_name,
    pg_size_pretty(pg_total_relation_size(relid)) AS total_size
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 3;

输出:

  table_name  | total_size 
--------------+------------
 orders       | 1520 MB
 order_items  | 890 MB
 audit_events | 430 MB

结论

  • pg_size_pretty() 采用 1024 作为进位基数,单位显示符合操作系统与存储工程师的通用阅读习惯。
  • 该函数仅用于最终的用户界面或报告展示,不应用于 WHERE 子句或 ORDER BY 排序,因为格式化后的字符串排序(例如 '10 MB' < '2 GB')会丧失真实数值大小顺序。