ฉันมีรหัสต่อไปนี้ (มากหรือน้อย) ที่จะนำเข้าจาก 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 นั้นใช้ได้ เพราะฉันได้รับข้อผิดพลาดทันทีเมื่อมีบางอย่างผิดปกติ
ฉันคิดว่าฉันสามารถซ้อนเม็ดมีดได้จำนวนมากระหว่างการทำธุรกรรม? การเรียก startTransaction อาจเป็นปัญหาหรือไม่?
อัปเดต:
เงินรางวัลสิ้นสุดลงและฉันต้องให้รางวัล ขอขอบคุณทุกท่านสำหรับคำตอบของคุณ หรือเคล็ดลับจริงๆ เนื่องจากไม่มีใครตอบคำถามของฉันจริงๆ ฉันไม่ได้ขอวิธีแก้ปัญหา แม้ว่าข้อเสนอแนะของคุณจะได้รับการชื่นชมมากก็ตาม คำตอบที่ได้รับค่าหัวเพราะมันใกล้เคียงกับการตอบคำถามของฉันมากที่สุด น่าเสียดายที่มันไม่ได้ผล
ขณะนี้ฉันใช้การนำเข้า CSV จำนวนมาก ซึ่งใช้งานได้ดี แต่ถ้าใครมีเคล็ดลับอื่นๆ ในการแก้ไขปัญหานี้ โปรดแจ้งให้เราทราบ เนื่องจากฉันชอบใช้วิธีเดิมมากกว่า
range(0, 50000)
และลบโค้ดที่เป็นปัญหาทั้งหมด (sleeps,try .. catch
และคอมมิตระดับกลาง) คุณยังคงสามารถสร้างปัญหาซ้ำได้หรือไม่ ? หากใช่ คุณสามารถลิงก์ไปยังสคริปต์ตัวอย่างสมบูรณ์ ได้หรือไม่ - person phihag   schedule 04.07.2012$pdo->commit();
และ$pdo->beginTransaction();
ด้วยโค้ดดังกล่าว หากฉันอ่านอย่างถูกต้อง - person vyegorov   schedule 04.07.2012$sSql
ไม่มีคำหลักVALUES
คำนั้นหายไปจากสคริปต์ในรหัสการทำงานของคุณหรือไม่? - person Andriy M   schedule 05.07.2012