У меня есть следующий код (более или менее )для импорта от 500 000 до 4 000 000 строк:
$sSql = "Insert into table (a,b,c) VALUES(?,?,?)"
$oSQLStmnt = $pdo->prepare($sSql);
$oSQLStmnt->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_SYSTEM);
if (!$oSQLStmnt) {
echo $pdo->errorInfo(); // Handle errors
}
$pdo->beginTransaction();
$iLineCounter = 1;
while (($sLine = fgets ($oCSV, 8000)) !== FALSE) {
$aLine = explode('|', $sLine); //Fgetscsv did not work properly
if ($iLineCounter % 100 == 0) {
lo("Inserting row ". $iLineCounter);
$pdo->commit();
sleep(0.15);
$pdo->beginTransaction();
}
try {
$oSQLStmnt->execute($aLine);
$iSuccesulInserts++;
}
catch (exception $e) {
print_r($e);
$iFailedInserts++;
}
$iLineCounter++;
}
$pdo->commit();
Как видите, я выполняю коммит каждые 100 строк и даже добавил немного сна. Раньше я запускал коммит только один раз каждые 25 000 строк и не использовал сон. Однако в какой-то момент я обнаружил, что мне не хватает записей. Я начал играться с этими настройками (сон и количество строк ). Таким образом, я уменьшил количество отсутствующих записей с 50 000 до примерно 100. Но я все еще пропускаю записи! Куда они идут? Я знаю, что с SQL все в порядке, потому что я немедленно получаю ошибки, когда что-то не так.
Я думал, что могу складывать много вставок во время транзакции? Может ли вызов beginTransaction быть проблемой?
ОБНОВЛЕНИЕ:
Награда закончилась, и мне пришлось ее присудить. Спасибо всем за ваши ответы. Или советы на самом деле, поскольку никто из вас на самом деле не ответил на мой вопрос. Я не просил обходной путь, хотя ваши предложения очень ценятся. Ответ, за который была присуждена награда, получил его, потому что он был ближе всего к фактическому ответу на мой вопрос. К сожалению, это не сработало.
На данный момент я использую массовый импорт CSV, который отлично работает, но если у кого-то есть другие советы по устранению этой проблемы, сообщите мне. Поскольку я предпочитаю использовать свой оригинальный метод.