วิธีที่เร็วที่สุดในการแทรกแถวจำนวนมากคืออะไร?


27

ฉันมีฐานข้อมูลที่ฉันโหลดไฟล์ลงในตารางการแสดงละครจากตารางการแสดงนี้ฉันมี 1-2 ร่วมเพื่อแก้ไขคีย์ต่างประเทศแล้วใส่แถวนี้ลงในตารางสุดท้าย (ซึ่งมีหนึ่งพาร์ติชันต่อเดือน) ฉันมีข้อมูลประมาณ 3.4 พันล้านแถวสำหรับสามเดือน

วิธีที่เร็วที่สุดในการดึงแถวเหล่านี้จากการจัดเตรียมลงในตารางสุดท้ายคืออะไร SSIS Data Flow Task (ที่ใช้มุมมองเป็นแหล่งที่มาและมีการโหลดที่ใช้งานอย่างรวดเร็ว) หรือคำสั่งแทรกลงใน SELECT ... ฉันลอง Data Flow Task และสามารถรับประมาณ 1 พันล้านแถวในเวลาประมาณ 5 ชั่วโมง (8 cores / 192 GB RAM บนเซิร์ฟเวอร์) ซึ่งรู้สึกช้ามากสำหรับฉัน


1
พาร์ติชันอยู่ในกลุ่มไฟล์แยกกันหรือไม่ (และอยู่ในกลุ่มไฟล์เหล่านั้นบนฟิสิคัลดิสก์ที่ต่างกัน)
Aaron Bertrand

3
ทรัพยากรที่ดีจริงๆมูลโหลดคู่มือการปฏิบัติ นี่คือที่อยู่ของการเพิ่มประสิทธิภาพที่คุณสามารถทำได้เช่นการเปิดใช้งานTF610 , การใช้ BCP OUT / IN, SSIS เป็นต้นคุณเพียงแค่ทำตามคำแนะนำและทดสอบในสภาพแวดล้อมของคุณ
Kin Shah

@Aaron ใช่, ต่อหนึ่งกลุ่มไฟล์หนึ่งไฟล์, 12 ซองของ san lun ติดอยู่ดังนั้น jan ทุกคนจะไปหาหนึ่ง lun ฯลฯ ไม่แน่ใจว่ามีกี่ดิสก์ต่อ lun แต่ควรมีมากมาย
nojetlag

ใช่ฉันหมายถึง "ชุดดิสก์" จริง ๆ และอาจพูดถึงคอนโทรลเลอร์ด้วยเช่นกันซึ่งอาจทำให้อิ่มตัว
Aaron Bertrand

@Kin ดูที่คู่มือแล้ว แต่ดูเหมือนว่าล้าสมัย "ปลายทางของเซิร์ฟเวอร์ SQL เป็นวิธีที่เร็วที่สุดในการโหลดข้อมูลจำนวนมากจากกระแสข้อมูล Services Integration ไปยัง SQL Server ปลายทางนี้รองรับตัวเลือกโหลดจำนวนมากทั้งหมดของ SQL Server - ยกเว้น ROWS_PER_BATCH ." และใน SSIS 2012 พวกเขาแนะนำปลายทาง OLE DB เพื่อประสิทธิภาพที่ดีขึ้น
nojetlag

คำตอบ:


25

แนวทางทั่วไปหนึ่งประการ:

  1. ปิดการใช้งาน / วางดัชนี / ข้อ จำกัด ในตารางเป้าหมาย
  2. INSERT dbo.[Target] WITH (TABLOCKX) SELECT ...
  3. ด้วยการให้เครดิตกับ JNK แน่นอนคุณสามารถดำเนินการข้างต้นเป็นชุดของnแถวซึ่งสามารถลดความตึงเครียดในบันทึกการทำธุรกรรมและแน่นอนหมายความว่าหากบางชุดล้มเหลวคุณจะต้องเริ่มต้นจากชุดนั้นเท่านั้น ฉัน blogged เกี่ยวกับเรื่องนี้ (ในขณะที่ในการอ้างอิงถึงการลบแนวคิดพื้นฐานเดียวกันใช้) ที่นี่: http://www.sqlperformance.com/2013/03/io-subsystem/chunk-deletes
  4. เปิดใช้งาน / สร้างดัชนี / ข้อ จำกัด อีกครั้งบนตารางเป้าหมาย (และคุณสามารถเลื่อนบางส่วนได้หากไม่จำเป็นสำหรับการดำเนินการทั้งหมดและเป็นสิ่งสำคัญยิ่งกว่าที่จะทำให้ฐานข้อมูลออนไลน์ได้อย่างรวดเร็ว)

หากพาร์ติชันของคุณเป็นแบบฟิสิคัลและไม่ใช่แบบลอจิคัลคุณอาจได้รับเวลาโดยให้กระบวนการที่แตกต่างกันเติมพาร์ติชันต่าง ๆ พร้อมกัน (แน่นอนหมายความว่าคุณไม่สามารถใช้TABLOCK/ TABLOCKX) นี่ถือว่าแหล่งที่มานั้นเหมาะสำหรับการเลือกหลาย ๆ กระบวนการโดยไม่ทับซ้อนกัน / ล็อค ฯลฯ และทำให้ด้านข้างของการดำเนินการนั้นช้าลง (คำแนะนำ: สร้างดัชนีคลัสเตอร์บนแหล่งที่เหมาะสมกับรูปแบบการแบ่งพาร์ติชันบนปลายทาง)

นอกจากนี้คุณยังอาจพิจารณาบางสิ่งบางอย่างมากดั้งเดิมมากขึ้นเช่น/BCP OUTBCP IN

ฉันไม่รู้ว่าฉันจะข้ามไปยัง SSIS เพื่อช่วยในเรื่องนี้ อาจมีประสิทธิภาพอยู่บ้าง แต่ฉันไม่รู้ว่าความพยายามทำให้ประหยัดได้


2
อย่าปล่อยดัชนีแบบสุ่มสี่สุ่มห้า (ดัชนีกลุ่มคลัสเตอร์) หากข้อมูลของคุณไม่ได้ถูกจัดเรียง การวางดัชนีและคาดว่าจะสร้างดัชนีคลัสเตอร์ใหม่อาจเป็นความผิดพลาดครั้งใหญ่เนื่องจากสามารถใช้พื้นที่ทั้งดิสก์ขนาดใหญ่และใช้เวลานาน ฉันไม่ใช่คนแรกที่ได้สัมผัสกับความผิดพลาด ดูที่ "Plan B" คำอธิบายในบทความนี้sqlmag.com/t-sql/... ผู้เขียนมีปัญหาเดียวกัน
jyao

10

เมื่อมองปัญหาของคุณจากมุมมองของ SSIS ฉันรู้สึกว่านี่อาจเป็นสาเหตุที่ทำให้คุณไม่ได้ทำการแบตช์ สิ่งนี้สามารถนำไปสู่แถวจำนวนมากที่เติมไปป์ไลน์ SSIS และสามารถขัดขวางประสิทธิภาพ SSIS ของคุณได้ สิ่งที่คุณต้องทำคือเปลี่ยนแถวของคุณต่อการตั้งค่าแบทช์และขนาดการแทรกสูงสุดของคุณ ตอนนี้สิ่งที่คุณตั้งค่านี้จะขึ้นอยู่กับปริมาณของหน่วยความจำที่มีให้กับเซิร์ฟเวอร์ SSIS ความเร็วดิสก์ของอินสแตนซ์ SQL Server ของคุณคือเท่าไหร่ วิธีที่ดีที่สุดในการทำเช่นนี้คือการทดสอบ ยกตัวอย่างเช่นใช้ 10,000 สิ่งนี้จะส่งแบทช์ไปที่เซิร์ฟเวอร์ 10,000 ในเวลาเพื่อป้องกันไม่ให้ท่อของคุณล้นและจะช่วยให้กระบวนการนี้เร็วขึ้น การตั้งค่าเหล่านี้ตั้งอยู่ในปลายทาง OLEDB ของคุณ

ปลายทาง OLEDB

หากเป็นปัญหาคุณยังสามารถเพิ่มงาน SQL ที่เรียกใช้ก่อนและหลังทำตาม @AaronBertrand แนะนำและลบ / เพิ่มดัชนีหรือข้อ จำกัด ใด ๆ ลงในตาราง


1
มีคำถามที่ดีเกี่ยวกับสิ่งที่ "โหลดเร็ว" รายละเอียดอื่น ๆ บน DBA.SE เป็น: dba.stackexchange.com/questions/141430/...
Jon of All Trades
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.