使用PHP更新SQL Developer中的表太慢

使用PHP更新SQL Developer中的表太慢,php,oracle,Php,Oracle,我想更新存储在Oracle数据库中的几十万行。为此,我使用PHP和事务。 但整个过程极其缓慢。我就是这么做的: while (($row = oci_fetch_array($stid, OCI_ASSOC))) { // define input for function $id = $row['ID']; $upstream_attn = $row['UPSTREAM_ATTN']; $downstream_attn = $row['DOWNSTREAM_ATTN']; $attainab

我想更新存储在Oracle数据库中的几十万行。为此,我使用PHP和事务。 但整个过程极其缓慢。我就是这么做的:

while (($row = oci_fetch_array($stid, OCI_ASSOC))) {

// define input for function
$id = $row['ID'];
$upstream_attn = $row['UPSTREAM_ATTN'];
$downstream_attn = $row['DOWNSTREAM_ATTN'];
$attainable_bitrate_adsl = $row['ATTAINABLE_BITRATE_ADSL'];
$stability = $row['STABILITY'];
$performance = $row['PERFORMANCE'];
$dsl_type = $row['DSL_TYPE'];
$snr_profile = $row['SNR_PROFILE'];

// execute function
$validationStatus =  validatePerformanceData($upstream_attn,$downstream_attn,$attainable_bitrate_adsl,$stability,$performance,$dsl_type,$snr_profile); // return true or false

if ($validationStatus== 'OK'){

    $stid_tmp = oci_parse($connection,"update " . ALUWS_DATA_HISTORICAL_TBL . " set VALIDATION_STATUS = 1 where ID = :id_bbn");
    oci_bind_by_name($stid_tmp, ":id_bbn", $id);
    $r_tmp = oci_execute($stid_tmp, OCI_NO_AUTO_COMMIT);

}
else{
    $y = $y +1;
}
}

oci_commit($connection);

//disconnect from database
oci_close($connection);
整个过程需要很长时间。我在oci_execute函数中添加了模式:oci_NO_AUTO_COMMIT,以避免自动提交,但这并没有带来很大的区别


任何其他建议都是受欢迎的。

不要单独运行每个更新,而是构建一个ID数组,然后在循环后更新ID所在的表(逗号分隔的值列表)

什么部分需要
ages
?在第一条IF语句中执行更新部分。您能给我们一些数字来解释您看到的效果的大小吗?“for ages”可以是秒、分钟或小时。正在处理多少行?你认为需要多长时间?至少,假设
ALUWS\u DATA\u HISTORICAL\u TBL
至少在循环中是一个常量,那么您希望在循环中执行一次
oci\u parse
,然后绑定并执行多次。阵列中的数据来自何处?如果您从数据库中提取它,则只需执行一次
更新
,并让数据库以集合方式工作,效率会更高。我正在处理200万行。当我评论更新部分时,其余部分大约在1分钟内运行。嗯,实际上数组中的数据是从数据库中提取的。
validatePerformanceData()
做什么?它是一个简单的函数吗?另外,
oci\u fetch\u数组($stid,oci\u ASSOC)
的SQL是什么样子的?你运行的是什么版本的Oracle?我认为这篇文章应该考虑在内,特别是因为OP正在拉200万行。我发帖的时候并没有解释,只是为了澄清。注意到了。我没有意识到评论和回答之间的时差,这就是问题所在:ORA-01795:列表中表达式的最大数量是1000英寸