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
是可行的。这是正确的吗?
进行此类更改时,我还应该了解其他事项吗?显然,我想避免数据丢失,而且我不能让该表在短时间内无法访问。
答案 0 :(得分:4)
您应该已经阅读了所有发行说明。
增加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=#