น่าเสียดายที่แม้แต่การทำสำเนาในแบทช์ขนาดเล็กจำนวน 100 แถวก็สร้างความล่าช้าอย่างมากหลังจากผ่านไประยะหนึ่ง
คุณเพิ่มการหน่วงเวลาระหว่างแต่ละชุดงานหรือเพียงแค่รวมชุดการปรับปรุงและเรียกใช้ชุดงานแต่ละชุดโดยตรงหลังจากชุดก่อนหน้าหรือไม่
ถ้าเป็นเช่นนั้นให้ลองเขียนสคริปต์การแปลงในภาษาที่คุณชื่นชอบด้วยสิ่งที่ชอบ:
repeat
copy oldest 100 rows that haven't been copied yet to new table
sleep for as long as that update took
until there are <100 rows unprocessed
stop logging service
move the last few rows
rename tables
restart logging
delete the old table when you are sure the conversion has worked
สิ่งนี้ควรตรวจสอบให้แน่ใจว่าการแปลงไม่ได้ใช้ความจุของเซิร์ฟเวอร์มากกว่าครึ่งหรือน้อยกว่าแม้จะให้ความแตกต่างของภาระที่กำหนดเนื่องจากการใช้งานของระบบแตกต่างกันไปตามเวลา
หรือถ้าคุณต้องการที่จะใช้เป็นเวลามากที่สุดเท่าที่เป็นไปได้เมื่อบริการที่ค่อนข้างไม่ได้ใช้งาน แต่กลับออก (อาจหยุดสำหรับค่อนข้างยาวของเวลา) เมื่อฐานข้อมูลความต้องการที่จะทำผลงานบางอย่างสำหรับผู้ใช้แทนที่ด้วยsleep for as long as the update took
if the server's load is above <upper measure>, sleep for some seconds then check again, loop around the sleep/check until the load drops below <lower measure>
นี่หมายถึงว่ามันสามารถทำงานได้ล่วงหน้าในช่วงเวลาที่เงียบสงบ แต่จะหยุดชั่วขณะอย่างสมบูรณ์เมื่อเซิร์ฟเวอร์ไม่ว่างซึ่งทำงานเป็นภาระงานปกติ การพิจารณาโหลดจะขึ้นอยู่กับระบบปฏิบัติการของคุณ - ภายใต้ Linux และค่าเฉลี่ย 1 นาทีที่โหลดจาก/proc/loadavg
หรือuptime
ควรทำเช่นเดียวกัน <lower measure>
และ<upper measure>
อาจเป็นค่าเดียวกันแม้ว่าจะเป็นเรื่องปกติในการควบคุมเช่นนี้เพื่อให้มีความแตกต่างดังนั้นกระบวนการของคุณจะไม่เริ่มต้นแล้วหยุดทันทีทันทีเนื่องจากการรีสตาร์ทของตัวเองมีผลกับการวัดโหลด
แน่นอนว่าสิ่งนี้จะไม่ทำงานสำหรับตารางที่แถวเก่าอาจได้รับการแก้ไข แต่จะทำงานได้ดีสำหรับตารางบันทึกเช่นเดียวกับที่คุณอธิบาย
คุณจะต้องเพิกเฉยต่อภูมิปัญญาดั้งเดิมในการสร้างดัชนีหลังจากเติมตารางใหม่ในกรณีนี้ ในขณะที่มีประสิทธิภาพมากขึ้นเมื่อคุณต้องการให้สิ่งต่าง ๆ เร็วที่สุดเท่าที่จะเป็นไปได้ (ผลกระทบต่อส่วนที่เหลือของระบบจะถูกสาป) ในกรณีนี้คุณไม่ต้องการโหลดจำนวนมากในตอนท้ายของกระบวนการ ดัชนีถูกสร้างขึ้นอย่างสมบูรณ์ในครั้งเดียวเนื่องจากเป็นกระบวนการที่คุณไม่สามารถหยุดชั่วคราวเมื่อสิ่งต่างๆไม่ว่าง