注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

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

2011-09-16 16:56:50|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

       今天看到了 PostgreSQL9.1 一个令人兴奋的新特性,9.1 将字断类型从 varchar 修改成 text 类型,
将不会重写表数据。而扩字断长度依然会重写表数据,但是这些在以后版本可能会改进,下面测试下:


一 9.0 版本上测试
--1.1 查看版本
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 创建测试表并插入数据
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) |
 
--1.3 修改字段 name 类型
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 版本上测试
--2.1 查看版本
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)

--2.2 创建测试表并插入数据
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.

--2.3 修改字段 name 类型
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 核心组在这方面正在努力改进,相信在以后的
版本中,像扩字段这样的操作不用重写表, 下面总结下修改表结构几种情况:

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

  评论这张
 
阅读(25983)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016