การแทรกฐานข้อมูล Java ขนาดใหญ่

ฉันมีฐานข้อมูลที่ต้องแทรกข้อมูลเป็นชุด (ครั้งละประมาณ 500,000 บันทึก) ฉันกำลังทดสอบกับดาร์บี้และเห็นเวลาในการแทรกประมาณ 10-15 นาทีสำหรับบันทึกจำนวนมากนี้ (ฉันกำลังทำการแทรกแบบแบตช์ใน Java)

เวลานี้ดูช้าไหม (ทำงานกับแล็ปท็อปทั่วไปของคุณ) และมีแนวทางในการเร่งความเร็วหรือไม่?

ขอบคุณ,

เจฟ


person Jeff Storey    schedule 19.02.2010    source แหล่งที่มา


คำตอบ (1)


ครั้งนี้ดูสมเหตุสมผลอย่างยิ่ง และสอดคล้องกับเวลาที่ข้าพเจ้าสังเกตมา หากคุณต้องการให้ทำงานเร็วขึ้น คุณต้องใช้ตัวเลือกการแทรกจำนวนมากและปิดใช้งานคุณลักษณะด้านความปลอดภัย:

  • ใช้ PreparationStatements และชุดงาน 5,000 ถึง 10,000 เรกคอร์ด เว้นแต่จะต้องเป็นหนึ่งธุรกรรม
  • ใช้ตัวเลือกการโหลดจำนวนมากใน DBMS
  • ปิดใช้งานการตรวจสอบความสมบูรณ์ชั่วคราวสำหรับการแทรก
  • ปิดใช้งานดัชนีชั่วคราวหรือลบดัชนีและสร้างใหม่หลังการแทรก
  • ปิดใช้งานการบันทึกธุรกรรมและเปิดใช้งานอีกครั้งในภายหลัง

แก้ไข: ธุรกรรมฐานข้อมูลถูกจำกัดโดย I/O ของดิสก์ และบนแล็ปท็อปและฮาร์ดไดรฟ์ส่วนใหญ่ ตัวเลขที่สำคัญคือการค้นหาเวลาสำหรับดิสก์

แล็ปท็อปมักจะมีดิสก์ค่อนข้างช้าที่ 5400 รอบต่อนาที ที่ความเร็วนี้ เวลาค้นหาจะอยู่ที่ประมาณ 5 ms หากเราถือว่ามีการค้นหาหนึ่งครั้งต่อเรกคอร์ด (ในกรณีส่วนใหญ่ประมาณการไว้สูงเกินไป) อาจต้องใช้เวลา 40 นาที (500000 * 5 ms) เพื่อแทรกแถวทั้งหมด ขณะนี้ การใช้กลไกแคชและกลไกการจัดลำดับช่วยลดปัญหานี้ได้บ้าง แต่คุณจะเห็นได้ว่าปัญหามาจากไหน

ฉัน (แน่นอน) ทำให้ปัญหาง่ายเกินไปอย่างมาก แต่คุณสามารถดูได้ว่าฉันกำลังทำอะไรอยู่ มันไม่สมเหตุสมผลเลยที่จะคาดหวังว่าฐานข้อมูลจะทำงานด้วยความเร็วเดียวกันกับ I/O จำนวนมากตามลำดับ คุณต้องใช้การจัดทำดัชนีบางอย่างกับบันทึกของคุณ และนั่นต้องใช้เวลา

person BobMcGee    schedule 19.02.2010