Alfred 发表于 2014-10-14 11:23:01

5千万数据的普通表更改字段的数据类型,varchar2-->number

环境:RHEL 5.7 + Oracle 11.2.0.3
现有一张表,数据量5千多万。没有分区。
需求是修改一个字段的数据类型,varchar2(64)改成number

我采用如下方法实现更改数据类型的需求:

//定义变量并赋值
define table_name = 表名
define col_temp = 列名_temp
define col_old = 列名
define datatype_old = varchar2(64)
define datatype_new = number

//执行
prompt 1.alter table &table_name add &col_temp &datatype_old;
alter table &table_name add &col_temp &datatype_old;

prompt 2.update &table_name set &col_temp = &col_old;       
update &table_name set &col_temp = &col_old;       
commit;

prompt 3.update &table_name set &col_old = null;       
update &table_name set &col_old = null;       
commit;

prompt 4.alter table &table_name modify &col_old &datatype_new;
alter table &table_name modify &col_old &datatype_new;

prompt 5.update &table_name set &col_old = &col_temp;
update &table_name set &col_old = &col_temp;
commit;

prompt 6.alter table &table_name drop column &col_temp;
alter table &table_name drop column &col_temp;

我现在的问题是:
1.之前几十万数据量的表的采用这种方法更改没有问题,10s完成需求。但对于这张5kw+的数据表,这个方法相当于有3个更新操作,怕会大量消耗undo空间,所以不知这个方案是否可行?有没有优化的方法?
2.对于这类需求,有没有更好的实现方法?

Maclean Liu(刘相兵 发表于 2014-10-15 11:56:02

如果有停机时间 不如用  CTAS 来的好
页: [1]
查看完整版本: 5千万数据的普通表更改字段的数据类型,varchar2-->number