脚本宝典收集整理的这篇文章主要介绍了PHP w / MS SQL批量插入速度慢,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在插入一个包含约200,000行的CSV,大约需要5分钟才能完成.
我尝试使用PDO和sqlsrv驱动程序.它们似乎都表现不佳.
这是代码,以了解我在做什么(我包括sqlSRV和PDO代码):
... try { //create structure table record foreach ($mapPEd_data as $k => $v) { $insert .= $k . ","; $values .= $v . ","; } $insert = substr($insert,-1); //remove last,$values = substr($values,-1); $tableName = $table; if ($stageData) { $tableName = "stage_$table"; } if ( $query == "" ) $query = "INSERT INTO $tableName ($insert) VALUES "; $query .= "($values),"; // Insert in blocks of 1000 lines if ($line % 1000 == 0) { $LOG->loginfo("Executing @ line: $line"); $query = substr($query,$query .= ";"; // ====================== // = sqlSRV DRIVER CODE = // ====================== sqlsrv_begin_transaction($sqlsrvConn); $queryResult = sqlsrv_query($sqlsrvConn,$query); if ($queryResult) { sqlsrv_commIT($sqlsrvConn); } else { sqlsrv_rollback($sqlsrvConn); } // =================== // = PDO DRIVER CODE = // =================== $conn->beginTransaction(); $res = $conn->PRepare($query); if($res->execute() === false) { $errInfo = $res->errorInfo(); if ( $conn->inTransaction() ) { $conn->rollback(); } $log->logInfo('Data importing error on line: ' . $line . $errInfo[2]); $errors[] = 'Data importing error on line: ' . $line . $errInfo[2]; } else { if ( $conn->inTransaction() ) { $conn->commit(); $query = ""; $importedRows += ($line - 6) - $importedRows; } } } } catch (PDOException $e) { if ( $conn->inTransaction() ) { $conn->rollBack(); } $log->logInfo('PDO Exception: ' . $e->getMessage()); $errors[] = 'PDO Exception: ' . $e->getMessage(); } $line++; } // End of while loop through each CSV Line fclose($handle); $totalRows = $line - 6; $importedRows += $totalRows - $importedRows; // Insert remaing queries afterwards... ...
我一直在寻找可能的解决方案,但一直没有找到任何有效的解决方案.
我找到了this post,它基本上就是说要一起批处理行(我已经完成了).
我发现另一个帖子说PDO,设置connectionpooling = 0.我尝试过,并没有看到性能有任何提高.
干杯,
您正在使用字符串连接,后跟substr删除最后一个逗号.当您使用substr时,它会生成该字符串的另一个副本,这对于长字符串来说是内存密集型的.有关字符串很长时会发生什么的示例,请参见this question.当我切换到阵列连接时,由于@R_406_2213@率较低,我的速度大大提高.但是,如果您没有内存问题,阵列连接实际上可能是slower.
我看到的其他一些事情是你只需要收集一次$inserts变量,并且一旦你不再需要它们就不会取消大变量.我不知道纠正这种事情是否会对你产生明显的影响.以下是您可以尝试的基本类型的更改:
if(!isset($insert)) { $insert = array(); $collect = true; } $values = $array(); foreach ($mapped_data as $k => $v) { if(isset($collect)) $insert[] = $k; $values[] = $v; } unset($collect); ..... if(!isset($queryend)) $queryend = array(); $queryend[] = "(".implode(",",$values).")"; ..... $query = "INSERT INTO $tableName (" .implode(",$insert) .") VALUES " .implode(",$queryend); unset($queryend); //always unset Big things as soon as possible ..... //after $res = $conn->prepare($query); unset($query);
以上是脚本宝典为你收集整理的PHP w / MS SQL批量插入速度慢全部内容,希望文章能够帮你解决PHP w / MS SQL批量插入速度慢所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。