Plsql 嵌套表中批量收集的最大限制是多少(我使用它处理1000万条记录)
我使用嵌套表来收集一个表的数据。并使用此数据插入另一个表。下面是我正在使用的代码。我对批量收集的容量很好奇Plsql 嵌套表中批量收集的最大限制是多少(我使用它处理1000万条记录),plsql,oracle11g,bulk-collect,Plsql,Oracle11g,Bulk Collect,我使用嵌套表来收集一个表的数据。并使用此数据插入另一个表。下面是我正在使用的代码。我对批量收集的容量很好奇 begin type bandtvarray is table of BANDWISETVCOVERAGE%rowtype; Band_arr bandtvarray; FOR j IN 1 .. 24 LOOP -- DELETE from BANDWISETVCOVERAGE WHERE trunc(CREATEDDATE)<trunc(
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;
简而言之,除了可用的系统内存之外,实际上没有限制,但我认为您问的问题是错误的。正确的问题是:批量绑定的合适尺寸是多少?确实没有确切的数字,但有几件事需要考虑: 您正在使用批量绑定来减少从处理程序的PL/SQL引擎到插入行并返回的数据库引擎的上下文切换 集合越大,程序消耗的内存就越多 最终,您将使集合变得如此之大,以至于您的程序不会因为上下文切换而变慢,而是因为CPU、可用内存、磁盘争用等其他原因 我个人的规则是大约100到250行是一个好的尺寸。您可以自己进行测试,发现当集合变得非常大时,性能实际上会更差。您希望选择一个性能良好且占用内存最少的数字:我下面的测试表明,即使是50也是一个足够好的值
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上有几个值得一读。下面是pga参数分配的pga总数7110111232分配的pga最大值16574827520