如何给一个已存在的表增加一列 并插入一列行号

[复制链接]
查看11 | 回复9 | 2011-2-18 11:43:35 | 显示全部楼层 |阅读模式
本帖最后由 yangbint 于 2012-5-31 14:54 编辑
原因是这样的
听说nbu 可以将两次全备份对比 找出差异部分 然后存储第一次全备份 和第二次的差异部分 恢复的时候可以当做两次全备份来使用
然后我们就像测试一下 于是提出了题目中的需求 也就是
给一个已存在的表增加一列 并插入一列行号这个表大概400G 30亿行
下面的帖子中我自己也想了一些思路 一开始是完全不行 后来倒是有个思路可以了 但是效率太低了


-----------------------------------------------------------------------------------------------------------------------------------------------------
大概就是上面这些了
下面附上一些我下面的回复 以便各位大侠了解我的思路(如果不屑。。就别看了。。确实没啥特别有价值的)
想了一些思路 比如用rownum 可是这东西不能where rownum=2这种用 查询还好说 插入就不好使了
然后想alter table的时候 add column default 一个序列 结果发现不支持这样的语法。。。。。
还要考虑一下效率问题啊。。。。我可能要30亿行的表。。
在基表上增加一个空列之后 再建立一个视图 视图是在基表的列加上一个rownum 然后在update视图。。也不行。。。即使是这样 也不算是一个表的视图么。。
蛋疼的方法。。。不知道真正跑起来要多久
比如我的表a 有30亿行 现在要在a上加一列序号
首先
alter table a add(test_num number default 9999999999);
然后 写个循环
open c_number for
select ROWNUM from a;
loop
fetch c_number
into v_number;
-- execute immediate 'insert into yang(test_num) values(s_num.nextval)';
execute immediate 'update a set test_num =' || v_number ||
'where ROWNUM=1 AND test_num=9999999999 ';
exit when c_number%notfound;
end loop;

今天果然是猪脑子。。。直接where rownum=1 and test_num is null
前面 alter table 就不用default le 鄙视。。。

atgc 发表于 2012-5-31 14:37
好大的表。,如果没有索引,那么CTAS重建一下,用parallel建,8个并行度。大概3小时内能做完

这位同学的方法我想过 但是不是道备份的时候 会不会把这个当做一个新对象来做 因为新建表表id貌似就变了吧 这样差异的部分应该是整个表而不是一个列 一会儿再帖子里详细说下

回复

使用道具 举报

千问 | 2011-2-18 11:43:35 | 显示全部楼层
本帖最后由 yangbint 于 2012-5-31 13:23 编辑
想了一些思路 比如用rownum可是这东西不能where rownum=2这种用 查询还好说 插入就不好使了
然后想alter table的时候 add column default 一个序列 结果发现不支持这样的语法。。。。。突然有点抽筋 想不到方法。。。。。。。。
回复

使用道具 举报

千问 | 2011-2-18 11:43:35 | 显示全部楼层
还要考虑一下效率问题啊。。。。我可能要30亿行的表。。
回复

使用道具 举报

千问 | 2011-2-18 11:43:35 | 显示全部楼层
在基表上增加一个空列之后 再建立一个视图 视图是在基表的列加上一个rownum 然后在update视图。。也不行。。。即使是这样 也不算是一个表的视图么。。
回复

使用道具 举报

千问 | 2011-2-18 11:43:35 | 显示全部楼层
30亿行的UPDATE估计是以小时来计算的
行长多少的?
回复

使用道具 举报

千问 | 2011-2-18 11:43:35 | 显示全部楼层
蛋疼的方法。。。不知道真正跑起来要多久
比如我的表a 有30亿行现在要在a上加一列序号
首先
alter table a add(test_num number default 9999999999);
然后 写个循环
open c_number for
select ROWNUM from a;
loop
fetch c_number
into v_number;
--execute immediate 'insert into yang(test_num) values(s_num.nextval)';
execute immediate 'update a set test_num =' || v_number ||

'where ROWNUM=1 AND test_num=9999999999 ';
exit when c_number%notfound;
end loop;
回复

使用道具 举报

千问 | 2011-2-18 11:43:35 | 显示全部楼层
今天果然是猪脑子。。。直接where rownum=1 and test_num is null
前面 alter table 就不用default le鄙视。。。
回复

使用道具 举报

千问 | 2011-2-18 11:43:35 | 显示全部楼层
我怎么这么寂寞。
回复

使用道具 举报

千问 | 2011-2-18 11:43:35 | 显示全部楼层
atgc 发表于 2012-5-31 13:58
30亿行的UPDATE估计是以小时来计算的
行长多少的?

425G
回复

使用道具 举报

千问 | 2011-2-18 11:43:35 | 显示全部楼层
其实问题是这样的 单位想用nbu做备份 然后听说nbu可以有个功能 就是 把第二次全备份与第一个全备份作比较 然后只存储差一部分这样 就相当于只存储了一个全备 和第二次的差异部分然后恢复的时候还可以当做两个全备用 不大清楚这个东西是怎么实现的 和rman的把增量备份和全备揉成一个全备这个功能有啥关系然后就想测试一下 就想把一个大表增加一列 这列的值只是一个序列 当然其他随机值都可以 但不希望是一样的值然后试验一下nbu的这个功能、、、
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行