sql - pl/sql forall insert 和plain SQL insert 的查询性能差异

标签 sql oracle plsql performance

我们一直在使用临时表来存储 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/

相关文章:

oracle - 使用 PL/SQL 生成 XLS 文件

sql - PL/SQL错误: ORA-00984 Column not allowed here

C# 反射 - 根据可用参数选择构造函数重载

sql - 如何从表中选择 *,但将其中一列转换为不同的数据类型?

PHP mysql如何关联三个表显示不同表的输出

python - pandas df.to_sql到Oracle数据库数据类型不一致

sql - 递归连接计数 - Oracle

oracle - 在 PL/SQL 中读取大型 csv 文件

sql - 获取从 C# (oracle) 调用的插入语句使用的序列号

sql - 使用 GROUP BY 日期时缺少日期