【问题标题】:PostgreSQL: increasing a column's length in a very large tablePostgreSQL:在一个非常大的表中增加列的长度
【发布时间】:2019-03-21 23:41:25
【问题描述】:

Aurora PostgreSQL,版本 10.4。

我有一张有几百万行的表。其中一列定义为character varying(255)。曾几何时,255 是足够的空间,但现在它不是,所以我必须做更多。

我找到了这个in the PG 9.1 release notes

  • 允许 ALTER TABLE ... SET DATA TYPE 以避免在适当的情况下重写表(Noah Misch、Robert Haas)

例如,将 varchar 列转换为文本不再需要重写表。但是,增加 varchar 列的长度约束仍然需要重写表。

这表明更改为更长的varchar 是不切实际的(因为重写该大小的表会锁定它很长时间),但更改为text 会起作用。这是正确的吗?

在进行此类更改时,我还应该了解哪些其他事项?显然,我想避免数据丢失,而且我不能让这个表在短时间内无法访问。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    您应该已阅读所有发行说明。

    因为只是one version later

    增加 varchar 或 varbit 列的长度限制,或完全取消限制,不再需要重写表。

    您可以自己轻松测试:

    postgres=# 选择版本(); 版本 -------------------------------------------------- ---------- PostgreSQL 10.5,由 Visual C++ build 1800 编译,64 位 (1 行) postgres=#\计时 定时开启。 postgres=# 创建表 alter_test (id serial, some_col varchar(255)); 创建表 时间:22.331 毫秒 postgres=# insert into alter_test (some_col) select md5(random()::text) from generate_series(1,10e6); 插入 0 10000000 时间:40894.275 毫秒(00:40.894) postgres=# alter table alter_test alter column some_col type varchar(500); 更改表 时间:5.297 毫秒 postgres=#

    【讨论】:

    • 我刚刚尝试增加 VARCHAR 长度,但没有奏效。桌子变得无法访问。大约 2 分钟后,我终止了该命令。
    • 还有什么可能导致这种情况?我知道此列上没有任何索引。
    • @MikeBaranczak:alter table 需要在无法获得的表上使用排他锁。您可能有其他事务访问该表。在pg_stat_activity中查找idle in transaction(或active)的会话
    • 如果表上有AFTER UPDATE触发器,会不会被这个操作触发?
    • 我想通了。有一个视图引用了此列。在我放弃视图后,它起作用了。再次感谢您的帮助。
    猜你喜欢
    • 2021-10-09
    • 2021-11-15
    • 1970-01-01
    • 2014-09-05
    • 2021-06-20
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多