今天公司有个小需求,然后需要增加两个字段.可是执行下来特别慢.上网看了下说是因为大量数据造成的.
参考网上例子速度果然快了很多.故记录以备参考!
当你去修改一个有大量数据表的结构时候 程序会去整表扫描 故而执行速度会慢下来很多.
-- 一般数据量不大(50W以内) 可以 直接进行修改 如
alter table tab_name add ( column_100 int(10) default '0' comment'增加的表字段')
但是当有大量数据(大于50w)的时候 因为直接修改程序会作整表扫描 所以速度会很慢..所以可以先将表数据导出 然后对空表进行操作
-- 1. 创建备份表tab_name_bak 确定表空间 ( tablespace_name要存放的地方)
create table tab_name_bak tablespace tablespace_name as select a,b,c from table_name where 0=1;
-- 2. 修改备份表 让表数据在插入的时候不出日志
alert table tab_name_bak nologging;
-- 3. 数据备份,直接大批量模式插入表,并行,只出少量日志,速度很快。
insert /*+ append */ into tab_name_bak select /*+ parallel(a,4) */ * from tab_name a;commit;
-- 4 .删除tab_name数据,回滚段不再存放任何可被恢复的信息。当命令运行后,数据不能被恢复,因此可以节省调用的资源,执行时间也会很短.
--降低表的高水位线HWM,将之清空恢复为0,后面即使数据恢复,高水位线HWM也会比以前低,可以提高运行速度。
truncate table tab_name;
-- 5. 修改表结构
alter table tabl_name add column_100 varchar2(50).
-- 6. 不输出日志
alter table tmmsf99 nologging;
-- 7 .数据恢复
insert /*+ append */ into tab_name(字段名) select /*+ parallel(b,4) */* tab_name;
commit;
-- 8. 修改原表为输出日志
alter table tab_name logging.
-- 9. 删除tab_name数据,回滚段不再存放任何可被恢复的信息。当命令运行后,数据不能被恢复,因此可以节省调用的资源,执行时间也会很短;
--降低高水位线HWM,清空恢复为0
truncate table tab_name_bak,
-- 10. 删除备份表结构
drop tabletmmsf99_bak.
表结构变更过程中,如果删除进程,只能删除正在做的字段,其他字段照常执行,最终结果就是表结构变更后会少字段,需要将少掉的字段再增加上,同时要考虑表结构头文件与表结构的一致性,这个需要特别注意。