将列类型从 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?看起来 bigint
比 int
花费的 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。 VACUUM
由 autovacuum
使用默认设置自动 运行(但不是 VACUUM FULL
)。
- VACUUM returning disk space to operating system
- Are regular VACUUM ANALYZE still recommended under 9.1?
除了副作用之外,将列从 int
更改为 bigint
never 会减少行大小(不会膨胀)。有时它会保持不变,因为前一行有 4 个字节的对齐填充可供 bigint
使用。或者行大小再增加(通常)8 个字节。
为了清楚起见 - 只有 VACUUM FULL
可以减少 table 使用的磁盘 space。甚至这并不总是正确的——如果可以删除某些页面,则取决于数据文件页面中已删除元组的数量。并创建新的数据文件。
Plain VACUUM
仅通过删除已删除的元组释放 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?看起来 bigint
比 int
花费的 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。 VACUUM
由 autovacuum
使用默认设置自动 运行(但不是 VACUUM FULL
)。
- VACUUM returning disk space to operating system
- Are regular VACUUM ANALYZE still recommended under 9.1?
除了副作用之外,将列从 int
更改为 bigint
never 会减少行大小(不会膨胀)。有时它会保持不变,因为前一行有 4 个字节的对齐填充可供 bigint
使用。或者行大小再增加(通常)8 个字节。
为了清楚起见 - 只有 VACUUM FULL
可以减少 table 使用的磁盘 space。甚至这并不总是正确的——如果可以删除某些页面,则取决于数据文件页面中已删除元组的数量。并创建新的数据文件。
Plain VACUUM
仅通过删除已删除的元组释放 space 现有数据文件页面,但不会减少数据文件中分配的页面数量。并且不创建新的数据文件。