SQL BULK इन्सर्ट / BCP एक्सपोर्ट के बाद इस्तेमाल की गई मेमोरी को मुक्त नहीं किया गया


10

मैंने निम्नलिखित के रूप में एक बहुत ही मूल SQL तालिका बनाई है

CREATE TABLE [dbo].[TickData](
[Date] [varchar](12) NULL,
[Time] [varchar](12) NOT NULL,
[Symbol] [varchar](12) NOT NULL,
[Side] [varchar](2) NOT NULL,
[Depth] [varchar](2) NOT NULL,
[Quote] [varchar](12) NOT NULL,
[Size] [varchar](18) NOT NULL
    ) ON [PRIMARY]

मैंने तब एक 3 गिग बल्क इंसर्ट किया

    BULK
    INSERT TickData
    FROM 
    'C:\SUMO.csv'
    GO

तब SQL सर्वर के लिए RAM का उपयोग स्काईरॉकिंग हो गया, ~ 30Go RAM खा गया:

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

मुझे लगता है कि यह एक असामान्य व्यवहार है और इससे बचने के लिए कार्रवाई की जा सकती है।

संपादित करें:
ठीक है, यह डिफ़ॉल्ट व्यवहार लगता है। काफी उचित।
हालाँकि, बल्क इंसर्ट ख़त्म होने के बाद मेमोरी लंबे समय तक मुक्त क्यों नहीं होती है?

कुछ अतिरिक्त विचार:
SQL सर्वर के बारे में टिप्पणी के रूप में जब यह "ओएस द्वारा" को बताया गया है, तो मेमोरी को मुक्त करने के बारे में, 24-कोर 32 Gb Xeon सर्वर पर मेरे हाथ का अनुभव यह साबित होता है: मेमोरी-वोरेसिक BCP निकालने के बाद एक बार मेरे पास अपने डेटा प्रोसेसिंग एप्लिकेशन के .Net इंस्टेंसेस का एक पूल है जिसे निकाले गए डेटा को संसाधित करने की आवश्यकता है, और वे अपनी नौकरी करने की कोशिश करने के लिए शेष मेमोरी को साझा करने के लिए घुट / लड़ रहे हैं, जो कि faaaaar को लंबे समय तक ले जाते हैं जब SQL सर्वर चालू होता है सभी एप्लिकेशन साझा करने के लिए ऑफ और मेमोरी उपलब्ध है। मुझे सब कुछ सुचारू रूप से करने के लिए SQL सर्वर एजेंट को रोकना होगा और Apps को Articiallt के कारण दुर्घटनाग्रस्त होने से रोकना होगा जो OutOfMemmroy अपवाद है। कृत्रिम क्रूर मेमोरी कैपिंग / लिमिटेशन के अनुसार, यदि मुफ्त मेमोरी उपलब्ध है, इसका उपयोग क्यों नहीं करते? आदर्श रूप में यह बल्कि केवल जबरन "बेतरतीब ढंग से" सीमित होने के बजाय जो उपलब्ध है, उसके अनुकूल होने के लिए अनुकूल रूप से निर्धारित किया जाएगा। लेकिन मुझे लगता है कि यह बाय-डिज़ाइन है, इसलिए इस अंतिम बिंदु पर मामला बंद हो गया।


6
SQL सर्वर को मेमोरी खाली क्यों करनी चाहिए? यदि इसे एक बार इस ऑपरेशन को करने के लिए मेमोरी की आवश्यकता है, तो इसे फिर से इसकी आवश्यकता होगी। यदि SQL सर्वर ने मेमोरी जारी की है, तो आप इसके लिए क्या उपयोग करेंगे? स्मृति को मुक्त होने की आवश्यकता क्यों है? यदि आप मेमोरी का उपयोग किसी और चीज़ के लिए करते हैं, तो यह बल्क इंसर्ट फिर से चलता है, तो क्या होना चाहिए?
हारून बर्ट्रेंड

इससे बचने के लिए आप केवल वही क्रिया कर सकते हैं जो अधिकतम मेमोरी साइज़ सेट करे। स्मृति को "पुनर्प्राप्त" करने के लिए, आप SQL सर्वर सेवा को पुनरारंभ कर सकते हैं। जाहिर है, यह मेमोरी को रिलीज़ करेगा, और जब सेवा फिर से शुरू होगी तो यह आम तौर पर मेमोरी आवंटित करेगा।
TMN

मैंने पिछले संपादन को साफ किया। यदि आप SQL सर्वर (या किसी अन्य DB इंजन) के गुण या मुद्दों के बारे में तर्क / चर्चा करना चाहते हैं, तो कृपया इसे करने के लिए एक बेहतर स्थान खोजें। मूल प्रश्न का उत्तर दिया गया है, जाहिरा तौर पर सही ढंग से और पर्याप्त रूप से। यदि यह क्यू रेंगता रहता है तो यह बंद हो सकता है।
JNK

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

3
इसके अलावा, एक गैर मॉडरेटर के रूप में, मैं सोच रहा हूं कि आप अपने सर्वर पर गैर-SQL चीजें क्यों चला रहे हैं? बॉक्स को बस SQL ​​सर्वर के लिए आरक्षित किया जाना चाहिए, यह DBA 101 की तरह है। इंजन को साझा संसाधन वातावरण के लिए डिज़ाइन नहीं किया गया था।
जेएनके जुएल

जवाबों:


12

SQL सर्वर के लिए यह सामान्य व्यवहार है कि वह बफ़र पूल में जितनी मेमोरी हो सके आवंटित करे। डेटाबेस बहुत सारे बफर के साथ सबसे अच्छा काम करते हैं। यदि आप व्यवहार को बदलना चाहते हैं, तो आप 'अधिकतम सर्वर मेमोरी' सेटिंग सेट कर सकते हैं । उस पर कुछ अच्छी पृष्ठभूमि पढ़ना यहाँ है।


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

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

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

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

1
@AaronBertrand ठीक है, मैं गलत हो सकता हूं, लेकिन जैसा कि मेरे नए अंतिम संपादन में कहा गया है, यह वह नहीं है जो मैंने देखा है: मेमोरी को मुक्त नहीं किया गया था जब अन्य एप्लिकेशन को इसकी सख्त जरूरत थी, जिससे मेमोरी क्रैश (इसलिए मेरा असंतोष ...): विषय को बंद करें, मुझे लगता है कि इससे अधिक बहस करने की कोई वास्तविक आवश्यकता नहीं है।
मेहदी लामरानी 19

7

यदि आप वास्तव में चाहते हैं कि ओएस SQL ​​सर्वर से मेमोरी वापस ले, तो एक बड़ी 20 जीबी फ़ाइल लें और इसे नेटवर्क पर कॉपी करें। एसक्यूएल सर्वर मेमोरी को जारी करेगा क्योंकि ओएस को इसकी आवश्यकता है। लेकिन मैं कई तरह के प्रदर्शन काउंटरों को देख रहा हूँ, जबकि यह चल रहा है, और देखें कि आपके BULK INSERT का प्रदर्शन कैसे बदलता है यदि आप इसे फिर से चलाते हैं या जब कॉपी चल रही होती है या उसके तुरंत बाद।

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

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

यह मज़ेदार है, यदि आप "SQL सर्वर क्यों नहीं करते हैं" के लिए Google खोज टाइप करते हैं, तो सबसे सामान्य ऑटो-समापन "रिलीज़ मेमोरी" है।



"आप जो अपेक्षा करते हैं वह अधिक लचीला व्यवहार है।" बिल्कुल सही। मैं चाहता हूं कि SQL सर्वर उपलब्ध होने पर सभी avaialble मेमोरी का उपयोग करें, लेकिन जब ये भारी क्षण समाप्त हो जाते हैं, तो "स्लीप" स्थिति में वापस जाने के लिए और अन्य मेमोरी-आवश्यकता वाले अनुप्रयोगों को छोड़ने के लिए अपना काम पूरी तरह से करें (आप मेरे बारे में देख सकते हैं) इस मुद्दे पर नए अंतिम संपादन)
मेहदी LAMRANI

यह बताने के लिए कि मुझे ऐसा करने की आवश्यकता क्यों है, एक ठोस मामले के लिए, आप प्रश्न के निचले भाग में JNK पर मेरी आखिरी टिप्पणी देख सकते हैं
मेहदी लमरानी

4

यह दुर्भाग्य से डिजाइन द्वारा है, कृपया इस पोस्ट को देखें। हालाँकि, इस पोस्ट में यह आपको कुछ निर्देश देता है कि इसे कैसे नियंत्रित किया जाए।

/server/251832/sql-server-bulk-insert-physical-memory-issue

मेमोरी आवंटन संपादित करें

मेमोरी freedअप नहीं है क्योंकि यह मेमोरी को .NET एप्लीकेशन की तरह आवंटित करता है। चूंकि स्मृति आबंटन महंगा है, यह उस आबंटन पर रोक रखेगा जब तक कि OS अनुरोध नहीं करता। लेकिन, डर नहीं है, अगर ओएस चाहता है कि मेमोरी उसे मिल जाएगी, जैसे कि यह एक .NET अनुप्रयोग में करता है।


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

जानकार अच्छा लगा। मेरे पास 24 करोड़ हैं इसलिए अभी के लिए यह ठीक है। लेकिन बल्क इंसर्ट खत्म होने के बाद मेमोरी को फ्रीज क्यों नहीं किया जाता है?

जब तक बल्क इंसर्ट पूरा हो जाता है, अगर OS ​​को मेमोरी की जरूरत होती है, तो इसे दिया जाएगा, लेकिन यह .NET एप्लीकेशन की तरह मेमोरी को आवंटित करता है, ताकि अगर इसे जरूरत हो और कोई और इसे तेजी से एक्सेस कर सके।

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