Postgresql 将列类型从int改为bigint可以释放空间吗?

Postgresql 将列类型从int改为bigint可以释放空间吗?,postgresql,database-design,storage,postgresql-9.5,vacuum,Postgresql,Database Design,Storage,Postgresql 9.5,Vacuum,我有一个带有inttype列的表,在一个约15m行的表中。 OS windows 7和C磁盘(安装postgres的位置)显示: 59 GB不含238 GB 然后我将此列类型更改为bigint: ALTER TABLE mytable ALTER column col TYPE bigint; 现在,C盘: 61 GB不含238 GB 如何释放2GB?看起来bigint比int占用的空间更少?或者发生了什么 这台计算机(这是本地/家庭计算机)上目前没有其他进程。bigint需要8个字节,int

我有一个带有
int
type列的表,在一个约15m行的表中。
OS windows 7和C磁盘(安装postgres的位置)显示:

59 GB不含238 GB

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

ALTER TABLE mytable ALTER column col TYPE bigint;
现在,C盘:

61 GB不含238 GB

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


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

bigint
需要8个字节,
int
需要4个字节,但磁盘空间取决于整行

更重要的是,包含表的文件的物理大小也取决于死元组(表膨胀)<代码>真空(通常只有
真空满
)可以减小工作台的物理尺寸。您的
ALTER TABLE
导致整个表重写,从而使表膨胀。但它也使以后的
真空
(或
真空满
)能够简单地用死元组修剪数据页,从而有效地压缩表<代码>真空由
自动真空
以默认设置自动运行(但不是
真空满


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

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


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

实际上,plain
VACUUM
会对物理文件末尾的可移动数据页进行机会主义修剪。