2015-07-21 27 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