【发布时间】:2021-10-23 05:37:33
【问题描述】:
我想在 PostgreSQL 表中创建一个不是主键的自动递增 id 列。该表目前刚刚超过 2 亿行,包含 14 列。
SELECT pg_size_pretty(pg_total_relation_size('mytable'));
上面的查询显示mytable 在磁盘上占用了57 GB。在检查 df -h(在 Ubuntu 20.04 上)后,我目前在磁盘上剩余 30 GB 可用空间
我不明白为什么,在尝试创建 SERIAL 列后,我完全耗尽了磁盘空间 - 查询最终永远不会完成。我运行以下命令:
ALTER TABLE mytable ADD COLUMN id SERIAL;
然后看看我的磁盘空间是如何逐渐耗尽的,直到没有任何剩余并且查询失败。我不是数据库专家,但这没有意义。为什么一个简单的序列化列会占用表本身一半以上的空间,尤其是当它不是主键因此没有索引时?是否有已知的解决方法来创建这种自动递增的 id 列?
【问题讨论】:
-
与您的空间问题完全无关,但是:使用串行is discouraged 支持符合标准的
identity列 -
谢谢,这很有帮助,但是我应该如何实现标识列来达到我的目标?
-
您的空间不足,因为
SERIAL基本上是一个执行此操作的宏Serial。结果是表的重写。要提出解决方案,我们需要知道您希望通过新列实现什么目标?
标签: postgresql indexing primary-key auto-increment