首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在嵌套表中大容量收集的最大限制是多少(我正在对1000万条记录使用它)

在嵌套表中大容量收集的最大限制是多少(我正在对1000万条记录使用它)
EN

Stack Overflow用户
提问于 2018-05-02 22:50:24
回答 1查看 355关注 0票数 1

我使用嵌套表来收集table.And的数据,使用这些数据插入到另一个table.Below中是我正在使用的代码。我对批量收集的容量感到好奇。

代码语言:javascript
复制
begin
 type bandtvarray is table of BANDWISETVCOVERAGE%rowtype;
            Band_arr bandtvarray;

FOR j IN 1 .. 24 LOOP
  --
  DELETE from BANDWISETVCOVERAGE 
  WHERE trunc(CREATEDDATE)<trunc(sysdate-60) 
       AND ROWNUM<1000000  
      returning  BANDWISETVCOVERAGEID_PK 
      BULK COLLECT into Band_arr;
   --
  forall i in 1 .. Band_arr.count
        insert into ARC_BANDWISETVCOVERAGE  
        values Band_arr(i);
        Band_arr.DELETE();
   commit;
    --
END LOOP;
EN

回答 1

Stack Overflow用户

发布于 2018-06-02 03:47:41

简短的答案是,除了可用的系统内存之外,确实没有限制,但我认为您问错了问题。正确的问题是:用于批量绑定的合适大小是多少?确实没有确切的数字,但有几件事需要考虑:

  • 使用批量绑定来减少上下文切换(从PL/SQL引擎处理程序到数据库引擎插入行和插入行)
  • 集合越大,程序的内存就越大,这样程序就不会因为上下文切换而变得“慢”,而是因为其他一些原因(CPU、可用内存、磁盘争用等)而变得“慢”

我个人的规则是大约100到250行是一个很好的大小。您可以自己测试一下,当集合变得非常大时,性能实际上会变得更差。您希望选择一个运行良好且使用最少内存的数字:我下面的测试显示,即使是50也是一个足够好的值。

代码语言:javascript
复制
DROP TABLE t;
DROP TABLE v;

CREATE TABLE t AS
SELECT * FROM all_objects
CROSS JOIN (SELECT LEVEL FROM dual CONNECT BY LEVEL <= 10);

SELECT COUNT(*) FROM t;
-- 770260

CREATE TABLE v AS SELECT * FROM t WHERE 0 = 1;

DECLARE
  TYPE t_tab IS TABLE OF t%ROWTYPE;
  x_tab t_tab;

  CURSOR c IS
    SELECT *
      FROM t;

  c_bulk_size INTEGER := 50000;
  v_start     TIMESTAMP(9) := current_timestamp;
BEGIN
  OPEN c;

  LOOP
    FETCH c BULK COLLECT
      INTO x_tab LIMIT c_bulk_size;

    IF x_tab.count > 0 THEN
      FORALL i IN x_tab.first .. x_tab.last
        INSERT INTO v
        VALUES x_tab
          (i);
    END IF;

    EXIT WHEN x_tab.count < c_bulk_size;
  END LOOP;

  dbms_output.put_line((current_timestamp - v_start) || ' size ' ||
                       c_bulk_size);

  CLOSE c;

  ROLLBACK;
END;
/
-- +000000000 00:00:11.696873000 size 50
-- +000000000 00:00:12.692300000 size 50
-- +000000000 00:00:11.634849000 size 50

-- +000000000 00:00:12.770239000 size 100
-- +000000000 00:00:11.268332000 size 100
-- +000000000 00:00:11.793120000 size 100

-- +000000000 00:00:11.400098000 size 250
-- +000000000 00:00:10.625674000 size 250
-- +000000000 00:00:11.783102000 size 250

-- +000000000 00:00:09.490830000 size 500
-- +000000000 00:00:10.411275000 size 500
-- +000000000 00:00:11.713433000 size 500

-- +000000000 00:00:09.140556000 size 1000
-- +000000000 00:00:12.459841000 size 1000
-- +000000000 00:00:09.132134000 size 1000

-- +000000000 00:00:10.188990000 size 10000
-- +000000000 00:00:09.758166000 size 10000
-- +000000000 00:00:10.685548000 size 10000

-- +000000000 00:00:19.255858000 size 50000
-- +000000000 00:00:20.929404000 size 50000
-- +000000000 00:00:24.243393000 size 50000

我希望这能帮到你。如果你对批量收集限制进行一些搜索,互联网上有很多关于这方面的文章。在AskTom上有几个值得一读。

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

https://stackoverflow.com/questions/50137545

复制
相关文章

相似问题

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