首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle直接加载插入54,061,487条记录

Oracle直接加载插入54,061,487条记录
EN

Stack Overflow用户
提问于 2011-10-26 06:45:17
回答 3查看 1.1K关注 0票数 4

我有54,061,487条记录的直接加载插入。我在寻找速度。我根本不需要回滚。

所有涉及的表都设置为NOLOGGING

有一种方法可以做到这一点

代码语言:javascript
复制
EXECUTE IMMEDIATE 'TRUNCATE TABLE meRegionsNow';
...

INSERT /*+ APPEND */ INTO meRegionsNow(
   carrierId     ,
   region        ,
   zip           ,
   side          ,
   subPlanTypeId ,
   monthIn       )
   SELECT
      r.carrierId     as carrierId     ,
      r.region        as region        ,
      r.zip           as zip           ,
      r.side          as side          ,
      r.subPlanTypeId as subPlanTypeId ,
      t.monthIn       as monthIn
   FROM
      meTimeline t
         INNER JOIN region r
         ON t.monthIn >= r.effective AND
            t.monthIn <= r.expiry;

此操作的执行计划与预期一致(使用正确的索引来加速连接):

代码语言:javascript
复制
 Statement Id=5336   Type=  
 Cost=2.64022111505165E-308  TimeStamp=25-10-11::15::35:08  

   (1)  SELECT STATEMENT  ALL_ROWS   
 Est. Rows: 5,667  Cost: 483  
   (5)  TABLE TABLE ACCESS BY INDEX ROWID SCHEMA.REGION  [Analyzed]   
   (5)   Blocks: 2,826 Est. Rows: 944 of 377,779  Cost: 80   
 Tablespace: USERS  
       (4)  NESTED LOOPS   
            Est. Rows: 5,667  Cost: 483  
           (2)  INDEX INDEX FULL SCAN SCHEMA.METL$MONTHIN  [Analyzed]   
                Est. Rows: 6  Cost: 1  
           (3)  INDEX INDEX RANGE SCAN SCHEMA.RGN$MULTI3  [Analyzed]   
                Est. Rows: 944  Cost: 72  

这是另一种方法:

代码语言:javascript
复制
EXECUTE IMMEDIATE 'TRUNCATE TABLE meRegionsNow';
...

DECLARE
   CURSOR meTimeline_cur IS
      SELECT monthIn
      FROM meTimeline
      ORDER BY monthIn;
BEGIN
   FOR meTimeline_rec IN meTimeline_cur LOOP
      /* Cross regions with timeline */
      INSERT /*+ APPEND */ INTO meRegionsNow(
         carrierId     ,
         region        ,
         zip           ,
         side          ,
         subPlanTypeId ,
         monthIn       )
         SELECT
            r.carrierId            as carrierId     ,
            r.region               as region        ,
            r.zip                  as zip           ,
            r.side                 as side          ,
            r.subPlanTypeId        as subPlanTypeId ,
            meTimeline_rec.monthIn as monthIn
         FROM region r
         WHERE
            meTimeline_rec.monthIn >= r.effective AND
            meTimeline_rec.monthIn <= r.expiry;
      COMMIT;
   END LOOP;
END;

最快的方法是什么?我不认为游标控制的直接load insert和直接SQL直接load insert有太大区别。

再说一次,我不关心日志记录、回滚、保留任何撤消数据。我怀疑这花费很长时间的原因是表空间数据文件太频繁地使用大小太小的默认区进行自动扩展。

我认为只要我调整meRegionsNow表空间的大小,这个问题就会得到解决

数据文件。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-26 16:11:41

第一种方法可能更快,因为它在PL/SQL引擎和SQL引擎之间的上下文切换较少。您可以通过尝试这两种方法轻松地找到答案。

票数 4
EN

Stack Overflow用户

发布于 2011-10-26 16:26:43

您是否尝试过使用parallel提示并行化加载?(您可能会发现,您需要在加载过程中删除/无效约束和索引,然后在加载后将其重新打开)

代码语言:javascript
复制
INSERT /*+ APPEND PARALLEL*/ INTO meRegionsNow( ..... 
    SELECT /*+ PARALLEL*/ .....

有很多并行和直接负载工作的前提条件...

请参阅:http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_9014.htm#SQLRF01604请参阅:http://download.oracle.com/docs/cd/E11882_01/server.112/e16541/parallel003.htm#VLDBG1455

票数 2
EN

Stack Overflow用户

发布于 2011-10-26 18:26:26

在块之间使用commits对数据进行分片应该会减少临时表空间的使用量,因此如果临时表空间有限,它可能会更可靠。

OTOH分片方法必须多次访问源表-但由于非分片方法似乎在表上使用独占索引查找,因此对性能的影响很小(如果单遍方法有完整的表扫描,分片可能会慢得多)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7896777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档