运行 大型 sql 文件的快速方法,其中包含插入 stms - oracle

Quick way to run large sql file containing Insert stms - oracle

我有一个 sql 脚本,其中包含 700,000 个插入语句。我试图通过 Oracle Developer 运行,但它无法加载文件本身。我尝试从 sqlplus 到 运行 但是执行这么大的文件需要很长时间。

为了加快速度,我删除了table上的所有约束,但没有任何改善。

找过资料,请大家多多指教

  1. 将文件拆分为可管理的大小 - 这是我最后的选择。
  2. Sql Loader - 据我了解SQL Loader 是以特定格式从数据库导出并使用CTL将它们加载到数据库中。

有没有更好的方法来处理这种情况。

据我所知,选项 2 是正确的。

  • 使用sed/awk/perl将文件转换为CSV(或固定宽度)输入文件。
  • 禁用约束、索引(可能会删除唯一索引)
  • 为您的输入文件创建控制文件
  • exec sqlldr(打开直接路径加载)

这应该会在几秒钟内完成。

同意上面的先前回答,无论您用它做什么,通过脚本进行 700,000 次插入都会很慢 - 将数据加载为外部 table 或使用 SQL*Loader。

然而

如果您想使用 SQL Developer 执行大型脚本,请不要打开文件 - 我们必须打开并解析并显示该文件的内容。哎哟.

只需在工作表中执行此操作 @script_name

这将执行脚本。

要进一步加快速度,请隐藏或最小化工作表的输出区域。

尽管有 700,000 个插入,它仍然不会超快。

您还必须检查在执行插入操作的 table 中是否有一些触发器。如果在后面编写大量逻辑,它可能会减慢流程。

将文件从许多 SQL 语句转换为较少数量的 PL/SQL 块以减少往返开销。这只需要使用文本编辑器几分钟,并且可以将性能提高几个数量级,尤其是在慢速网络上。

每 10,000 行,向文件添加一个 begin 和一个 end;

改变这个:

insert into ...
insert into ...
insert into ...
...

为此:

begin
insert into ...
insert into ...
insert into ...
...
end;
/

不要将整个文件转换成一个大 PL/SQL 块。匿名 PL/SQL 块的大小有限制,您可能会遇到解析器错误。