SQL Server รองรับ Parallel Bulk Inserts จากหลายการเชื่อมต่อหรือไม่

Oct 30 2020

SQL Server รองรับการแทรกจำนวนมากแบบขนานลงในตารางฐานข้อมูลเดียวกันหรือไม่

คำชี้แจงบางประการสำหรับกรณีการใช้งานของฉัน:

  • ตารางมีดัชนีคลัสเตอร์ซึ่งประกอบด้วยคีย์ดัชนีที่แตกต่างกันสองรายการและดัชนีที่ไม่ใช่คลัสเตอร์สองรายการแต่ละรายการประกอบด้วยคีย์ดัชนีเดียว
  • ขนานในที่นี้หมายถึงการเชื่อมต่อที่แตกต่างกันหลายแบบ การเชื่อมต่อแต่ละครั้งเป็นอ็อบเจ็กต์sqlalchemy.orm.session ที่ไม่ซ้ำกันและแต่ละเซสชันจะแทรกข้อมูล 20k ในเวลาเดียวกันโดยใช้Session.bulk_insert_mappings()เมธอด

คำถามเฉพาะที่ฉันมี:

  • ฉันพยายามทำความเข้าใจว่าเกิดอะไรขึ้นภายใต้ฝากระโปรงฝั่ง SQL Server มีคิวสำหรับเม็ดมีดจำนวนมากทั้งหมดหรือไม่และเม็ดมีดจำนวนมากแต่ละเม็ดจะถูกดำเนินการทีละเม็ดตามลำดับที่เข้ามาหรือไม่ หรือเม็ดมีดทั้งหมดทำในเวลาเดียวกันแบบขนานหรือไม่
  • นอกจากนี้เรายังสมมติว่าจะไม่มีการเชื่อมต่อที่แตกต่างกันสองรายการที่พยายามแทรกระเบียนเดียวกัน (ตามคีย์หลัก) แต่จะเกิดอะไรขึ้นหากการเชื่อมต่อแบบขนานสองรายการพยายามแทรกระเบียนที่จะทำให้เกิดการละเมิด PK?
  • คำตอบสำหรับคำถามข้างต้นแตกต่างกันหรือไม่หากเรากำลังขอ SQL Server 2008 เทียบกับ 2017
  • Microsoft มีเอกสารเกี่ยวกับเรื่องนี้หรือไม่?

คำตอบ

6 PaulWhite Oct 30 2020 at 13:02

Microsoft มีเอกสารเกี่ยวกับเรื่องนี้หรือไม่?

ใช่จำนวนมาก หนึ่งอ้างอิงที่ดีโดยเฉพาะอย่างยิ่งคือการโหลดข้อมูลผลการดำเนินงานคู่มือ

ฉันพยายามทำความเข้าใจว่าเกิดอะไรขึ้นภายใต้ฝากระโปรงฝั่ง SQL Server มีคิวสำหรับเม็ดมีดจำนวนมากทั้งหมดหรือไม่และเม็ดมีดจำนวนมากแต่ละเม็ดจะถูกดำเนินการทีละเม็ดตามลำดับที่เข้ามาหรือไม่ หรือเม็ดมีดทั้งหมดทำในเวลาเดียวกันแบบขนานหรือไม่

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

นอกจากนี้เรายังสมมติว่าจะไม่มีการเชื่อมต่อที่แตกต่างกันสองรายการที่พยายามแทรกระเบียนเดียวกัน (ตามคีย์หลัก) แต่จะเกิดอะไรขึ้นหากการเชื่อมต่อแบบขนานสองรายการพยายามแทรกระเบียนที่จะทำให้เกิดการละเมิด PK?

หากการเชื่อมต่อสองรายการพยายามแทรกระเบียนเดียวกันลงในดัชนีเฉพาะรายการหนึ่งจะถูกบล็อกไว้ด้านหลังอีกรายการหนึ่ง เมื่อตัวแรกปลดล็อคพิเศษตัวที่สองจะทำให้เกิดข้อผิดพลาดในการละเมิดความเป็นเอกลักษณ์ (เว้นแต่ตัวเลือกที่ลึกลับเช่นIGNORE_DUP_KEYมีอยู่ในดัชนีเป้าหมาย)

คำตอบสำหรับคำถามข้างต้นแตกต่างกันหรือไม่หากเรากำลังขอ SQL Server 2008 เทียบกับ 2017

ไม่แตกต่างกันมาก SQL Server 2016 และใหม่กว่าสามารถบรรลุการแทรกจำนวนมากที่บันทึกไว้น้อยที่สุดไปยังดัชนีโดยไม่มีแฟล็กการติดตาม 610


อาจเป็นเรื่องยากที่จะได้รับเม็ดมีดจำนวนมากพร้อมกันอย่างแท้จริงในตารางที่มีดัชนี b-tree หนึ่ง (หรือมากกว่า) ในทางปฏิบัติ คุณอาจต้องปิดใช้งานการเลื่อนระดับการล็อกสำหรับเป้าหมายและ / หรือดำเนินการอื่น ๆ เป็นงานที่ซับซ้อนมากขึ้นเมื่อมีดัชนีหลายตัว ดูคู่มือประสิทธิภาพการโหลดข้อมูลสำหรับรายละเอียดเพิ่มเติม