โหมดการเข้าถึงข้อมูล SSIS Data Flow - จุดของ 'ตารางหรือมุมมอง' กับโหลดเร็วคืออะไร


9

การใช้ SQL Server Business Intelligence Development Studio ฉันทำไฟล์แฟล็ตจำนวนมากไปยังข้อมูลปลายทาง OLE DB เพื่อนำเข้าข้อมูลไปยังตาราง SQL Server ของฉัน ภายใต้ "โหมดการเข้าถึงข้อมูล" ในในตัวแก้ไขปลายทางของ OLE DB ค่าเริ่มต้นคือ "ตารางหรือมุมมอง" แทนที่จะเป็น "ตารางหรือมุมมอง - โหลดเร็ว" อะไรคือความแตกต่าง; ความแตกต่างที่มองเห็นได้เพียงอย่างเดียวที่ฉันสามารถรับรู้ได้คือโหลดเร็วโอนข้อมูลเร็วขึ้นมาก

คำตอบ:


13

โหมดการเข้าถึงข้อมูลของ OLE DB Destination Component มีสองรสชาติคือรวดเร็วและไม่เร็ว

เร็วไม่ว่าจะเป็น "ตารางหรือมุมมอง - โหลดเร็ว" หรือ "ตัวแปรชื่อตารางหรือมุมมอง - โหลดเร็ว" หมายความว่าข้อมูลจะถูกโหลดในรูปแบบที่กำหนด

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

ทำไมคุณถึงต้องการวิธีที่ไม่เร็ว ข้อมูลไม่ถูกต้อง ถ้าฉันส่งข้อมูลไป 10,000 แถวและแถวที่ 9999 มีวันที่ 2015-02-29 คุณจะมีแทรกอะตอม 10k และกระทำ / ย้อนกลับ ถ้าฉันใช้วิธีรวดเร็วชุดทั้งหมดของแถว 10k นั้นจะบันทึกทั้งหมดหรือไม่มีเลย และถ้าคุณต้องการทราบว่ามีข้อผิดพลาดแถวใดระดับของความละเอียดต่ำสุดที่คุณจะได้คือ 10k แถว

ขณะนี้มีวิธีในการรับข้อมูลที่โหลดเร็วที่สุดเท่าที่จะทำได้และยังคงจัดการกับข้อมูลที่สกปรก มันเป็นวิธีการล้มเหลวแบบเรียงซ้อนและดูเหมือนว่า

เรียงซ้อนล้มเหลวแทรก

แนวคิดก็คือคุณจะพบขนาดที่เหมาะสมในการแทรกให้มากที่สุดเท่าที่จะเป็นไปได้ในนัดเดียว แต่ถ้าคุณได้รับข้อมูลที่ไม่ดี นี่ฉันเริ่มต้นด้วยการกระทำสูงสุดแทรกขนาด (FastLoadMaxInsertCommit) ของ 10000 ในการจำหน่ายข้อผิดพลาดแถวผมเปลี่ยนไปจากRedirect RowFail Component

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

ฉันเพิ่มองค์ประกอบที่สามลงในมิกซ์ครั้งนี้ฉันบันทึกเป็นแบตช์ 1 หรือคุณสามารถเปลี่ยนโหมดการเข้าถึงตารางออกจากรุ่นโหลดเร็วเพราะมันจะให้ผลลัพธ์เดียวกัน เราจะบันทึกแต่ละแถวแยกกันและจะช่วยให้เราสามารถทำ "บางสิ่ง" ด้วยแถวที่ไม่ดีเดียว

ในที่สุดฉันมีปลายทางที่ไม่ปลอดภัย บางทีมันอาจจะเป็น "เดียวกัน" ตารางเป็นปลายทางที่ตั้งใจ nvarchar(4000) NULLแต่คอลัมน์ทั้งหมดที่มีการประกาศให้เป็น ไม่ว่าจะสิ้นสุดที่ตารางนั้นจะต้องมีการวิจัยและทำความสะอาด / ทิ้งหรือสิ่งที่กระบวนการแก้ไขข้อมูลที่ไม่ดีของคุณคือ คนอื่น ๆ ถ่ายโอนไปยังไฟล์แฟลต แต่จริงๆแล้วอะไรก็ตามที่เหมาะสมกับวิธีที่คุณต้องการติดตามข้อมูลที่ไม่ดี


5

โหลดเร็วมีการบันทึกไว้เป็นอย่างดีภายใต้ตัวเลือก FAST LOAD

  • เก็บค่าเอกลักษณ์จากไฟล์ข้อมูลที่นำเข้าหรือใช้ค่าที่ไม่ซ้ำกันที่กำหนดโดย SQL Server

  • เก็บค่า null ไว้ระหว่างการดำเนินการโหลดจำนวนมาก

  • ตรวจสอบข้อ จำกัด ในตารางเป้าหมายหรือมุมมองในระหว่างการดำเนินการนำเข้าจำนวนมาก

  • รับการล็อกระดับตารางสำหรับช่วงเวลาของการดำเนินการโหลดจำนวนมาก ระบุจำนวนแถวในชุดและขนาดการกระทำ


อะไรคือความแตกต่าง; ความแตกต่างที่มองเห็นได้เพียงอย่างเดียวที่ฉันสามารถรับรู้ได้คือโหลดเร็วโอนข้อมูลเร็วขึ้นมาก

ภายใต้ประทุนtable or viewจะใช้คำสั่ง SQL แต่ละคำสั่งสำหรับทุกแถวเพื่อแทรก vs table or view - with fast loadจะใช้คำสั่ง BULK INSERT

หากคุณเห็นตัวเลือกด้านบนที่มีอยู่ในBULK INSERTเช่นnumber of rows in the batch= ROWS_PER_BATCHและ commit size=BATCHSIZE

สถานการณ์อื่นจะเป็น ..

ขนาดการแทรกสูงสุดของ Commit เริ่มต้น (2147483647) สูงเกินไป ดังนั้นสำหรับตัวอย่างเช่นคุณกำลังแทรกแถว 500K และเนื่องจากการละเมิด PK ชุดงานล้มเหลว ในสถานการณ์นี้ชุดทั้งหมดจะล้มเหลวเมื่อคุณใช้ตัวเลือกโหลดเร็ว คุณจะไม่สามารถรับคำอธิบายข้อผิดพลาดได้เช่นกัน

ที่นี่คุณสามารถมีtable or viewเอาต์พุตข้อผิดพลาดปลายทางได้ จาก 500K คุณใช้ FAST LOAD โดยเริ่มจากขนาดการคอมมิตที่ 5K หาก 1 แถวในชุดนั้นล้มเหลวคุณจะเปลี่ยนเส้นทางชุด 5K ที่จะtable or viewโหลด - ซึ่งใช้การแทรกแบบแถวต่อแถวสำหรับแถว 5K เท่านั้นและคุณสามารถเปลี่ยนเส้นทางข้อผิดพลาดของtable or viewไฟล์แบบแฟลต .. เพื่อให้แถวใดแถวหนึ่งล้มเหลวในชุดงาน ถ้า 5K คุณจะสามารถระบุสิ่งที่ทำให้เกิดความล้มเหลวได้

ข้อดีของวิธีการข้างต้นคือหากไม่มีแถวใดล้มเหลวก็จะใช้ BULK INSERT (โหลดเร็ว) สำหรับชุดทั้งหมด

SSIS แฟนbillinkc ตอบคำถามที่คล้ายกันใน StackOverflow

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.