किसी टेक्स्ट फ़ाइल में तालिका निर्यात करने का सबसे तेज़ तरीका क्या है


17

मेरे पास SQL ​​Server 2012 डेटाबेस और 3 मिलियन पंक्तियों और शायद 50 कॉलमों वाली एक तालिका होगी। एक अनअटेंडेड बैकग्राउंड .net प्रक्रिया के लिए सबसे तेज़ तरीका क्या होगा (शायद कुछ SQL या Powershell कमांड जारी करता है) इसे टेक्स्ट फाइल, डेटा की प्रत्येक पंक्ति के लिए एक लाइन एक्सपोर्ट करने के लिए? .Net प्रक्रिया को पता होना चाहिए कि निर्यात समाप्त हो गया है या यदि कोई त्रुटि थी। डेटाटाइप सभी intया होगा nvarchar

मैं यह मान रहा हूं कि select *कमांड को निष्पादित करने के लिए ado.net का उपयोग करने वाला शुद्ध C # कोड और डेटारीडर पर लूपिंग और प्रत्येक रिकॉर्ड के लिए एक फाइल पर लिखना धीमा होगा और ऐसा कोई तरीका नहीं है जिससे मैं इसे समानांतर कर सकूं।

आदर्श रूप से निर्यात दूरस्थ साझा नेटवर्क फ़ोल्डर में होगा और SQL सर्वर मशीन पर स्थानीय फ़ोल्डर नहीं होगा। SQL सर्वर हा क्लस्टर होगा। क्या SSIS इसके लिए बेहतर अनुकूल है, कोई डेटा परिवर्तन की आवश्यकता नहीं है?

.Net प्रक्रिया मशीन A पर चलेगी, मशीन B पर SQL सर्वर और अंतिम फ़ाइल गंतव्य एक नेटवर्क शेयर है। एक विकल्प है SQL सर्वर नेटवर्क साझा करने के लिए सीधे फ़ाइल लिखता है। अन्य विकल्प SQL सर्वर मशीन A को लिखता है और फिर जब फ़ाइल लिखी जाती है .net प्रक्रिया इसे नेटवर्क शेयर में कॉपी कर देती है। मेरे पास औपचारिक एसएलए नहीं है, लेकिन फाइल लिखने के लिए 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 है जिसे आपको इस प्रक्रिया के लिए पूरा करने की आवश्यकता है?
जॉन सीगल

जवाबों:


10

उन सभी लेखों के माध्यम से लूपिंग एक विकल्प है, यदि आप इसे निष्पादित करते हुए देखना चाहते हैं।

कुछ अलग विकल्प जो आपको आज़माने चाहिए:

और आप इन सभी विकल्पों को दूसरे सत्र में पा सकते हैं, बस मज़े के लिए :-)।


4

मैं बस आयात निर्यात विज़ार्ड का उपयोग करूंगा। अंत में आपको कार्य को सहेजने का विकल्प दिया जाता है, जिसे आप SQL सर्वर एजेंट के साथ शेड्यूल कर सकते हैं। अपने आप को एक ऑपरेटर के रूप में जोड़ें और सर्वर पर DB मेल को कॉन्फ़िगर करें, और यह काम पूरा होने या विफल होने पर आपको ईमेल कर सकता है।

गंभीरता से, पहिया को क्यों मजबूत करें?

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


बिल्कुल भी बुरा नहीं है, वास्तव में यह अंत में एक SSIS पैकेज बचाता है। यदि यह एक बार केवल एक कार्य है तो यह एक समाधान हो सकता है।
मैरिअन

2

दूसरों ने कहा है कि बीसीपी सबसे तेज़ तरीका होना चाहिए लेकिन मुझे सीएलआर समाधान पर कोई फायदा नहीं दिख रहा है। डेटाबेस टेबल पर आवेषण पर, विभिन्न थोक कॉपी कार्यान्वयन हमेशा जीतेंगे। यह मुख्य रूप से इस तरह से है कि वे लॉगिंग को कम करते हैं और बहु-थ्रेडेड लेखन को सक्षम करते हैं। फ्लैट फाइल पर लिखते समय आपके पास ये अड़चनें नहीं होती हैं।

मेरे काम पर, हम एक फाइल में क्वेरी आउटपुट डंप करने के लिए एक CLR का उपयोग करते हैं। हम Ionic.Zip.dll को भी शामिल करते हैं ताकि निर्माण के बाद फ़ाइल को स्वचालित रूप से ज़िप किया जा सके।

यहाँ एक उदाहरण दिया गया है, जो op का दावा करता है कि bbs पर bcp से दुगना होने का दावा है: /programming/10325338/fastest-way-to-export-blobs-from-table-into.indateral-files


वह विशेष प्रश्न बहुत विस्तृत नहीं है। मेरा सुझाव है कि आप निम्नलिखित प्रश्न पढ़ें - यहाँ BLOB डेटा के लिए BCP प्रदर्शन का अनुकूलन करना । यह निश्चित रूप से बीसीपी केवल :-) के साथ आपके पास खेलने के कई विकल्पों के बारे में एक विचार देगा।
मैरियन

मैं लिंक देखता हूं और पूरी तरह से सहमत हूं। लेकिन अधिकांश अनुकूलन बिंदु एसक्यूएल सर्वर में डेटा लोड करने के लिए हैं। जब तक किसी फ्लैट फाइल में sql data लिखता है, तब तक मुझे किसी स्ट्रीमराइटर या filestream CLR सॉल्यूशन की तुलना में bcp से संबंधित किसी भी तथ्य को देखना बाकी है।
ब्रायन

1

आप एक साधारण SSIS पैकेज बना सकते हैं:

यहाँ एक उच्च-स्तर है कि कैसे:

  1. कनेक्शन प्रबंधक में डेटाबेस के लिए एक OLEDB कनेक्शन बनाएं
  2. डेटा फ़्लो ट्रांसफ़ॉर्मेशन को कंट्रोल फ़्लो में खींचें और फिर डेटा फ़्लो में जाने के लिए उस पर क्लिक करें।
  3. डेटा प्रवाह में टूलबॉक्स से एक OLEDB स्रोत खींचें, और इसे संपादित करें ताकि चरण 1 में आपके द्वारा बनाए गए कनेक्शन का उपयोग करके यह आपकी इच्छित तालिका से कनेक्ट हो जाए
  4. टूलबॉक्स से एक फ्लैट फ़ाइल गंतव्य को डेटा प्रवाह में खींचें और OLEDB स्रोत को इससे कनेक्ट करें।
  5. फ्लैट फ़ाइल गंतव्य में "नया" चुनें, और यह एक ही कॉलम संरचना के साथ एक नई फ्लैट फ़ाइल बनाएगा, और यदि आप चाहें तो अपने वांछित सीमांकक का उपयोग कर सकते हैं, या शायद फ़ाइल के साथ एक निश्चित।
  6. चलाओ।

किसी भी दोपहर को यह पता लगाने में सक्षम होना चाहिए। एक एंटी-जीयूआई व्यक्ति इस समाधान को पसंद नहीं करेगा, इसलिए उस संबंध में टिप्पणियों को सहेजें, यह कम-तकनीक प्रेमी व्यक्तियों के लिए एक विकल्प है जो बीसीपी का उपयोग करके संघर्ष करते हैं ...

आपके पास डेटा फ़ाइल को स्वरूपित करने के तरीके में थोड़ा अधिक लचीलापन है। आप बीसीपी और उस सभी में ऐसा कर सकते हैं, लेकिन यह जटिलता को बाहर ले जाता है। लेकिन एक छोटा सा फायदा है जैसा कि आप कस्टम फ़ाइल हेडर में रख सकते हैं, और पहली पंक्ति के रूप में "कॉलम नाम" बना सकते हैं, जो फ्लैट फ़ाइल को अधिक मानव उपभोग्य बनाता है।

इसे बचाने के लिए मत भूलना, अगर आपने इसे एक बार बनाया है, तो आपको फिर से पूछा जाएगा! उम्मीद है की यह मदद करेगा..


0

मुझे लगता है कि कमांडलाइन से bcp.exe सबसे तेज़ तरीका होना चाहिए।

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


5
जब आप सही हो सकते हैं, तो क्या आप इस समाधान के बारे में विवरण पर कुछ प्रकाश डाल सकते हैं? इसका उपयोग कैसे किया जाता है (डॉक्स के लिए एक लिंक पर्याप्त हो सकता है), आपको क्यों लगता है कि यह तेज़ है आदि
dezso
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.