今天看到了 PostgreSQL9.1 一个令人兴奋的新特性,9.1 将字断类型从 varchar 修改成 text 类型,将不会重写表数据。而扩字断长度依然会重写表数据,但是这些在以后版本可能会改进,下面测试下:
9.0 版本上测试
查看版本
1 2 3 4 5
skytf=> select version(); version ------------------------------------------------------------------------------------------------------------------- PostgreSQL 9.0.1 on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 4.1.220080704 (Red Hat 4.1.2-48), 64-bit (1 row)
创建测试表并插入数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14
mydb=> create table test_47 (id integer, name varchar(32)); CREATE TABLE
mydb=> insert into test_47 select generate_series(1,5000000),'francs'; INSERT 0 5000000 mydb=> timing Timing is on.
mydb=> /d test_47 Table "mydb.test_47" Column | Type | Modifiers --------+-----------------------+----------- id | integer | name | character varying(32) |
修改字段 name 类型
1 2 3 4 5 6 7 8 9 10
skytf=> alter table test_47 alter column name type text; ALTER TABLE Time: 18925.293 ms
skytf=> /d test_47 Table "skytf.test_47" Column | Type | Modifiers --------+---------+----------- id | integer | name | text |
备注:9.0 版本将字段类型由 varchar 修改成 text 时,花费了 19 秒左右,可见重写了这个字段。
9.1 版本上测试
查看版本
1 2 3 4 5
mydb=> select version(); version -------------------------------------------------------------------------------------------------------- PostgreSQL 9.1.0 on i686-pc-linux-gnu, compiled by gcc (GCC) 4.1.220080704 (Red Hat 4.1.2-48), 32-bit (1 row)
创建测试表并插入数据
1 2 3 4 5 6 7
mydb=> create table test_47 (id integer, name varchar(32)); CREATE TABLE
mydb=> insert into test_47 select generate_series(1,5000000),'francs'; INSERT 0 5000000 mydb=> timing Timing is on.
修改字段 name 类型
1 2 3 4 5 6 7 8 9 10
mydb=> alter table test_47 alter column name type text; ALTER TABLE Time: 122.347 ms
mydb=> /d test_47 Table "mydb.test_47" Column | Type | Modifiers --------+---------+----------- id | integer | name | text |
备注:9.1版本将字段类型由 varchar 修改成 text 类型很快就完成了,果然没有重写表数据。
总结
平常在数据库维护过程中扩字断及修改数据类型是非常痛苦的事情,因为要重写表,如果表比较大,这无疑对生产系统业务是致使的打击,虽然 9.1 版本只在字段类型由 varchar 转换成 text 这种情况下不用重写表,但这依然令人兴奋,因为这至少说明这是 PG 核心组在这方面正在努力改进,相信在以后的版本中,像扩字段这样的操作不用重写表, 下面总结下修改表结构几种情况: