24

मुझे SQL Server 2008 R2 के विरुद्ध चल रहे एंटीटी फ्रेमवर्क (4.2) द्वारा उत्पन्न सरल SQL क्वेरी के साथ कुछ प्रमुख प्रदर्शन समस्याओं का सामना करना पड़ रहा है।इकाई फ्रेमवर्क 4.2 exec sp_executesql इंडेक्स (पैरामीटर स्नीफिंग) का उपयोग नहीं करता है

exec sp_executesql 'DYNAMIC-SQL-QUERY-HERE', @param1... 

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

कुछ शोध के बाद, ऐसा लगता है कि समस्या 'पैरामीटर स्नीफिंग' के कारण हो सकती है। अगर मैं ऐसा जैसे विकल्प (RECOMPILE) क्वेरी संकेत संलग्न: लक्ष्य टेबल पर

exec sp_executesql 'DYNAMIC-SQL-QUERY-HERE OPTION(RECOMPILE)', @param1... 

अनुक्रमित उपयोग किया जाता है और क्वेरी बहुत जल्दी निष्पादित करता है। मैंने डाटाबेस इंस्टेंस (http://support.microsoft.com/kb/980653) पर पैरामीटर स्नीफिंग (4136) को अक्षम करने के लिए उपयोग किए गए ट्रेस ध्वज पर टॉगल करने का भी प्रयास किया है, हालांकि ऐसा कोई प्रभाव नहीं दिखता था।

यह मैं कुछ सवाल के साथ छोड़ देता है:

  1. वहाँ वैसे भी इकाई की रूपरेखा द्वारा उत्पन्न एसक्यूएल करने के लिए विकल्प (RECOMPILE) क्वेरी संकेत संलग्न करने के लिए है?
  2. क्या एंटिटी फ्रेमवर्क को exec sp_executesql का उपयोग करने से रोकने के लिए वैसे भी है, और इसके बजाय बस कच्चे एसक्यूएल को चलाएं?
  3. क्या कोई और इस समस्या में भाग रहा है? कोई अन्य संकेत/टिप्स?

अतिरिक्त जानकारी:

  1. मैं SSMS के माध्यम से डेटाबेस उदाहरण पुनः आरंभ किया था, फिर भी, मैं सेवा प्रबंधन कंसोल से सेवा पुन: प्रारंभ कर देगा। निम्न सेटिंग्स
  2. अनुकूलन सहारा वर्कलोड के लिए है
    • मूल्य: 0
    • न्यूनतम: 0
    • अधिकतम: 1
    • value_in_use: 0
    • :
    • Parameterization सरल (0 is_parameterization_forced) पर सेट है
    • is_dynamic: 1
    • is_advanced: 1

मैं भी उल्लेख करना चाहिए कि अगर मैं नीचे स्क्रिप्ट के साथ ट्रेस ध्वज 4136- सक्रिय करने के बाद सेवा प्रबंधन कंसोल के माध्यम से SQL सर्वर सेवा को पुनः आरंभ, वास्तव में ट्रेस ध्वज स्पष्ट करने के लिए प्रकट होता है ... शायद मैं इस एक करना चाहिए अलग तरीके से ...

DBCC TRACEON(4136,-1) 
+1

मैं ईएफ के बारे में कुछ भी जवाब नहीं दे सकता (क्षमा करें, इसे कभी छुआ नहीं है), लेकिन मेरे पास अन्य प्रश्न हैं जिन्हें आपको अपने प्रश्न में जवाब देना चाहिए: क्या आपने ट्रेस ध्वज सेट करने के बाद सेवा को पुनरारंभ किया था? पैरामीटर के लिए डेटाबेस स्तर पर आपकी सेटिंग क्या है (सरल या मजबूर - देखें 'sys.databases.is_parameterization_forced')? "विज्ञापन कार्य वर्कलोड के लिए अनुकूलित करें" के लिए sp_configure सेटिंग क्या है? दुर्भाग्यवश, अगर मुझे सही याद है, तो ईएफ बॉक्स से बाहर एनफू 'और एनब्लैट' जैसे पैरामीटर के लिए दो अलग-अलग योजनाएं उत्पन्न करेंगे - क्योंकि वे अलग-अलग लंबाई हैं। –

+0

देरी प्रतिक्रिया के लिए मेरी माफ़ी, और त्वरित टिप्पणी के लिए धन्यवाद! मैंने मूल पोस्ट में अतिरिक्त जानकारी जोड़ दी है। – mindlessgoods

+0

तो मैं आपके परीक्षणों को दोबारा कोशिश करूँगा (ए) पैरामीटरकरण को मजबूर करने के लिए सेट (बी) विज्ञापन वर्कलोड के लिए ऑप्टिमाइज़ 1 और (सी) दोनों पर सेट करें। यह काफी संभावना है कि (बी) इस परिदृश्य में मदद करेगा लेकिन (ए) भी मदद कर सकता है। मैं कबूल करूंगा कि मैंने (ए) के साथ बहुत अधिक परीक्षण नहीं किया है, लेकिन (बी) ने हर विज्ञापन को वर्कलोड में मदद की है जिसे मैंने कभी भी कोशिश की है। –

उत्तर

5

इस बिंदु पर मैं सिफारिश करेंगे:


तदर्थ वर्कलोड सच करने के लिए सेटिंग के लिए अनुकूलित सेट करें।

EXEC sp_configure 'show advanced', 1; 
GO 
RECONFIGURE WITH OVERRIDE; 
GO 
EXEC sp_configure 'optimize for ad hoc', 1; 
GO 
RECONFIGURE WITH OVERRIDE 
GO 
EXEC sp_configure 'show advanced', 0; 
GO 
RECONFIGURE WITH OVERRIDE; 
GO 

कुछ समय के बाद इस सेटिंग को मदद की है प्रतीत नहीं होता है, तो उसके बाद ही मैं ट्रेस ध्वज की अतिरिक्त सहायता की कोशिश करेंगे। ये आमतौर पर अंतिम उपाय के रूप में आरक्षित होते हैं। एक क्वेरी विंडो में और वैश्विक ध्वज का उपयोग करते हुए, SQL सर्वर कॉन्फ़िगरेशन प्रबंधक के माध्यम से कमांड लाइन का उपयोग कर ट्रेस ध्वज सेट करें। देखें http://msdn.microsoft.com/en-us/library/ms187329.aspx

6

tl; डॉ

update statistics


हम एक पैरामीटर (प्राथमिक कुंजी) कि ~ जब एफई और sp_executesql के माध्यम से कहा जाता है पूरी करने में लगे 7 सेकंड के साथ एक delete क्वेरी था। क्वेरी को मैन्युअल रूप से चलाना, sp_executesql पर पहले तर्क में एम्बेडेड पैरामीटर के साथ क्वेरी जल्दी से चलती है (~ 0.2 सेकंड)। option (recompile) जोड़ना भी काम किया। बेशक, ईएफ का उपयोग करने के बाद से उन दो कामकाज हमारे लिए उपलब्ध नहीं हैं।

शायद विदेशी कुंजी बाधाओं को झुकाव के कारण, लंबी चल रही क्वेरी के लिए निष्पादन योजना, उहम्म ..., विशाल था। जब मैंने एसएसएमएस में निष्पादन योजना को देखा तो मैंने देखा कि कुछ मामलों में विभिन्न चरणों के बीच तीर दूसरों की तुलना में व्यापक थे, संभवतः यह इंगित करता है कि SQL सर्वर को सही निर्णय लेने में परेशानी थी। इससे मुझे आंकड़ों के बारे में सोचने का मौका मिला। मैंने निष्पादन योजना में कदमों को देखा ताकि यह देखने के लिए कि संदिग्ध कदमों में कौन सी तालिका शामिल थी। तब मैं उस तालिका के लिए update statistics Table भाग गया। फिर मैंने बुरी क्वेरी को फिर से चलाया। और मैं इसे फिर से चला गया। और फिर बस सुनिश्चित करने के लिए। इसने काम कर दिया। हमारा perf वापस सामान्य था। (अभी भी गैर-sp_executesql प्रदर्शन से कुछ भी बदतर है, लेकिन हे!)

यह पता चला कि यह हमारे विकास पर्यावरण में केवल एक समस्या थी। (और यह एक बड़ी समस्या थी क्योंकि यह हमारे एकीकरण परीक्षण हमेशा के लिए लेता है।) हमारे उत्पादन वातावरण में, हमारे पास एक नौकरी चल रही थी जो नियमित रूप से सभी आंकड़ों को अद्यतन करती थी।

+1

यह काम करता है जब यह काम करता है, लेकिन * हमेशा * काम नहीं करता है - अभी भी ईएफ से SQL सर्वर पर संकेत प्राप्त करने के लिए "कोई अच्छा तरीका नहीं" छोड़ देता है। – user2864740

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