วิธีที่เร็วที่สุดในการส่งออกตารางไปยังไฟล์ข้อความคืออะไร


17

ฉันจะมีฐานข้อมูล SQL Server 2012 และตารางที่มี 3 ล้านแถวและอาจ 50 คอลัมน์ สิ่งใดจะเป็นวิธีที่เร็วที่สุดสำหรับกระบวนการเบื้องหลัง. net (อาจออกคำสั่ง SQL หรือ Powershell) เพื่อส่งออกไปยังไฟล์ข้อความหนึ่งบรรทัดสำหรับแต่ละแถวของข้อมูล? กระบวนการ. net ควรทราบเมื่อการส่งออกเสร็จสิ้นหรือมีข้อผิดพลาดใด ๆ ประเภทข้อมูลจะทั้งหมดหรือintnvarchar

ฉันสมมติว่ารหัส C # บริสุทธิ์โดยใช้ ado.net เพื่อดำเนินการselect *คำสั่งและวนซ้ำไปที่ชุดข้อมูลและการเขียนไปยังไฟล์สำหรับแต่ละระเบียนจะช้าและไม่มีวิธีใดที่ฉันสามารถทำให้ขนานกันได้

เป็นการดีที่การส่งออกจะไปยังโฟลเดอร์เครือข่ายระยะไกลที่ใช้ร่วมกันไม่ใช่โฟลเดอร์บนเครื่อง SQL Server SQL Server จะเป็นคลัสเตอร์ HA SSIS เหมาะสมกับสิ่งนี้มากกว่าหรือไม่ไม่จำเป็นต้องแปลงข้อมูล

กระบวนการ. Net จะทำงานบน Machine A, SQL Server บน Machine B และปลายทางไฟล์ที่ดีที่สุดคือการแชร์เครือข่าย ทางเลือกหนึ่งคือเซิร์ฟเวอร์ SQL จะเขียนไฟล์โดยตรงไปยังเครือข่ายที่ใช้ร่วมกัน ตัวเลือกอื่นคือ SQL Server เขียนไปยังเครื่อง A แล้วเมื่อไฟล์ถูกเขียนกระบวนการ. net คัดลอกไปยังเครือข่ายที่ใช้ร่วมกัน ฉันไม่มี SLA ที่เป็นทางการ แต่คาดว่าจะใช้เวลา 30 นาที - 1 ชั่วโมงสำหรับการเขียนไฟล์


3
"Ideally the export will be to a remote shared network folder and not a local folder on the SQL Server machine."- แอพ. NET จะเรียกใช้จากที่ไหน กรณีที่เลวร้ายที่สุดนี่อาจหมายความว่าข้อมูลจะต้องเคลื่อนผ่านเครือข่าย 2 ฮ็อปซึ่งอาจเป็นคอขวดที่ใหญ่ที่สุด นอกจากนี้จำนวนแถวไม่เกี่ยวข้องเลย - ขนาดข้อมูลโดยรวมประมาณเท่าใด คุณมี SLA ของประสิทธิภาพที่คุณต้องการสำหรับกระบวนการนี้หรือไม่?
Jon Seigel

คำตอบ:


10

การวนลูปผ่านบทความเหล่านี้ทั้งหมดเป็นตัวเลือกถ้าคุณต้องการดูเก่าให้ดำเนินการ

ตัวเลือกต่าง ๆ ที่คุณควรลองคือ:

และคุณสามารถลองใช้ตัวเลือกทั้งหมดเหล่านี้ในขณะที่วนรอบในเซสชั่นอื่นเพียงเพื่อความสนุกสนาน :-)


4

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

อย่างจริงจังทำไมบูรณาการล้อ?

http://msdn.microsoft.com/en-us/library/ms140052.aspx


ไม่เลวเลยจริง ๆ แล้วนี่เป็นการบันทึกแพ็คเกจ SSIS ในตอนท้าย ถ้ามันเป็นงานเพียงครั้งเดียวก็สามารถเป็นทางออกได้
แมเรียน

2

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

ที่ทำงานของฉันเราใช้ CLR เพื่อดัมพ์เอาต์พุตเคียวรีไปยังไฟล์ นอกจากนี้เรายังรวมIonic.Zip.dllเพื่อให้สามารถซิปไฟล์โดยอัตโนมัติหลังการสร้าง

นี่คือตัวอย่างที่ op อ้างว่าเร็วกว่า bcp บน blobs สองเท่า: /programming/10325338/fastest-way-to-export-blobs-from-table-into-indo-indows-files


คำถามนั้นไม่ละเอียดมากนัก ฉันขอแนะนำให้คุณอ่านคำถามต่อไปนี้ - การเพิ่มประสิทธิภาพ BCP สำหรับข้อมูล BLOB ที่นี่ มันจะให้ความคิดเกี่ยวกับตัวเลือกการเล่นมากมายที่คุณมีกับ BCP เท่านั้น :-)
แมเรียน

ฉันเห็นลิงก์และเห็นด้วยอย่างเต็มที่ แต่จุดเพิ่มประสิทธิภาพส่วนใหญ่ใช้สำหรับการโหลดข้อมูลลงในเซิร์ฟเวอร์ sql ฉันยังไม่เห็นข้อเท็จจริงใด ๆ ที่เกี่ยวข้องกับ bcp ที่เร็วกว่าสตรีมเมอร์หรือการแก้ปัญหา CLR สตรีมเมื่อเขียนข้อมูล sql ไปยังไฟล์แฟล็ต
ไบรอัน

1

คุณสามารถสร้างแพ็คเกจ SSIS แบบง่าย ๆ ได้:

นี่คือวิธีการระดับสูง:

  1. สร้างการเชื่อมต่อ OLEDB ไปยังฐานข้อมูลในเครื่องมือจัดการการเชื่อมต่อ
  2. ลากการแปลงการไหลของข้อมูลลงในการควบคุมการไหลแล้วคลิกที่มันเพื่อไปที่การไหลของข้อมูล
  3. ลากแหล่ง OLEDB จากกล่องเครื่องมือลงในการไหลของข้อมูลและแก้ไขเพื่อให้มันเชื่อมต่อกับตารางที่คุณต้องการโดยใช้การเชื่อมต่อที่คุณสร้างในขั้นตอนที่ 1
  4. ลาก Flat File Destination จากกล่องเครื่องมือลงในโฟลว์ข้อมูลและเชื่อมต่อแหล่ง OLEDB เข้ากับมัน
  5. เลือก "ใหม่" ในแฟลตไฟล์ปลายทางและมันจะสร้างไฟล์แฟลตใหม่ที่มีโครงสร้างคอลัมน์เดียวกันและคุณสามารถใช้ตัวคั่นที่คุณต้องการหรืออาจจะแก้ไขด้วยไฟล์ถ้าคุณชอบที่
  6. เรียกใช้

Noob ใด ๆ ควรจะสามารถเข้าใจได้ คน Anti-GUI จะไม่ชอบวิธีนี้ดังนั้นให้บันทึกความคิดเห็นเกี่ยวกับเรื่องนี้เป็นเพียงทางเลือกสำหรับผู้ที่มีความชำนาญด้านเทคโนโลยีน้อยกว่าซึ่งต่อสู้กับการใช้ BCP ...

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

อย่าลืมบันทึกถ้าคุณสร้างครั้งเดียวคุณจะถูกถามอีกครั้ง! หวังว่านี่จะช่วย ..


0

ฉันคิดว่า bcp.exe จาก commandline ควรเป็นวิธีที่เร็วที่สุด

http://msdn.microsoft.com/en-us/library/ms162802.aspx


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