暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 如何使用DBlink优化复制巨大的表。

askTom 2017-04-26
308

问题描述

我有很大的表要从数据库链接复制。。但是需要很长时间
目前我正在使用cta,但是它花费了很多时间,我该如何优化它。
脚本如下所示:
从 @ DBLINK创建表a为select *;
从b @ DBLINK创建表b为select *;
.....
.....
.....
我100的表 ..

请帮我优化一下。

专家解答

您可以查看以下几件事:

1) 如果2个数据库之间有足够的网络容量,则可以使用dbms_job并行化任务。这是一个过程,您可以在其中指定要运行多少个并发作业,然后将工作分配给他们

create or replace 
procedure tab_copy(p_jobs pls_integer default 4, p_this_job pls_integer) is
  type t_char_list is table of varchar2(30) index by pls_integer;
  l_tab_list t_char_list;
  
  l_progress     pls_integer := 0;
begin
  if p_this_job not between 0 and p_jobs-1 then
     raise_application_error(-20000,'0 and '||p_jobs||' for modulo');
  end if;
  
  l_tab_list(1) := 'tableA';
  l_tab_list(2) := 'tableB';
  l_tab_list(3) := 'tableC';
  ...
  ...
  l_tab_list(30) := 'tableXX';
  

  for i in 1 ..  l_tab_list.count 
  loop
      if mod(i,p_jobs) = p_this_job then
        l_progress := l_progress + 1;
        dbms_application_info.set_client_info(l_tab_list(i)||' '||l_progress||' of '||trunc(l_tab_list.count/p_jobs));
        execute immediate 'create table '||l_tab_list(i)||' as select * from '||l_tab_list(i)||'@dblink';
      end if;
    end if;
  end loop;
  
end;
/

variable j number
declare
  c_jobs pls_integer := 4;
begin
for i in 0 .. c_jobs-1 
loop           
  dbms_job.submit(:j,'tab_copy('||c_jobs||','||i||');');
end loop;
end;
/
commit;


复制



2) 调整SDU/TDU参数以获得更好的网络吞吐量 (尽管我很少看到这具有 * 大量 * 好处)

3) 考虑在表创建上进行NOLOGGING,然后备份相关的数据文件。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论