PostgreSQL:在非常大的表中增加列的长度

时间:2019-03-21 23:41:25

标签: postgresql

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是可行的。这是正确的吗?

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

1 个答案:

答案 0 :(得分:4)

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

因为one version later

  

增加varchar或varbit列的长度限制,或者完全删除该限制,不再需要重写表。

您可以轻松地自己测试一下:

postgres=# select version();
                          version
------------------------------------------------------------
 PostgreSQL 10.5, compiled by Visual C++ build 1800, 64-bit
(1 row)

postgres=# \timing on
Timing is on.
postgres=# create table alter_test (id serial, some_col varchar(255));
CREATE TABLE
Time: 22.331 ms
postgres=# insert into alter_test (some_col) select md5(random()::text) from generate_series(1,10e6);
INSERT 0 10000000
Time: 40894.275 ms (00:40.894)
postgres=# alter table alter_test alter column some_col type varchar(500);
ALTER TABLE
Time: 5.297 ms
postgres=#