将列类型从 int 更改为 bigint 释放 space?

Altering column type from int to bigint frees space?

我有一个 table 和一个 int 类型的列,在一个 table 约 1500 万行中。
OS windows 7、C盘(安装postgres的地方)显示:

59 GB free of 238 GB

然后我将此列类型更改为 bigint:

ALTER TABLE mytable ALTER column col TYPE bigint;

现在C盘:

61 GB free of 238 GB

如何释放 2 GB?看起来 bigintint 花费的 space 更少?或者发生了什么?

此时此机器(这是 local/home 计算机)上没有其他进程。

bigint占用8个字节,int占用4个字节,但磁盘上的space取决于整行。

  • Making sense of Postgres row sizes
  • Calculating and saving space in PostgreSQL

更重要的是,包含 table 的文件的物理大小也取决于死元组(table 膨胀)。 VACUUM(通常只有 VACUUM FULL)可以减小 table 的物理大小。您的 ALTER TABLE 导致了整个 table 重写, 使 膨胀 table。但它也使后来的 VACUUM(或 VACUUM FULL)到 trim 数据页变得简单,只有死元组 - 有效地压缩了 table。 VACUUMautovacuum 使用默认设置自动 运行(但不是 VACUUM FULL)。

除了副作用之外,将列从 int 更改为 bigint never 会减少行大小(不会膨胀)。有时它会保持不变,因为前一行有 4 个字节的对齐填充可供 bigint 使用。或者行大小再增加(通常)8 个字节。

为了清楚起见 - 只有 VACUUM FULL 可以减少 table 使用的磁盘 space。甚至这并不总是正确的——如果可以删除某些页面,则取决于数据文件页面中已删除元组的数量。并创建新的数据文件。

Plain VACUUM 仅通过删除已删除的元组释放 space 现有数据文件页面,但不会减少数据文件中分配的页面数量。并且不创建新的数据文件。