我有一个 PostgreSQL 表,目前非常大:340 列。该表旨在保存复杂 PDF 的样式。
随着时间的推移,我做出了一些改变:删除了一些列,添加了一些新的列等等......并且它可能仍会进一步发展。实际上我当前的需要是将列数加倍。
根据https://www.postgresql.org/docs/current/limits.html,表的上限是:
我在 Rails 应用程序中模拟了所有可能的情况来计算最大堆页,目前看起来不错,大小为 2.5KB。我的大多数列都是布尔类型(1 字节)、整数(4 字节)和双精度(8 字节)类型。还有一些特征有所不同,但数量很少。
Postgres 文档还指定:“从表中删除的列也会影响最大列限制。此外,尽管新创建的元组的删除列值在元组的空位图中内部标记为空,但空位图也占用空间”。
由于我不想使用 JSON 列,因此我不会将列数加倍,而是创建另一个表。然而,上述 340 列可能会比 340 列进一步推进。
所以这是我的问题:
表的列数(包括删除的列数)可以通过以下方式找到
SELECT count(*) FROM pg_attribute
WHERE attrelid = 'table_name'::regclass
AND attnum > 0;
Run Code Online (Sandbox Code Playgroud)
当您删除列时,现有行不会更改。因此,删除的列的值仍然存在,并且大小与以前相同。新行将有一个 NULL 值,它不占用任何额外空间,因此对于新行来说,除了空掩码中的单个位之外,没有任何开销。
表行的大小可以通过以下方式找到
SELECT pg_column_size(table_name) FROM table_name;
Run Code Online (Sandbox Code Playgroud)
如果达到行大小或列数的限制,INSERT
则有问题的行将导致错误,并且不会破坏其他任何内容。
归档时间: |
|
查看次数: |
1459 次 |
最近记录: |