SqlBulkCopy के लिए अनुशंसित बैच आकार क्या है?


87

के लिए अनुशंसित बैच आकार क्या है SqlBulkCopy? मैं एक सामान्य सूत्र की तलाश कर रहा हूं जिसे मैं प्रदर्शन ट्यूनिंग के लिए शुरुआती बिंदु के रूप में उपयोग कर सकता हूं।

जवाबों:


97

मेरी SQL सर्वर आवृत्ति के समान भौतिक सर्वर पर आयात उपयोगिता है। एक कस्टम का उपयोग करते हुए IDataReader, यह फ्लैट फ़ाइलों को पार्स करता है और उन्हें एक डेटाबेस में उपयोग करके सम्मिलित करता है SQLBulkCopy। एक विशिष्ट फ़ाइल में लगभग 6M योग्य पंक्तियाँ, औसत 5 कॉलम दशमलव और लघु पाठ, लगभग 30 बाइट प्रति पंक्ति है।

इस परिदृश्य को देखते हुए, मैंने गति और मेमोरी खपत का सबसे अच्छा समझौता होने के लिए 5,000 का बैच आकार पाया। मैंने 500 से शुरुआत की और बड़े प्रयोग किए। मुझे ५००० से २.५x अधिक तेज, औसतन ५०० से अधिक पाया गया। ६ मिलियन पंक्तियों को सम्मिलित करने में ५००० के आकार के साथ ३० सेकंड लगते हैं और ५०० के बैच के आकार के साथ लगभग with० सेकंड का।

10,000 औसतन तेज़ नहीं थे। 50,000 तक बढ़ने से कुछ प्रतिशत अंकों की गति में सुधार हुआ लेकिन यह सर्वर पर बढ़े हुए भार के लायक नहीं है। 50,000 से ऊपर की गति में कोई सुधार नहीं हुआ।

यह कोई सूत्र नहीं है, लेकिन इसका उपयोग करने के लिए एक और डेटा बिंदु है।


3
एक बात पर विचार करें कि क्या तालिका खाली है और इसमें अनुक्रमित हैं। उन मामलों में, जो आप यहां बताए अनुसार एक बैच में सब कुछ अपलोड करना चाहते हैं: Technet.microsoft.com/en-us/library/ms177445(v=sql.105).aspx "यदि आप अनुक्रमित तालिका में रिक्त तालिका में डेटा आयात करते हैं और आप बैच आकार को निर्दिष्ट करते हैं, पहले बैच के बाद तालिका गैर-रिक्त हो जाती है। दूसरे बैच के साथ शुरू होने पर, डेटा पूरी तरह से लॉग-इन होता है। खाली अनुक्रमित तालिकाओं के लिए, एक ही बैच में थोक आयात करने पर विचार करें। "
सला

SqlBulkCopy Sql के लिए स्रोत (जैसे DataTable) से डेटा स्ट्रीम करता है तो "सर्वर पर लोड बढ़ गया" क्या यह एक बड़े बैच आकार पर है? (उदा। 50,000)
बोर्नटकोड

29

यह एक ऐसा मुद्दा है जिस पर मैंने कुछ समय बिताया है। मैं C # कंसोल एप्लिकेशन (.Net 2.0) का उपयोग करके SQL Server 2005 डेटाबेस में बड़ी CSV फ़ाइलों (16+ GB, 65+ मिलियन रिकॉर्ड्स, और बढ़ते) को आयात करना चाहता हूँ। जेरेमी के रूप में ने पहले ही बताया है , आपको अपने विशेष परिस्थितियों के लिए कुछ ठीक करने की आवश्यकता होगी, लेकिन मेरा सुझाव है कि आपके पास प्रारंभिक बैच का आकार 500 होगा, और इसके ऊपर और नीचे दोनों मानों का परीक्षण करें।

मुझे इस MSDN फोरम पोस्ट से बैच आकार के लिए 100 और 1000 के बीच मूल्यों का परीक्षण करने की सिफारिश मिली , और संदेह था। लेकिन जब मैंने 100 और 10,000 के बीच बैच के आकार का परीक्षण किया, तो मैंने पाया कि 500 ​​मेरे आवेदन के लिए इष्टतम मूल्य था। के लिए 500 मूल्यSqlBulkCopy.BatchSize की भी सिफारिश की गई है

अपने SqlBulkCopy ऑपरेशन को और अनुकूलित करने के लिए, इस MSDN सलाह को देखें ; मुझे लगता है कि SqlBulkCopyOptions.TableLock का उपयोग करने से लोडिंग समय को कम करने में मदद मिलती है।


मुझे लगता है कि सर्वर में थोक कॉपी कमांड चलाने के लिए संभवत: तेज होगा।
कप्तान केनपाची

16

जैसा कि दूसरों ने कहा है, यह आपके वातावरण पर निर्भर करता है विशेष रूप से पंक्ति मात्रा और नेटवर्क विलंबता।

व्यक्तिगत रूप से, मैं BatchSizeसंपत्ति को 1000 पंक्तियों में सेट करने के साथ शुरू करूँगा और देखूंगा कि यह कैसा प्रदर्शन करता है। यदि यह काम करता है, तो मैं समय-सीमा होने तक पंक्तियों की संख्या (जैसे 2000, 4000, आदि) को दोगुना रखता हूं।

अन्यथा, यदि कोई टाइमआउट 1000 पर होता है, तो मैं पंक्तियों की संख्या को आधे से कम कर देता हूं (जैसे 500) जब तक यह काम नहीं करता है।

प्रत्येक मामले में, मैं एक मीठे स्थान का पता लगाने तक अंतिम दो प्रयास किए गए बैच आकारों में से प्रत्येक के बीच के अंतर को दोगुना (यदि सफल) या आधा (यदि विफल रहा है) रखता हूं ।

विचार करने के लिए अन्य कारक पंक्तियों के एकल बैच को कॉपी करने में कितना समय लगता है । टाइमआउट तब होगा जब कॉपी की जा रही बैच BulkCopyTimeoutसंपत्ति से अधिक हो जो डिफ़ॉल्ट रूप से 30 सेकंड हो। आप BulkCopyTimeoutसंपत्ति को 60 सेकंड तक दोगुना करने का प्रयास कर सकते हैं। यह बैच पंक्तियों के एक बड़े सेट की प्रतिलिपि बनाने के लिए अधिक समय की अनुमति देता है। उदाहरण के लिए, 50,000 पंक्तियों के एक बैच को लगभग 40 सेकंड लग सकते हैं, जो कि 30 सेकंड की समय सीमा को पार कर सकता है इसलिए इसे 60 सेकंड तक उछाल देना प्रदर्शन के साथ मदद कर सकता है।


4

यह सब आपके कार्यान्वयन पर निर्भर करता है।

आप अपने नेटवर्क पर किस तरह की गति की उम्मीद कर सकते हैं? क्या आप इसे फॉर्म या ASP.Net में उपयोग कर रहे हैं? क्या आपको प्रगति के उपयोगकर्ता को सचेत करने की आवश्यकता है? कुल नौकरी का आकार क्या है?

एक बैच आकार के बिना बल्क कॉपी चलाने के मेरे अनुभव में, टाइमआउट मुद्दों का कारण होगा। मुझे 1000 रिकॉर्ड्स के साथ कुछ शुरू करना और वहां से कुछ समायोजन करना पसंद है।


गति: भिन्न, WebForms: हाँ, ASP.NET: हाँ, वाइड टेबल्स: हाँ, संकीर्ण तालिकाएँ, हाँ। हजारों पंक्तियाँ: हाँ। लाखों पंक्तियाँ: हाँ। यदि आप एक परिदृश्य के बारे में सोच सकते हैं, तो मैं शायद कर रहा हूं।
जोनाथन एलन

1
मुझे अपने पिछले उत्तर से चिपकना होगा। मुझे नहीं लगता कि चांदी की गोली है।
जेरेमी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.