प्रबंधन स्टूडियो से तेज़, वेब से कॉल करने पर प्रक्रिया धीमी हो जाती है


97

मैंने वह प्रक्रिया संग्रहीत कर ली है, जो हर बार वेब एप्लिकेशन से कॉल किए जाने के समय को अलग करती है।

मैंने Sql Profiler को निकाल दिया और उस समय कॉल का पता लगाया और अंत में इन बातों का पता लगाया:

  1. जब MS SQL प्रबंधन स्टूडियो में दिए गए कथनों को उसी तर्कों के साथ निष्पादित किया जाता है (वास्तव में, मैंने sql प्रोफ़ाइल ट्रेस से प्रक्रिया कॉल की प्रतिलिपि बनाई और इसे चलाया): यह 5 ~ 6 सेकंड के औसत में समाप्त होता है।
  2. लेकिन जब वेब एप्लिकेशन से कॉल किया जाता है, तो यह 30 सेकंड से अधिक (ट्रेस में) होता है, इसलिए मेरा वेबपेज वास्तव में तब तक बाहर हो जाता है।

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

मुझे कैसे पता चलेगा कि क्या हो रहा है?

मैं यह मान रहा हूं कि इसका इस तथ्य से कोई लेना-देना नहीं है कि हम BLL> DAL लेयर या टेबल एडेप्टर का उपयोग करते हैं क्योंकि ट्रेस स्पष्ट रूप से दिखाता है कि विलंब वास्तविक प्रक्रिया में है। यही सब मैं सोच सकता हूं।

EDIT मुझे इस लिंक में पता चला कि ADO.NET ARITHABORTसच में सेट होता है - जो कि ज्यादातर समय के लिए अच्छा होता है, लेकिन कभी-कभी ऐसा होता है, और सुझाए गए काम-के आसपास with recompileसंग्रहित खरीद में विकल्प जोड़ना है। मेरे मामले में, यह काम नहीं कर रहा है, लेकिन मुझे संदेह है कि यह कुछ ऐसा ही है। किसी को भी पता है कि ADO.NET क्या करता है या मुझे कल्पना कहां मिल सकती है?


1
यह संबंधित हो सकता है कि कितना डेटा वापस किया जा रहा है?
बैरी केय

@ बैरी: नहीं, जैसा कि मैंने प्रबंधन स्टूडियो में एक ही प्रक्रिया (ट्रेस से भी नकल की है - जिसका अर्थ है समान पैरामीटर), इसे 6 सेकंड के भीतर चलाया।
१०:०१ पर १०

@ जयंत: बिंदु यह नहीं है कि सपा धीमी है, लेकिन ado.net और sql के बीच स्थित है। मैं नहीं देखता कि कैसे सपा को कोई फर्क पड़ेगा।
१६:०am पर जैमर्स

2
क्या एसपी बहुत अधिक डेटा लौटाता है, उदाहरण के लिए छवि / पाठ / varchar (अधिकतम) कॉलम? ग्राहक को उपभोग करने के लिए डेटा की मात्रा बहुत बड़ी होगी जिसमें बहुत समय लगेगा। SSMS इन परिणामों को अधिक कुशल मामले में काट देता है।
टिम श्मेल्टर

1
के संभावित डुप्लिकेट stackoverflow.com/questions/2248112/...
हारून बर्ट्रेंड

जवाबों:


79

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

संक्षेप में, ऐसा लगता है कि SQL सर्वर में एक भ्रष्ट कैश निष्पादन योजना हो सकती है। आप अपने वेब सर्वर के साथ खराब योजना को मार रहे हैं, लेकिन SSMS एक अलग योजना पर भूमि बना रहा है क्योंकि ARITHABORT ध्वज पर एक अलग सेटिंग है (जो अन्यथा आपकी विशेष क्वेरी / संग्रहित खरीद पर कोई प्रभाव नहीं होगा)।

देखें ADO.NET T-SQL संग्रहीत कार्यविधि को कॉल करने के लिए एक SqlTimeoutException एक और उदाहरण के लिए है, और अधिक पूर्ण स्पष्टीकरण और संकल्प के साथ।


ये कुछ दिलचस्प लीड हैं, उनके बारे में अधिक पढ़ेंगे और कुछ में वापस आएंगे .. धन्यवाद।

44
हाय, कैश क्लियर करना DBCC DROPCLEANBUFFERSऔर DBCC FREEPROCCACHEकर दिया ट्रिक! मैं अनुमान लगा रहा हूं कि निष्पादन योजना किसी तरह भ्रष्ट थी या अद्यतन नहीं थी। मुझे संदेह है कि यह एक स्थायी समाधान है, अगर यह एक बार भ्रष्ट हो सकता है, तो यह फिर से कर सकता है। इसलिए मैं अभी भी प्रशंसनीय कारणों पर गौर कर रहा हूं। चूंकि वेब ऐप फिर से काम करने के लिए है, मुझे दबाव महसूस करने की आवश्यकता नहीं है। बहुत धन्यवाद।
.से जूल

2
@iamserious - आपने इसे धन्यवाद दिया है! अपनी संग्रहीत प्रक्रिया में परिवर्तन करने के बाद, मुझे टाइमआउट की समस्या हो रही थी। फिर मैंने आपके द्वारा उल्लिखित दो DBCC कमांड्स को चलाया और इसने इस मुद्दे को हल किया।
इंडस्टर

5
@ भाषाविद्: क्योंकि यह एक जटिल मुद्दा है, कोई चांदी की गोली नहीं है, लेकिन आप उन प्रश्नों पर संकेत का उपयोग करने OPTIMIZE FORया OPTION(Recompile)क्वेरी करने का प्रयास कर सकते हैं जो समस्या पैदा कर रहे हैं। यह लेख समस्या की गहराई से चर्चा करता है। यदि एंटिटी फ्रेमवर्क आपके प्रश्नों को उत्पन्न कर रहा है, तो यह पोस्ट आपके प्रश्नों में क्वेरी संकेत जोड़ने का एक तरीका प्रदान करती है।
स्ट्रिपिंगवर्यर

8
DBCC DROPCLEANBUFFERS और DBCC FREEPROCCACHE चलाने के बजाय, जो सभी निष्पादन योजनाओं को साफ़ कर देगा और आप समस्या को संग्रहीत प्रक्रिया को फिर से बना सकते हैं।
जोनिगा

50

मैं यह भी अनुभव करता हूं कि एसएसएमएस में वेब और फास्ट से क्वेरीज़ धीरे-धीरे चल रही थीं और मुझे अंततः पता चला कि समस्या को कुछ सूँघने वाला पैरामीटर कहा जाता था।

मेरे लिए यह तय था कि सभी मापदंडों को स्थानिक चरों में इस्तेमाल किया जाए।

जैसे। परिवर्तन:

ALTER PROCEDURE [dbo].[sproc] 
    @param1 int,
AS
SELECT * FROM Table WHERE ID = @param1 

सेवा:

ALTER PROCEDURE [dbo].[sproc] 
    @param1 int,
AS
DECLARE @param1a int
SET @param1a = @param1
SELECT * FROM Table WHERE ID = @param1a

अजीब लगता है, लेकिन इसने मेरी समस्या को ठीक कर दिया।


3
वाह, मुझे वही समस्या थी और विश्वास नहीं था कि यह काम करेगा लेकिन यह किया।
लैक हो

1
ज़ेन, क्या आप जानते हैं कि क्या यह समस्या को स्थायी रूप से ठीक करेगा या यह वापस आ सकता है? धन्यवाद!
लैक हो

1
यह परिवर्तन करने के बाद से मुझे संग्रहीत प्रक्रिया की गति के साथ कोई समस्या नहीं है।
ज़ेन

1
वाह, यह मेरा मुद्दा भी तय! यह sql सर्वर में बग से संबंधित है। क्यों SQL लेखक इस मूर्खतापूर्ण घेरा के माध्यम से कूदने के लिए मजबूर करते हैं जब MSSQL आंतरिक रूप से हुड के तहत स्थानीय में बदल सकता है, विशाल प्रदर्शन लाभ के लिए?
HerrimanCoder

3
क्या ऐसा हो सकता है कि खरीद में फेरबदल करने से नई निष्पादन योजना बन सकती है, इसलिए समाधान वास्तव में इनपुट चर को स्थानीय चर पर कॉपी नहीं कर रहा है, बल्कि एक नई निष्पादन योजना की पीढ़ी को मजबूर करता है (जैसा कि स्वीकृत समाधान में समझाया गया है)?
गारलैंड पोप

10

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

मैं संग्रहीत प्रक्रिया का उपयोग करके recompiled करने की कोशिश की sp_recompileऔर यह एक सपा के लिए समस्या हल हो गई।

अंततः बड़ी संख्या में एसपी थे जो टाइम-आउट थे, जिनमें से कई ने पहले कभी ऐसा नहीं किया था, का उपयोग करके DBCC DROPCLEANBUFFERSऔर DBBC FREEPROCCACHEटाइमआउट की घटना दर में काफी गिरावट आई है - अभी भी अलग-थलग घटनाएँ हैं, कुछ जहां मुझे योजना पुनर्जनन पर संदेह है थोड़ी देर, और कुछ जहां एसपी वास्तव में अंडर-परफॉर्मेंट हैं और पुनर्मूल्यांकन की आवश्यकता है।


1
इसके लिए धन्यवाद। Sp_recompile आदेश मुझे जब के लिए काम किया का उपयोग कर रखता है के लिए प्रक्रिया अंकन DBCC DROPCLEANBUFFERSऔर DBCC FREEPROCCACHEकोई फर्क नहीं बनाया है।
स्टीव

4

क्या ऐसा हो सकता है कि वेब एप्लिकेशन कॉल करने से पहले कुछ अन्य डीबी कॉल एसपी एक लेन-देन खुला रख रहा हो? वेब एप्लिकेशन द्वारा कॉल किए जाने पर प्रतीक्षा करने का यह SP के लिए एक कारण हो सकता है। मैं कहता हूं कि वेब एप्लिकेशन में कॉल को अलग करें (इसे एक नए पृष्ठ पर डालें) यह सुनिश्चित करने के लिए कि वेब एप्लिकेशन में कुछ पूर्व कार्रवाई इस समस्या का कारण बन रही है।


1
हाय @ टुंडी, मैंने कॉल को अलग कर दिया है और यह अभी भी लगभग 30 सेकंड और समय निकाल रहा है। तो यह संचार के बीच कुछ होना चाहिए, मुझे लगता है?
१२:२३

1

बस संग्रहीत प्रक्रिया (मेरे मामले में टेबल फ़ंक्शन) को फिर से शुरू करना मेरे लिए काम किया


1

@Zane की तरह यह पैरामीटर सूँघने के कारण हो सकता है। मैंने एक ही व्यवहार का अनुभव किया और मैंने प्रक्रिया के निष्पादन योजना पर ध्यान दिया और एक पंक्ति में sp के सभी कथनों को कॉपी किया (सभी कथनों को प्रक्रिया बनाते हैं, मापदंडों को चर के रूप में घोषित किया और चर के लिए समान मान निर्दिष्ट किए पैरामीटर थे)। हालांकि निष्पादन योजना पूरी तरह से अलग थी। Sp निष्पादन को 3-4 सेकंड का समय लगा और समान मान वाले पंक्ति में कथनों को तुरंत लौटा दिया गया।

निष्पादन योजना

कुछ गोलगप्पे के बाद मुझे उस व्यवहार के बारे में एक दिलचस्प पढ़ने को मिला: अनुप्रयोग में धीमा, एसएसएमएस में फास्ट?

प्रक्रिया को संकलित करते समय, SQL सर्वर को यह नहीं पता होता है कि @fromdate का मान बदलता है, लेकिन इस प्रक्रिया के तहत इस संकलन को संकलित करता है कि @fromdate का मान NULL है। चूंकि NULL उपज UNKNOWN के साथ सभी तुलना, क्वेरी किसी भी पंक्तियों को वापस नहीं कर सकती है, अगर @fromdate अभी भी रन-टाइम पर यह मान है। यदि SQL सर्वर अंतिम सत्य के रूप में इनपुट मान लेता है, तो यह केवल एक निरंतर स्कैन के साथ एक योजना का निर्माण कर सकता है जो तालिका तक बिल्कुल नहीं पहुंचता है (क्वेरी का चयन करें * आदेश से जहां आदेश> इस का एक उदाहरण देखने के लिए नल) । लेकिन SQL सर्वर को एक योजना उत्पन्न करनी चाहिए जो सही परिणाम लौटाती है चाहे रन-टाइम पर कोई भी मूल्य @fromdate न हो। दूसरी ओर, एक योजना बनाने का कोई दायित्व नहीं है जो सभी मूल्यों के लिए सबसे अच्छा है। इस प्रकार, चूंकि यह धारणा है कि कोई भी पंक्तियां वापस नहीं की जाएंगी, एसक्यूएल सर्वर इंडेक्स सीक के लिए बसता है।

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

create procedure dbo.procedure
    @dateTo datetime = null
begin
    if (@dateTo is null)
    begin
        select @dateTo  = GETUTCDATE()
    end

    select foo
    from dbo.table
    where createdDate < @dateTo
end

के बाद मैंने इसे बदल दिया

create procedure dbo.procedure
    @dateTo datetime = null
begin
    declare @to datetime = coalesce(@dateTo, getutcdate())

    select foo
    from dbo.table
    where createdDate < @to
end 

इसने फिर से एक आकर्षण की तरह काम किया।

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