create table as及并行相关问题

拥有回忆 提交于 2019-12-04 19:44:04

工作中设计到更新多张千万级数据量的表,需要先统计相关信息,再将信息更新到表中,更新操作需要几个小时才能执行完成。
调整思路为,先统计相关信息到中间表中C,用业务表A和C联查,用create table as方式创建表B,删除A表相关索引、主外键,创建B表索引,主外键,将A表rename为备份表,将B表rename为A。
期间考虑过用Insert into select方式,比较效率后采用create as方式。create table as是ddl语句,insert into select是dml语句,insert into select每一条记录的时候都会产生undo和redo,整个过程相比create table as产生的redo和undo相当多,因此整个过程会慢也是正常的;但是create table as使用的前提是目标表的结构不存在才能使用;当有大量数据的时候不推荐使用Insert into as,因为该语句的插入的效率很慢;
最后增加并行,用create table B  parallel (degree default)  AS方式创建,8千万的数据可以在3分钟内执行完成,还要注意创建完表之后需要关闭该表的并行,不关闭并行可能 引起执行计划错误,查询效率出现问题。

在生产环境执行过程中发现问题:ORA-12805: parallel query server died unexpectedly

重新执行后执行成功,相关文章:

https://community.oracle.com/thread/317343

另外开启并行容易导致RAC服务问题,严重可能导致宕机,注意根据机器调整并行度。

查看各表并行度
select table_name,degree from user_tables; 

关闭表并行
alter table B noparallel;


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!