Postgres 报告的表/数据库大小与转储大小差异很大

Ulo*_*oPe 5 postgresql database-size

我对一个特定数据库的大小有一个非常奇怪的误报。

根据\l+psqlDB 大小是 292 MB。

对以下语句报告的大小进行求和也报告非常接近 292 MB。

SELECT
    table_name,
    pg_size_pretty(total_size) AS total_size
FROM (
    SELECT
        table_name,
        pg_total_relation_size(table_name) AS total_size
    FROM (
        SELECT ('"' || table_schema || '"."' || table_name || '"') AS table_name
        FROM information_schema.tables
    ) AS all_tables
    ORDER BY total_size DESC
) AS pretty_sizes
Run Code Online (Sandbox Code Playgroud)

然而pg_dump,这个数据库的一个产生了一个 2.02 GB 的 sql 文件

我怀疑这两种计数方法都会跳过 LOB,因为该数据库中有两个表包含TEXT内容较大的字段(每行最多 ~4MB)。

有没有办法在大小计算中包含 LOB?

编辑: 它变得更奇怪了:

这个查询:

SELECT SUM(LENGTH(text_column))
FROM some_table
Run Code Online (Sandbox Code Playgroud)

给出 2,091,245,318(即 2.02 GiB)的结果,大约是转储的大小。

小智 2

请注意,除非您的应用程序特意使用大对象接口,否则它不会将这些列存储为 LOB。使用TOAST(超大属性存储技术),普通列最多可以存储 1GB 。

除了离线存储数据之外,还可以压缩存储数据。尽管您没有这么说,但我认为您正在编写的转储是未压缩的,这可能是造成大小差异的主要原因。