【问题标题】:Oracle SQL PHP INSERT speed optimization? [closed]Oracle SQL PHP INSERT 速度优化? [关闭]
【发布时间】:2015-08-05 12:13:06
【问题描述】:

我正在尝试将大量数据插入 Oracle SQL DB,执行以下操作...

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)=30count($i)=count($fechahorainf)=720

这里的重点是我要插入 21600 行,这需要很多时间。

有没有提高速度的小窍门?

更新:我尝试了大安和城墙通过这种方式建议的 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

问候!

【问题讨论】:

  • 创建一个 .txt 文件并将插入语句放入其中然后执行LOAD DATA INFILE
  • 命令LOAD DATA INFILE 是否适用于Oracle DB?因为我读到它是 MySQL...
  • 那么,我只需要更改$consulta 变量以指向我的完整本地文本文件吗?我试试看,谢谢!

标签: php sql oracle oracle-call-interface


【解决方案1】:

如果由于某种原因无法选择加载数据,我建议您采取以下步骤来提高速度:

1) 确保没有自动提交。您正在提交是的,但是如果没有自动提交进行的交易,那就没关系了。 由于您使用的是 OCI_DEFAULT,因此应该没有自动提交。

2) 不要为每次插入解析 SQL ...重用已解析的 SQL 并使用 OCI_bind_by_name 替换要插入的值 .. 请参阅第二个 sample 了解如何执行此操作。 这应该会大大加快插入速度……并优化网络流量、数据库中的 SQL 解析资源等等。

3) 不要为每个组提交,而是计算插入次数并尝试最佳提交率 - 但在这种情况下,我认为最后一点并不重要。

我会尝试第 2 步,看看您可以从避免为每个插入解析 SQL 中获得多少收益...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多