【问题标题】:Altering column type from int to bigint frees space?将列类型从 int 更改为 bigint 可以释放空间?
【发布时间】:2017-04-23 23:45:13
【问题描述】:

我有一个带有 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 占用更少的空间?或者发生了什么?

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

【问题讨论】:

    标签: postgresql database-design storage postgresql-9.5 vacuum


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 2017-04-16
      • 2013-09-24
      • 2013-12-19
      相关资源
      最近更新 更多