3

我有一个int类型列的表,在一个大约 15 M 行的表中。
操作系统 windows 7 和 C 盘(安装了 postgres)显示:

59 GB 免费 238 GB

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

ALTER TABLE mytable ALTER column col TYPE bigint;

现在,C盘:

61 GB 免费 238 GB

如何释放 2 GB?看起来这bigint将占用更少的空间int?或者发生了什么?

目前这台机器(这是本地/家庭计算机)上没有其他进程。

4

2 回答 2

4

bigint占用 8 个字节,int占用 4 个字节,但磁盘空间取决于整行。

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

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

于 2016-12-08T17:19:56.607 回答
0

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

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

于 2016-12-08T18:10:48.530 回答