我在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;
}
。但它超时了。
答案 0 :(得分:2)
250万个单独的INSERT语句总是很糟糕:你需要使用更适合批量数据量的东西
"它是一个导出,我试图在另一个表中插入这些记录"
最好的方法是以不同的格式重做导出,例如使用datadump。
或者,正如@thatjeffsmith建议的那样,您可以以CSV格式导出记录并使用SQL * Loader导入它们;
SQL Developer有选项来帮助解决这个问题。
答案 1 :(得分:0)
作为最后的手段,请删除每个脚本INSERT
部分的语句,并仅保留csv
格式的值。
定义EXTERNAL TABLE
或使用SQL*Loader
答案 2 :(得分:0)
如果这是一次性脚本,请花几分钟时间通过向文件添加多个BEGIN
和END; /
来手动将语句分组到匿名PL / SQL块中。除非您不断重新生成此文件,否则无需使用其他格式或工具。
由于网络滞后,具有大量语句的脚本通常很慢。每个语句都被发送到服务器,执行并返回状态。即使在同一主机上运行,通信开销仍可能超过用于执行实际工作的时间。
PL / SQL块作为单个单元发送到服务器。如果一次发送100个语句块,网络开销将减少99%。通过使用1000,10000等块,您不会看到很多改进,但块越大,您需要进行的手动编辑越少。但要注意,如果块太大,它将超出编译限制并抛出错误。
答案 3 :(得分:-1)
假设这些记录是干净的,您可以禁用要插入的表的日志记录和索引。此外,我会在1000条记录之后或根据您的要求进行提交。