【问题标题】:What is the best way to execute 100k insert statements?执行 100k 插入语句的最佳方法是什么?
【发布时间】:2019-09-30 07:08:45
【问题描述】:

我创建了一组 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);

【问题讨论】:

  • “过去,我尝试过 Oracle SQL developer 和 Toad 等工具。但不确定它是否可以处理这么大的容量。” - 你有没有尝试过?发生了什么?
  • read this SO question。尝试直接运行这么多插入语句可能不是一个好主意。
  • 执行 100,000 条单独的插入语句不是明智的做法。它很慢,而且维护或调试也很笨拙。哪种方法可能更好取决于您的具体情况:如果目标表为空,则 SQL*Loader 或外部表,INSERT INTO .. SELECT ... 否则 MERGE ..
  • 最好的方法一般是多插入(INSERT ALL)或运行事务
  • 在每 100 条左右的语句后添加一个提交,在插入数据之前删除表上除主键索引之外的所有索引,并在所有插入完成后手头有 DDL 重新创建索引,并且承诺,你应该没事。

标签: sql oracle performance bulk-operations


【解决方案1】:

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

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

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

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

其次,批处理 SQL 语句以消除开销。您不必对所有这些进行批处理,一次批处理 100 条语句就足以减少 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 Developer (F5) 中以相同的方式运行它。这个方法在我的电脑上用了 4 秒。

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

如果您无法显着更改 INSERT 语句的格式,您只需在每 100 行之间添加一个 BEGINEND; /。这将一次将 100 条语句传递给服务器,并显着减少网络开销。

要获得更快的速度,请在常规 SQL*Plus 中运行脚本。在我的 PC 上,加载 100,000 行只需要 2 秒。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 2012-01-30
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多