2015-07-21 53 views
0

我想更新Oracle数据库中存储的成千上万行。为此,我使用PHP和事务。 但整个过程非常缓慢。这是我做的:使用PHP更新SQL Developer中的表太慢

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

什么部分需要'年龄'? – cmorrissey

+0

在第一个IF语句中执行UPDATING部分。 – user1919

+0

你能给我们一些数字来解释你所看到的效果的大小吗? “多年”可能是几秒,几分钟或几小时。正在处理多少行?你认为应该花多长时间?至少,假设'ALUWS_DATA_HISTORICAL_TBL'至少在循环内是一个常量,你只需要执行一次'oci_parse'并且只需要在循环中绑定和执行多次。数组中的数据来自哪里?如果你将它从数据库中提取出来,那么做一个'update'并让数据库成组运行会更有效率。 –

回答

2

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

+0

的SQL代码我认为这个帖子应该特别考虑,因为OP会拉动200万行。 http://stackoverflow.com/questions/1869753/maximum-size-for-a-sql-server-query-in-clause-is-there-a-better-approach – MonkeyZeus

+0

这是没有解释,当我发布,只是澄清。 – Jessica

+0

正式注意。我没有意识到评论和你的回答之间的时差 – MonkeyZeus