12
返回列表 发新帖
楼主: zf_wu

碰到个难题-----修改表结构时,超慢

[复制链接]
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:33ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41奥迪
日期:2013-08-26 14:11:54
11#
 楼主| 发表于 2006-6-12 10:17 | 只看该作者
最初由 xjg 发布
[B]另外,速度问题可以考虑新增一个列,然后数据拷贝过去,再RENAME回来,当然也要先问一下开发人员,是不是有代码高度依赖列顺序的,如果有则不能这么搞。 [/B]

这样做,能提高速度吗?为什么?
谢谢!

使用道具 举报

回复
论坛徽章:
2
奥运会纪念徽章:田径
日期:2008-08-28 13:22:56奥运会纪念徽章:篮球
日期:2008-10-24 13:29:38
12#
发表于 2006-6-18 14:01 | 只看该作者
在修改表column时,数据库会不断的写日志,导致日志空间满了,日志满了就琐住表啦,当然其他应用也就不能用啦

这种情况最好是创建一个视图,把你需要重新定义的字段在视图里重新定义一下,再将旧表重命名,重新创建你需要的新表,然后利用视图将数据导出来,再导入到新表中,这样就解决根本问题了

使用道具 举报

回复
论坛徽章:
2
奥运会纪念徽章:田径
日期:2008-08-28 13:22:56奥运会纪念徽章:篮球
日期:2008-10-24 13:29:38
13#
发表于 2006-6-18 14:02 | 只看该作者
关于速度的问题,可以考虑删除索引再重新建立索引,或者优化索引

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:33ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41奥迪
日期:2013-08-26 14:11:54
14#
 楼主| 发表于 2006-6-23 16:40 | 只看该作者
最初由 sensilo 发布
[B]在修改表column时,数据库会不断的写日志,导致日志空间满了,日志满了就琐住表啦,当然其他应用也就不能用啦

这种情况最好是创建一个视图,把你需要重新定义的字段在视图里重新定义一下,再将旧表重命名,重新创建你需要的新表,然后利用视图将数据导出来,再导入到新表中,这样就解决根本问题了 [/B]


日志满了就琐住表啦,当然其他应用也就不能用啦???
为什么?

使用道具 举报

回复
论坛徽章:
112
2008新春纪念徽章
日期:2008-02-13 12:43:03马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14马上有车
日期:2014-11-03 12:40:39沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31慢羊羊
日期:2015-03-09 16:15:39
15#
发表于 2006-6-23 22:11 | 只看该作者
最初由 zf_wu 发布
[B]

日志满了就琐住表啦,当然其他应用也就不能用啦???
为什么? [/B]


对于归档模式,如果归档文件系统满了,Oracle 会HANG。

online redo log 满了,与锁表没有关系的。

modify char(9)--- >char(12),相当于对该表做了个全表的update 操作,如果表中记录多的话,是比较慢的。其他的dml操作,只能wait了。

使用道具 举报

回复
招聘 : 运维开发工程师
论坛徽章:
1
会员2006贡献徽章
日期:2006-04-17 13:46:34
16#
发表于 2006-6-24 20:17 | 只看该作者
其实如果不行应该赶快停止,比较妥当的做法应该是先增加一个新的字段。然后update。在renew 原来字段为新的名称。然后在修改。当然必须在系统空闲的时候来操作。

另外就是如果你不保证你该字段的所有长度为12。则建议使用varchar2。否则会产生空格,对应用系统造成不必要的错误!

使用道具 举报

回复
论坛徽章:
16
ITPUB元老
日期:2006-08-12 12:42:51授权会员
日期:2006-08-12 12:36:09数据库板块每日发贴之星
日期:2006-11-19 01:03:11数据库板块每日发贴之星
日期:2007-04-23 01:05:28会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44BLOG每日发帖之星
日期:2008-06-29 01:02:22
17#
发表于 2006-6-25 13:05 | 只看该作者
修改表列的定义,可能首先产生undo ,(在undo tbs中存入undo信息时,也要产生redo信息),然后修改列定义,此时,肯定会修改数据字典表,可能还要产生一些io,修改后,再update新列。
或者是不是,先建一个新列,用旧列中的数据更新新列后,在删除旧列。不只对不对情赐教。

使用道具 举报

回复
论坛徽章:
3
数据库板块每日发贴之星
日期:2006-02-18 01:02:33会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
18#
发表于 2006-6-25 22:51 | 只看该作者
你的做法之所以不可行,是因为CHAR(9) --> CHAR(12) 相当于要在每个记录的末尾加上三个空格,那么大的表,自然会死得很难看了

对于你情况,建议把字段类型由 CHAR 改成 VARCHAR2,同时扩展长度

ALTER TABLE .. MODIFY .. VARCHAR2(12);

不过多余的空格会很麻烦

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表