2008-09-17 17 views
31

पर उत्सुक स्पूल ऑपरेशंस से बचने के तरीके मेरे पास एक ईटीएल प्रक्रिया है जिसमें एक संग्रहीत प्रक्रिया शामिल है जो SELECT INTO कथन का भारी उपयोग करता है (कम से कम लॉग इन यातायात उत्पन्न करने के रूप में कम से कम लॉग इन किया जाता है)। एक विशेष रूप से संग्रहित प्रक्रिया में संग्रहीत काम के बैच में से कई महंगी परिचालनों में से कई उत्सुक स्पूल हैं जो केवल क्वेरी परिणामों को बफर करते हैं और फिर उन्हें केवल तालिका में कॉपी करते हैं।एसक्यूएल सर्वर

eager spools पर एमएसडीएन दस्तावेज काफी दुर्लभ है। क्या किसी के पास गहराई से अंतर्दृष्टि है कि क्या ये वास्तव में आवश्यक हैं (और किस परिस्थितियों में)? मेरे पास कुछ सिद्धांत हैं जो समझ में नहीं आ सकते हैं या नहीं, लेकिन इन प्रश्नों से इन्हें खत्म करने में कोई सफलता नहीं है।

.sqlplan फ़ाइलें काफी बड़ी हैं (160kb) तो मुझे लगता है कि शायद उन्हें सीधे फ़ोरम पर पोस्ट करना उचित नहीं है।

  • क्वेरी जैसे स्वरूपित दिनांकों को पार्स के रूप में डेटा परिवर्तन के लिए कुछ UDFs, का उपयोग करता है:

    तो, यहाँ कुछ सिद्धांत है कि विशिष्ट जवाब के लिए उत्तरदायी हो सकता है। क्या इस डेटा परिवर्तन को उत्सुक प्रकारों (जैसे वर्चर्स लम्बाई) आवंटित करने से पहले टेबल पर आवंटित करने के लिए उत्सुक स्पूल के उपयोग की आवश्यकता होती है?

  • उपर्युक्त प्रश्न के विस्तार के रूप में, क्या किसी के पास एक प्रश्न में इस ऑपरेशन को चलाने या चलाने के बारे में कोई गहराई से विचार नहीं है?

उत्तर

24

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

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

इस स्थिति में, यदि आप READ UNCOMMITTED या NOLOCK संकेत का प्रयास करते हैं, तो आप कुछ स्पूल को खत्म करने में सक्षम हो सकते हैं। (जाहिर है आप ऐसा नहीं करना चाहते हैं अगर यह आपको असंगत स्थिति में ले जाने की संभावना है, लेकिन हर किसी के डेटा अलगाव आवश्यकताओं अलग हैं)। TOP ऑपरेटर और OR ऑपरेटर कभी कभी spooling पैदा कर सकता है, लेकिन मुझे शक है कि आप एक ETL प्रक्रिया में उन लोगों में से किसी कार्य कर रहे हैं ...

आप कह रही है कि अपने UDFs भी कारण हो सकती है में सही हो। यदि आप केवल एक बार प्रत्येक यूडीएफ का उपयोग कर रहे हैं, तो यह देखने के लिए कि आप एक बड़ा प्रदर्शन लाभ प्राप्त करते हैं, उन्हें इनलाइन डालने का प्रयास करना एक दिलचस्प प्रयोग होगा। (और यदि आप क्वेरी के साथ इनलाइन लिखने का कोई तरीका नहीं समझ सकते हैं, तो संभव है कि वे स्पूलिंग क्यों कर रहे हों)।

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

+0

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

+0

मुझे खुशी है कि यह कुछ मदद थी। अगर आप एसक्यूएल कोड को प्रश्न में पोस्ट करते हैं तो हम आपकी मदद करने में सक्षम हो सकते हैं (यदि आवश्यक हो तो सामान्यीकृत) – Grank

+0

उत्सुक स्पूल आलसी स्पूल से भी कम हैं। मेरे पक्षियों को आलसी में बदलने के लिए कोई ठोस सुझाव नहीं है, लेकिन एक बार में केवल थोड़ी मात्रा में डेटा के साथ काम करने की अवधारणा और पाइपलाइन के माध्यम से इसे सभी तरह से डालने की अवधारणा एक वैकल्पिक विधि सुझाती है: अपने काम को छोटे टुकड़ों में बैच करें एक बार में 1000 या 10000 पंक्तियों का। एक अच्छी "चलने" योजना के साथ आने में काफी काम होता है जो आपको एक समय में एक क्लस्टर इंडेक्स के माध्यम से जल्दी से कदम उठाने देता है, लेकिन परिणाम आश्चर्यजनक हो सकते हैं ... – ErikE

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