我们一直在使用临时表来存储 pl/sql 存储过程中的中间结果。任何人都可以判断通过 pl/sql 进行批量收集插入和普通 SQL 插入之间是否存在性能差异。
插入到【表名】【选择查询返回海量数据】
或者
[选择查询返回大量数据] 的光标
打开游标
获取游标批量收集到集合中
使用 FORALL 执行插入
上面两个选项哪个更适合插入大量临时数据?。
最佳答案
您的问题的一些实验数据(Oracle 9.2)
批量收集
DECLARE
TYPE t_number_table IS TABLE OF NUMBER;
v_tab t_number_table;
BEGIN
SELECT ROWNUM
BULK COLLECT INTO v_tab
FROM dual
CONNECT BY LEVEL < 100000;
FORALL i IN 1..v_tab.COUNT
INSERT INTO test VALUES (v_tab(i));
END;
/
-- 2.6 sec
插入
-- test table
CREATE global TEMPORARY TABLE test (id number)
ON COMMIT preserve ROWS;
BEGIN
INSERT INTO test
SELECT ROWNUM FROM dual
CONNECT BY LEVEL < 100000;
END;
/
-- 1.4 sec
直接路径插入
http://download.oracle.com/docs/cd/B10500_01/server.920/a96524/c21dlins.htm
BEGIN
INSERT /*+ append */ INTO test
SELECT ROWNUM FROM dual
CONNECT BY LEVEL < 100000;
END;
/
-- 1.2 sec
关于sql - pl/sql forall insert 和plain SQL insert 的查询性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2672764/