我想更新存储在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以避免自动提交,但这并没有太大的区别。
欢迎任何其他建议。
答案 0 :(得分:2)
不是单独运行每个更新,而是构建一个ID数组,然后在循环之后,更新ID所在的表(以逗号分隔的值列表)。