我在 MSSQLSRV 2008 R2 中批量插入临时表时遇到问题。
我正在插入一个大约 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, 0, -1); //remove last ,
$values = substr($values, 0, -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, 0, -1); //remove last ,
$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...
...
我一直在互联网上寻找可能的解决方案,但找不到任何可行的方法。
我发现这篇文章基本上说要一起批处理行(我已经完成了)。
我发现另一篇关于 PDO 的帖子,设置 connectionpooling=0。我试过了,并没有看到性能有任何提高。
有没有其他人遇到过 SQLSRV 和 PHP 的这个问题?
干杯,