如何在oracle中运行大约250万个插入语句的插入脚本文件?

时间:2017-03-06 10:07:32

标签: sql oracle insert bulk-operations

我在oracle中有一个插入脚本文件,包含大约250万个插入语句。想要插入Oracle表中的想法。

我尝试使用SQL Developer直接执行文件$name=basename($_FILES['file']['name']); $name1=explode('.',$name); if($name1[count($name1)-1]=='csv'||$name1[count($name1)-1]=='xlsx') { $target_path = "uploads/"; $target_location = $target_path . basename($_FILES['file']['name']); $_SESSION['target_location'] = $target_location; move_uploaded_file($_FILES["file"]["tmp_name"], $target_location); $uploadedStatus = 1; } 。但它超时了。

4 个答案:

答案 0 :(得分:2)

250万个单独的INSERT语句总是很糟糕:你需要使用更适合批量数据量的东西

  

"它是一个导出,我试图在另一个表中插入这些记录"

最好的方法是以不同的格式重做导出,例如使用datadump。

或者,正如@thatjeffsmith建议的那样,您可以以CSV格式导出记录并使用SQL * Loader导入它们;

SQL Developer有选项来帮助解决这个问题。

答案 1 :(得分:0)

作为最后的手段,请删除每个脚本INSERT部分的语句,并仅保留csv格式的值。

定义EXTERNAL TABLE或使用SQL*Loader

加载它

答案 2 :(得分:0)

如果这是一次性脚本,请花几分钟时间通过向文件添加多个BEGINEND; /来手动将语句分组到匿名PL / SQL块中。除非您不断重新生成此文件,否则无需使用其他格式或工具。

由于网络滞后,具有大量语句的脚本通常很慢。每个语句都被发送到服务器,执行并返回状态。即使在同一主机上运行,​​通信开销仍可能超过用于执行实际工作的时间。

PL / SQL块作为单个单元发送到服务器。如果一次发送100个语句块,网络开销将减少99%。通过使用1000,10000等块,您不会看到很多改进,但块越大,您需要进行的手动编辑越少。但要注意,如果块大,它将超出编译限制并抛出错误。

答案 3 :(得分:-1)

假设这些记录是干净的,您可以禁用要插入的表的日志记录和索引。此外,我会在1000条记录之后或根据您的要求进行提交。