微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

oracle11g – 在Oracle中插入一百万行的最快方法

如何以最佳方式在Oracle中插入超过一百万行以用于以下过程?如果我将FOR循环增加到一百万行,它会挂起.

create or replace procedure inst_prc1 as
   xssn number;
   xcount number;
   l_start Number;
   l_end Number;
   cursor c1 is select max(ssn)S1 from dtr_debtors1;

Begin
  l_start := DBMS_UTILITY.GET_TIME;
  FOR I IN 1..10000 LOOP
    For C1_REC IN C1 Loop
      insert into dtr_debtors1(SSN) values (C1_REC.S1+1);
    End loop;
  END LOOP;
  commit;
  l_end := DBMS_UTILITY.GET_TIME;
  DBMS_OUTPUT.PUT_LINE('The Procedure  Start Time is '||l_start);
  DBMS_OUTPUT.PUT_LINE('The Procedure End Time is '||l_end); 
End inst_prc1;

解决方法

您的方法将导致内存问题.最快的方式是[在大卫的评论后编辑查询以处理空方案]:

insert into dtr_debtors1(SSN)
select a.S1+level
   from dual,(select nvl(max(ssn),0) S1 from dtr_debtors1) a
connect by level <= 10000

选择插入是最快的方法,因为所有内容都保留在RAM中.
如果此查询进入全局临时区域但是需要进行数据库调整,则此查询可能会变慢.我认为没有比这更快的东西了.

有关Query使用内存的更多细节:

每个查询都有自己的PGA [程序全局区域],基本上每个查询都可以使用RAM.如果这个区域不足以返回查询结果,则sql引擎开始使用Golabl临时表空间,就像硬盘一样,查询开始变慢.如果查询所需的数据太大,即使临时区域不够,那么您将会出现表空间错误.

所以总是设计查询,以便它保持在PGA,否则它是一个红旗.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐