PostgreSQL9.1新特性之四:Converting a varchar column to text no longer requires a rewrite of the table

今天看到了 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.2 20080704 (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.2 20080704 (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 核心组在这方面正在努力改进,相信在以后的版本中,像扩字段这样的操作不用重写表, 下面总结下修改表结构几种情况:

  • 字段类型扩长,会重写表, 如 varchar(30)扩成 varchar(128);
  • 修改字段类型,会重写表, 如 integer 类型转换成 varchar ;
  • 字段类型由 varchar 转换成 text 类型不会重写表。

原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/236431.html

(0)
上一篇 2022年1月24日
下一篇 2022年1月24日

相关推荐

发表回复

登录后才能评论