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

PostgreSQL 中文网

 
 
 

日志

 
 

PostgreSQL9.2Beta: 字段类型转换依然需要 rewrite 表  

2012-05-24 09:52:12|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

     PostgreSQL9.2 对于"ALTER TABLE " 字段扩长已有很多场景不需要重写表了,具体可以对照之前的 BLOG
http://francs3.blog.163.com/blog/static/4057672720124235522188/, 今天测试了下类型转换的场景,看看
PostgreSQL9.2Beta 类型转换时是否需要 rewrite 表。

 

测试场景一: float --> integer

--创建测试表并导入数据 

francs=> create table test_4 (id float8,name varchar(32));
CREATE TABLE

francs=> insert into test_4 select generate_series(1,3000000),'a';
INSERT 0 3000000

francs=> select * from test_4 order by id desc limit 5;
   id    | name
---------+------
 3000000 | a
 2999999 | a
 2999998 | a
 2999997 | a
 2999996 | a
(5 rows)

francs=> \dt+ test_4
                    List of relations
 Schema |  Name  | Type  | Owner  |  Size  | Description
--------+--------+-------+--------+--------+-------------
 francs | test_4 | table | francs | 115 MB |
(1 row)

francs=> \timing
Timing is on.

francs=> \d test_4
           Table "francs.test_4"
 Column |         Type          | Modifiers
--------+-----------------------+-----------
 id     | double precision      |
 name   | character varying(32) |

--修改字段类型

francs=> alter table test_4 alter column id type integer ;
ALTER TABLE
Time: 23805.774 ms

francs=> \d test_4
           Table "francs.test_4"
 Column |         Type          | Modifiers
--------+-----------------------+-----------
 id     | integer               |
 name   | character varying(32) |

   
  
   备注: 由 float8 转换成 integer 类型花费了 23 秒,显然重写表了。

 

测试场景二: integer  -->  text

 francs=> \d test_4
           Table "francs.test_4"
 Column |         Type          | Modifiers
--------+-----------------------+-----------
 id     | integer               |
 name   | character varying(32) |

francs=> alter table test_4 alter column id type text;
ALTER TABLE
Time: 31735.712 ms

francs=> \d test_4
           Table "francs.test_4"
 Column |         Type          | Modifiers
--------+-----------------------+-----------
 id     | text                  |
 name   | character varying(32) |

   
 
 备注: integer 类型转换成 text 类型花费了 31 秒左右,显然重写表了。
 
 
 测试场景三: text  -->  integer

  francs=> \d test_4;
           Table "francs.test_4"
 Column |         Type          | Modifiers
--------+-----------------------+-----------
 id     | text                  |
 name   | character varying(32) |

francs=> alter table test_4 alter column id type integer using (id::integer);
ALTER TABLE
Time: 34431.975 ms


francs=> \d test_4
           Table "francs.test_4"
 Column |         Type          | Modifiers
--------+-----------------------+-----------
 id     | integer               |
 name   | character varying(32) |

 备注:text 转换成 integer 时,重写了表。

 

总结

             对于字段类型转换例如( float --> integer,integer  -->  text, text  -->  integer ) 会发生重写表,更

进一步发现表的 pg_class.relfilenode 发生了变化,推测字段类型转换(不是字段扩长)都要 rewrite 表,因

为涉及到字段类型转换时需要检测每条记录是否合法,这里只是推测,需要进一步验证。

  评论这张
 
阅读(25929)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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