工做中设计到更新多张千万级数据量的表,须要先统计相关信息,再将信息更新到表中,更新操做须要几个小时才能执行完成。
调整思路为,先统计相关信息到中间表中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分钟内执行完成,还要注意建立完表以后须要关闭该表的并行,不关闭并行可能 引发执行计划错误,查询效率出现问题。 oracle
在生产环境执行过程当中发现问题:ORA-12805: parallel query server died unexpectedly spa
从新执行后执行成功,相关文章: 设计
https://community.oracle.com/thread/317343 server
另外开启并行容易致使RAC服务问题,严重可能致使宕机,注意根据机器调整并行度。 索引
查看各表并行度
select table_name,degree from user_tables;
关闭表并行
alter table B noparallel;
it