Oracle SQL PHP INSERT速度优化?
Oracle SQL PHP INSERT speed optimization?
我正在尝试将大量数据插入 Oracle SQL 数据库,执行以下操作...
foreach ($service as $valor) {
$j=0;
foreach($fechahorainf as $fecha){
$i=0;
$consulta="INSERT INTO PRUEBA_SMS(FECHAHORAINF,SERVICIO,VALOR) VALUES (TO_DATE('".$fecha."','DD/MM/YYYY hh24:mi:ss'),'".$valor."','".$data[$j][$i]."')";
$stmt = oci_parse($conexion, $consulta);
oci_execute($stmt,OCI_DEFAULT);
$i++;
}
oci_commit($conexion);
oci_free_statement($stmt);
$j++;
}
请注意 count($j)=count($service)=30
和 count($i)=count($fechahorainf)=720
这里的重点是我要插入 21600 行,这需要很多时间。
有什么提高速度的小窍门吗?
更新:我尝试了 Daan 和 citywall 通过这种方式建议的 LOAD DATE INFILE:
$consulta="LOAD DATA LOCAL INFILE 'files/data.csv' INTO TABLE PRUEBA_SMS FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n' (FECHAHORAINF,NODO,SERVICIO,VALOR)";
$stmt=oci_parse($conexion, $consulta);
oci_execute($stmt);
但是我在没有太多信息的情况下收到这个警告...
Warning: oci_execute(): in C:\PATH_TO_ARCHIVE.php on line 160
此致!
如果加载数据出于某种原因不适合您,这是我建议采取的提高速度的步骤:
1) 确保没有自动提交正在进行。你承诺是,但如果没有交易没有自动提交,那就没关系了。
由于您使用的是 OCI_DEFAULT,因此不应自动提交。
2) 不要为每个插入解析 SQL ...重用已解析的 SQL 并使用 OCI_bind_by_name 替换要插入的值 .. 参见第二个 sample 如何做到这一点。
这应该会大大加快插入速度...并优化网络流量,SQL 在数据库中解析资源等等。
3) 不是为每个组提交,而是计算插入并尝试最佳提交率 - 但我认为最后一点在这种情况下并不重要。
我会尝试第 2 步,看看避免为每个插入解析 SQL 可以获得多少收益...
我正在尝试将大量数据插入 Oracle SQL 数据库,执行以下操作...
foreach ($service as $valor) {
$j=0;
foreach($fechahorainf as $fecha){
$i=0;
$consulta="INSERT INTO PRUEBA_SMS(FECHAHORAINF,SERVICIO,VALOR) VALUES (TO_DATE('".$fecha."','DD/MM/YYYY hh24:mi:ss'),'".$valor."','".$data[$j][$i]."')";
$stmt = oci_parse($conexion, $consulta);
oci_execute($stmt,OCI_DEFAULT);
$i++;
}
oci_commit($conexion);
oci_free_statement($stmt);
$j++;
}
请注意 count($j)=count($service)=30
和 count($i)=count($fechahorainf)=720
这里的重点是我要插入 21600 行,这需要很多时间。
有什么提高速度的小窍门吗?
更新:我尝试了 Daan 和 citywall 通过这种方式建议的 LOAD DATE INFILE:
$consulta="LOAD DATA LOCAL INFILE 'files/data.csv' INTO TABLE PRUEBA_SMS FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n' (FECHAHORAINF,NODO,SERVICIO,VALOR)";
$stmt=oci_parse($conexion, $consulta);
oci_execute($stmt);
但是我在没有太多信息的情况下收到这个警告...
Warning: oci_execute(): in C:\PATH_TO_ARCHIVE.php on line 160
此致!
如果加载数据出于某种原因不适合您,这是我建议采取的提高速度的步骤:
1) 确保没有自动提交正在进行。你承诺是,但如果没有交易没有自动提交,那就没关系了。 由于您使用的是 OCI_DEFAULT,因此不应自动提交。
2) 不要为每个插入解析 SQL ...重用已解析的 SQL 并使用 OCI_bind_by_name 替换要插入的值 .. 参见第二个 sample 如何做到这一点。 这应该会大大加快插入速度...并优化网络流量,SQL 在数据库中解析资源等等。
3) 不是为每个组提交,而是计算插入并尝试最佳提交率 - 但我认为最后一点在这种情况下并不重要。
我会尝试第 2 步,看看避免为每个插入解析 SQL 可以获得多少收益...