2013-07-09 13 views
12

में लेनदेन आकार सीमा मैं टेक्स्ट फ़ाइल से SQL सर्वर में बड़ी मात्रा में डेटा लोड कर रहा हूं। वर्तमान में प्रत्येक रिकॉर्ड एक अलग लेनदेन में डाला जाता है (या अपडेट किया जाता है), लेकिन यदि रिकॉर्ड विफल रहता है तो यह डीबी को खराब स्थिति में छोड़ देता है।एसक्यूएल सर्वर

मैं इसे में एक बड़ा लेनदेन में रखना चाहता हूं। मेरे मामले में, मैं ~ 250,000 आवेषण या अपडेट और शायद ~ 1,000,000 प्रश्नों को देख रहा हूं। पाठ फ़ाइल लगभग 60 एमबी है।

क्या पूरे ऑपरेशन को एक लेनदेन में रखना अनुचित है? सीमित कारक क्या है?

उत्तर

10

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

आपको यह विचार करना होगा कि जब आपके पास खुले लेनदेन (आकार के बावजूद) होते हैं, तो दिखने वाली तालिकाओं पर दिखाई देगा, और आपके जैसे लंबे लेन-देन अन्य उपयोगकर्ताओं में अवरुद्ध हो सकते हैं जो उन्हें पढ़ने की कोशिश कर रहे हैं पहर। यदि आप आयात को बड़े और समय लेने वाली होने की उम्मीद करते हैं और सिस्टम लोड हो जाएगा, तो प्रभाव को कम करने के लिए रात (या किसी भी गैर-चरम घंटे) पर पूरी प्रक्रिया करने पर विचार करें।

आकार के बारे में, SQL सर्वर में कोई विशिष्ट आकार सीमा नहीं है, वे सैद्धांतिक रूप से समस्याओं के बिना डेटा की किसी भी मात्रा को संशोधित कर सकते हैं। व्यावहारिक सीमा वास्तव में लक्ष्य डेटाबेस की लेनदेन लॉग फ़ाइल का आकार है। लेनदेन प्रगति पर होने पर डीबी इंजन इस फ़ाइल में सभी अस्थायी और संशोधित डेटा स्टोर करता है (इसलिए यदि आवश्यक हो तो इसे वापस रोल करने के लिए इसका उपयोग कर सकते हैं), इसलिए यह फ़ाइल आकार में बढ़ेगी। इसमें डीबी गुणों में पर्याप्त खाली स्थान होना चाहिए, और फ़ाइल के बढ़ने के लिए पर्याप्त एचडी स्पेस होना चाहिए। साथ ही, पंक्ति या तालिका ताले जो इंजन प्रभावित टेबल पर रखेगा, मेमोरी का उपभोग करता है, इसलिए सर्वर के पास भी इस नलसाजी के लिए पर्याप्त मुफ्त मेमोरी होनी चाहिए। वैसे भी, आम तौर पर 60 एमबी आकार आमतौर पर चिंता करने के लिए बहुत कम है। 250,000 पंक्तियां काफी हैं, लेकिन इतना भी नहीं, इसलिए कोई सभ्य आकार का सर्वर इसे संभालने में सक्षम होगा।

0

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

उदाहरण के लिए मान लीजिए कि शहर आपके डेटाबेस में एक पुन: नियोजित क्षेत्र है और 1,000,000 रिकॉर्ड की फाइल में, आपके पास दस शहर हैं जिनमें कोई शहर नहीं है। शायद उन्हें अपवाद तालिका में भेजना और बाकी को लोड करना सबसे अच्छा है। लेकिन मान लें कि आपके पास 357,8 9 4 रिकॉर्ड नहीं हैं। फिर लोड होने से पहले डेटा को ठीक करने के लिए आपको डेटा प्रदाता के साथ वार्तालाप करने की आवश्यकता हो सकती है। यह निश्चित रूप से प्रोड कम प्रभावित करेगा यदि आप यह निर्धारित कर सकते हैं कि उत्पादन तालिका को प्रभावित करने से पहले फ़ाइल अनुपयोगी है।

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

यदि आप वास्तव में पूरी चीज को वापस लेना चाहते हैं तो कोई भी भाग त्रुटियां, हां आपको लेनदेन का उपयोग करने की आवश्यकता है। यदि आप एसएसआईएस में ऐसा करते हैं, तो आप उस पैकेज के हिस्से पर लेनदेन डाल सकते हैं जहां आप प्रोड टेबल को प्रभावित करते हैं और डेटा के स्टेजिंग और साफ-सफाई भागों में उनके बारे में चिंता नहीं करते हैं।

0

कोई भी या कुछ भी थोक ऑपरेशन करने में कोई समस्या नहीं है, जब तक कि आपके व्यवसाय के लिए एक पूर्ण रोलबैक समस्याग्रस्त न हो। वास्तव में, एक ही लेनदेन बहुत सारी थोक डालने वाली उपयोगिताओं के लिए डिफ़ॉल्ट व्यवहार है।

मैं प्रति पंक्ति एक ही ऑपरेशन के खिलाफ दृढ़ता से सलाह दूंगा। यदि आप खराब डेटा को कम करना चाहते हैं, तो आप डेटा को पहले स्टेजिंग टेबल में लोड कर सकते हैं और प्रो व्याकरणिक रूप से "खराब डेटा" निर्धारित कर सकते हैं और उन पंक्तियों को छोड़ सकते हैं।

3

एसक्यूएल सर्वर उन आकार लेनदेन को संभाल सकता है। हम कई लाख रिकॉर्ड के थोक भार के लिए एक लेनदेन का उपयोग करते हैं।

डेटाबेस ऑपरेशन का सबसे महंगा हिस्सा आमतौर पर क्लाइंट सर्वर कनेक्शन और ट्रैफ़िक होता है। प्रविष्टियों/अपडेट इंडेक्सिंग और लॉगिंग के लिए भी महंगा है, लेकिन आप सही लोडिंग तकनीकों का उपयोग करके उन लागतों को कम कर सकते हैं (नीचे देखें)। आप वास्तव में क्लाइंट और सर्वर के बीच स्थानांतरित कनेक्शन और डेटा की मात्रा को सीमित करना चाहते हैं।

इसके अंत में, आपको एसएसआईएस या सी # का उपयोग एसक्यूएलकल्क कॉपी के साथ डेटा लोड करने पर विचार करना चाहिए। एक बार जब आप सबकुछ लोड करते हैं तो आप अपने डेटा को अपडेट या सत्यापित करने के लिए सर्वर पर सेट आधारित संचालन का उपयोग कर सकते हैं।

डेटा लोड को अनुकूलित करने के बारे में अधिक सुझावों के लिए इस प्रश्न पर एक नज़र डालें। प्रश्न सी # से संबंधित है लेकिन एसएसआईएस या अन्य लोडिंग विधियों के लिए बहुत सारी जानकारी उपयोगी है। What's the fastest way to bulk insert a lot of data in SQL Server (C# client)

संबंधित मुद्दे