执行 100k 插入语句的最佳方法是什么?

What is the best way to execute 100k insert statements?

我创建了一组 100k 的插入查询以在多个 oracle 表中生成数据以用于我的性能测试。执行此操作的最佳方法是什么?

过去,我尝试过 Oracle SQL developer 和 Toad 等工具。但是不确定它是否可以处理这么大的体积。

简单的插入语句,如 -

INSERT INTO SELLING_CODE (SELC_ID, VALC_ID, PROD_ID, SELC_CODE, SELC_MASK, VALC_ID_STATUS) 
VALUES (5000001, 63, 1, '91111111', 'N/A', 107);

使用 SQL 语句插入 100,000 行很好。这不是大量的数据,有一些简单的技巧可以帮助您将 运行 时间缩短到几秒钟。

首先,确保您的工具没有为每个语句显示某些内容。将语句复制并粘贴到工作表 window 中会非常慢。但是将语句保存到 SQL*Plus 脚本中,然后 运行ning 该脚本会很快。如果可能,请使用真正的 SQL*Plus 客户端。该程序几乎可以在任何系统上使用,并且擅长 运行ning 小脚本。

如果您必须使用 SQL 开发人员,请将 100K 语句保存在文本文件中,然后 运行 将其作为脚本 (F5)。这个方法在我的电脑上用了 45 秒。

set feedback off
@C:\temp\test1.sql

其次,批处理 SQL 语句以消除开销。您不必对所有这些进行批处理,批处理 100 statements-at-a-time 就足以减少 99% 的开销。例如,生成一千条这样的语句:

INSERT INTO SELLING_CODE (SELC_ID, VALC_ID, PROD_ID, SELC_CODE, SELC_MASK, VALC_ID_STATUS)
select 5000001, 63, 1, '91111111', 'N/A', 107 from dual union all
select 5000001, 63, 1, '91111111', 'N/A', 107 from dual union all
...
select 5000001, 63, 1, '91111111', 'N/A', 107 from dual;

将其保存在文本文件中,运行 在 SQL 开发人员 (F5) 中以相同的方式保存。这个方法在我的电脑上用了 4 秒。

set feedback off
@C:\temp\test1.sql

如果您不能显着改变 INSERT 语句的格式,您可以简单地在每 100 行之间添加一个 BEGINEND; /。这将一次向服务器传递 100 个语句,并显着减少网络开销。

为了更快的速度,运行 常规 SQL*Plus 中的脚本。在我的电脑上加载 100,000 行只需要 2 秒。

对于这样的 medium-sized 数据,保持 SQL 语句的便利性很有帮助。通过一些技巧,您可以获得与二进制格式几乎相同的性能。