หลีกเลี่ยงวิธีการดึงข้อมูล "แถวต่อแถว" เมื่อจัดการกับคอลัมน์ LOB ต้นทาง


12

ฉันมีแหล่งฐานข้อมูล PostgreSQL ดั้งเดิม (ODBC) ที่ฉันพยายามโยกย้ายไปยัง SQL Server schema ใหม่โดยใช้ SSIS ฉันได้รับคำเตือนว่า:

มีการบังคับใช้วิธีการดึงข้อมูล 'Row by Row' เนื่องจากตารางมีคอลัมน์ LOB เนื้อหาคอลัมน์คือ LOB

ไม่มีคอลัมน์ใดต้องเป็น LOB มีบางประเภทที่เป็นข้อความ แต่สามารถใส่ได้อย่างง่ายดายภายใน varchar (สูงสุด) แม้จะเป็นคนแปลกหน้า แต่ส่วนใหญ่แล้วเป็น varchars แต่ดูเหมือนว่ามีอะไรมากกว่า varchar (128) ที่กำลังได้รับการปฏิบัติเสมือนว่าเป็น LOB (เป็นคุณสมบัติล่วงหน้าประเภทของข้อมูลคือ DT_NTEXT)

เหตุการณ์ฉันพยายามทำคำสั่ง SQL ด้วยตนเองซึ่งฉันได้ casted สตริงทุกประเภทให้เป็น varchar ที่มีความยาวที่เหมาะสมในคำสั่ง select และพวกเขายังคงถูกตั้งค่าเป็น DT_NTEXT ในแหล่ง ODBC

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

ในกรณีที่เป็นเรื่องสำคัญฉันกำลังใช้ SSIS-BI 2014 ใน Visual Studio 2013


3
เมื่อคุณแปลงพวกเขาอย่างชัดเจนในระบบต้นทางให้เป็นขนาดที่ไม่ใหญ่สุดนั่นคือในกระแสข้อมูลที่มีอยู่หรือคุณสร้างขึ้นใหม่หรืออย่างน้อยก็เป็นส่วนประกอบแหล่งใหม่สำหรับมัน เมื่อคุณจัดทำเคียวรีที่มีชื่อคอลัมน์เดียวกันและเป็นเพียงประเภท skinnier บางครั้งที่ไม่ได้ลงทะเบียนเป็นการเปลี่ยนแปลงดังนั้นตัวแก้ไขจะไม่ดำเนินการตามกระบวนการรวบรวมข้อมูลเมตา (ซึ่งอาจมีราคาแพง) นอกจากนี้ varchar (สูงสุด) จะถูกใช้เป็น LOB สำหรับการไหลของข้อมูล SSIS และที่อาจส่งผลเสียหายต่อagilebi.com/jwelch/2010/05/11/…
billinkc

ในคอมโพเนนต์แหล่งข้อมูล ODBC คุณมีตัวเลือกให้เลือกตารางหรือใช้แบบสอบถาม นั่นคือสิ่งที่ฉันกำลังคัดเลือกนักแสดง: ในแบบสอบถามที่กำหนดเอง ฉันพูดถึงvarchar(max)เพียงแค่จดชวเลขเพื่อบอกว่าข้อมูลคอลัมน์สามารถพอดีกับขนาด varchar สูงสุดซึ่งประมาณ 4,000 สำหรับวัตถุประสงค์ของ SSIS ฉันไม่ได้จริงหล่ออะไรที่จะvarchar(max); แม้ว่าฉันจะโยนคอลัมน์ไปvarchar(4000)เพื่อความปลอดภัย
Chris Pratt

คำตอบ:


4

ฉันใช้การแปลงข้อมูลสำหรับ varchar ที่ใหญ่กว่า 128 เป็น NTEXT แต่สิ่งที่ลบข้อผิดพลาดสำหรับฉันในที่สุดคือชุดตรวจสอบข้อมูลภายนอกเป็นเท็จ


3

เห็นได้ชัดว่านี่แค่เดือดลง SSIS ที่รักษา varchar ใด ๆ ที่มีขนาดใหญ่กว่า 128 เป็น NTEXT ไม่แน่ใจว่าทำไม อย่างไรก็ตามฉันสามารถไปที่คุณสมบัติขั้นสูงของแหล่งข้อมูล ODBC และเปลี่ยนประเภทกลับไปเป็นแบบ DT_WSTR ซึ่งดูเหมือนว่าจะทำงานได้เป็นส่วนใหญ่

อย่างไรก็ตามฉันได้พิจารณาแล้วว่าบางตารางที่ฉันจัดการจริง ๆ นั้นมีขนาดเกิน 4000 ไบต์ในคอลัมน์ TEXT ของพวกเขาดังนั้นฉันจึงต้องทิ้ง colums เหล่านั้นเป็น DT_NTEXT เพื่อป้องกันการถูกตัดทอน (SSIS จะไม่ยอมให้ คุณตั้งค่าชนิด DT_WSTR ที่มีมากกว่า 4000 ไบต์) ฉันคิดว่าในกรณีเหล่านี้ฉันแค่ติดกับการดึงข้อมูลแบบแถวต่อแถว แต่อย่างน้อยฉันก็สามารถแก้ไขตารางไม่กี่ตาราง


0

วิธีนี้ใช้ได้ผลสำหรับฉัน:

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

ป้อนคำอธิบายรูปภาพที่นี่


0

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

ฉันกำลังแบ่งปันโซลูชันที่ใช้งานได้จริงและมีเสน่ห์สำหรับฉัน วันหนึ่งมีค่าดึงข้อมูลชนิด LOB มากกว่า 30k ใช้เวลาประมาณ 10 นาทีสำหรับฉัน ::

ลด DefaultBufferMaxRows ลงเหลือ 1 และเพิ่ม DefaultBufferSize ให้สูงสุดคือ 100 MB จากนั้นเปลี่ยนซอร์ส ODBC DSN โดยตรวจสอบตัวเลือก 'ถือว่าข้อความยาว varchar' และแมปประเภทข้อมูลจากต้นทางไปยังเป้าหมาย (ไม่มีการเปลี่ยนแปลงในตัวแก้ไขขั้นสูงในแหล่งที่มา)

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