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

樱之花

叶散的时候,你明白欢聚;花谢的时候,你明白青春.

 
 
 

日志

 
 
关于我

分类中“我的实验室”是我在日常工作中的一些知识总结,有些写的比较匆忙,可能大家在阅读时会产生困扰,后期有时间我会重新整理编辑,谢谢大家的到访,您们的支持是我前进的动力!

网易考拉推荐

ORACLE数据表有很多数据如果增加字段需要很长时间  

2012-12-24 10:05:06|  分类: ORACLE |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
关于创建的方式哪种更快,需要综合考虑,由于楼主的库是非归档模式的,所以估计是个测试库。
对于测试环境,楼主的两种加载数据的方式都可行,我测试环境没有那么大的表,只能拿一个有1500万行,1G大小的表测试了一下,采用数据泵方式用了5分钟(导出加导入),采用insert /*+append*/ 方式用时216秒(如果加载新增字段为not null,需要260秒),看似insert /*+append*/的效率更高一些;不过有几点要注意的:
1.在正式的生产环境,考虑到数据可恢复的问题,可能insert /*+append*/是不能被接受的
2.这两种方式目标表的默认值只对新插入的数据有效,而对导入自原表中的数据无效。
3.采用数据泵模式,新加的字段不能为not null
对于可以接受停机的生产库,为了保证数据的可恢复,建议采用数据泵或者直接路径加载的sql loader试试
但是,现在越来越多的oracle充当企业关键数据库,可能不会给予足够的停机时间,此时可以采用在线重定义等高可用方式。
或者,按照以下步骤:
1.在表上增加一个新字段,不带默认值,这个操作应该很快
alter table test add test number;
2.把此字段改为默认值,这样,以后插入的数据就包含默认值了,但是修改之前的字段值仍然为空
alter table test modify test default 88888888;
3.如果需要将修改前的默认值加入相关的历史数据,可以做一个批量更新的存储过程,定义比如每1000条一次commit,以减小生产库的压力。
4.更新完成后,可以将字段设置为not null模式
总之,在生产库的真实环境中(尤其是24X7库),有时候速度并不是唯一要考虑的因素,还要考虑数据的可恢复性,操作时对数据库的性能影响,以及停机时间,这就是为什么oracle会提供速度并不突出的在线重定义的原因。有时为了减轻对生产库的压力,我也会故意在循环插入、更新和删除的存储过程中加入延迟,以防治日志过于频繁的切换。
上述测试是基于10g的,在11g中,看来oracle已经意识到了这个问题,所以可以直接采用添加默认值的语法,这个更新应该时间很短,因为你查到以前数据上新加的字段上已经有默认值了,但是这是通过oracle内部函数计算后显示出来的,而不是真实存在于数据库中的,只有以后加入的数据,默认值才会真实插入数据库表中,所以11g中你可以使用下面语句:
alter table test add test number default 88888888 not null;
另外,给楼主一点小建议:
第一要给出表结构和具体的创建过程,第二要提供等待事件的信息,这样的提问,别人才能够有的放矢的帮你分析问题,你的难题也可以在第一时间得到解决。
  评论这张
 
阅读(1582)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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