हर डालने के बयान के लिए मैं SQL सर्वर प्रोफाइलर में sp_executesql देखता हूं


4

हमारे उत्पादों में से एक के लिए हमारे डेटाबेस और प्रश्नों को ट्यून करने पर काम करते हुए, मैंने QA वातावरण में खुले प्रोइलर को पॉप करने का फैसला किया और देखें कि यह क्या दिखाता है।

मैंने प्रत्येक आवेषण के लिए देखा जिसे मैंने कॉल किया था, सम्मिलित कथन के पाठ के साथ sp_executesql के लिए एक कॉल किया गया था।

यह एक बड़ी हिट लगती है, क्या इसे बंद करने का कोई तरीका है?

वातावरण:

  • SQL सर्वर 2008 R2 मानक
  • विंडोज सर्वर 2008 आर 2 एंटरप्राइज
  • 32 जीबी रैम
  • 2x4 Xeon
9

मुझे बहुत चिंता नहीं होगी।

विचार फिर से उपयोग के लिए बयानों को पैरामीटर बनाना है।यानी कंपाइल करने से बचें

विचार करें कि आपके पास 3 अलग-अलग क्लाइंट हैं जो 3 अलग-अलग स्टेटमेंट चलाते हैं:

SELECT col1, col2 FROM SomeTable WHERE col3 = 1

SELECT col1, col2 FROM SomeTable WHERE col3 = 15

SELECT col1, col2 FROM SomeTable WHERE col3 = 42

इनमें से प्रत्येक का अलग-अलग पाठ है इसलिए इसे एक अलग योजना में संकलित किया जाएगा।अर्थात्, संकलित में 3 संकलन और 3 योजनाएँ।

अब, ये 3

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '1'

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '15'

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '42'

यहाँ पुनः प्रयोग करने योग्य योजना SELECT col1, col2 FROM SomeTable WHERE col3 = @p0 विवरण के लिए है, इसलिए आपके पास एक योजना कैश है।

व्यस्त प्रणालियों में, यह संकलन समय मायने रखता है।और अधिकांश प्रश्न अधिक जटिल हैं, तो निश्चित रूप से: आप अक्सर इसे 1 रन बनाम बाद के रन समय के लिए देख सकते हैं (Testing Query Speed देखें)

जटिल और व्यस्त प्रणालियों में भी तब योजना का आकार सीमित हो सकता है या रैम को डेटा कैश (बफर पूल) से दूर ले जा सकता है जो चीजों में भी बाधा डाल सकता है।चरम एक व्यस्त वेब ऐप के लिए 10000 की योजना या एक हो सकता है।(प्रभाव 32 बनाम 64 बिट सूक्ष्मता पर निर्भर करता है)

कुछ ओआरएम और ड्राइवर आपको इसे बंद करने की अनुमति देते हैं, आमतौर पर "तैयार किए गए बयान" या कुछ विकल्प: लेकिन चेतावनी दी जाए कि यह चीजों को धीमा कर सकता है।आपने कहा "यह एक बड़ी हिट लगती है" जिसका मतलब है कि आप लोड के बारे में चिंतित हैं ...

+2

* क्यों * की महान व्याख्या कुछ सिस्टम ऐसा करते हैं।यह उन्हें संग्रहीत प्रक्रियाओं का उपयोग किए बिना अपनी SQL को परिमार्जित करने देता है। 15 sep. 112011-09-15 19:06:11


4

मुझे यकीन नहीं है कि मैं समझता हूं, आप sp_executesql का उपयोग बंद करना चाहते हैं?यदि हां, तो आपको इस पद्धति का उपयोग न करने के लिए बस अपना कोड बदलना होगा।मेरा मानना ​​है कि .NET में SQLCommand ऑब्जेक्ट sp_executsql का उपयोग करेगा, इसलिए यदि आप .NET का उपयोग कर रहे हैं, तो आपको इस कॉल को देखने की उम्मीद करनी चाहिए।


5

यदि आप ज्यादातर ORMs (Link2SQL, EF, आदि) का उपयोग कर रहे हैं, तो वे इस प्यारी सी छोटी विधि का उपयोग करते हैं।यदि आप एक पैरामीरिज्ड इन्सर्ट स्टेटमेंट लिख रहे हैं तो यह इस विधि से भी आएगा।

  0

इसलिए मैं पैरामीटरित आवेषण का उपयोग करके इसे प्राप्त नहीं कर सकता हूं?जैसे ... बिल्कुल? 15 sep. 112011-09-15 13:05:38

  0

नहीं।आपका एकमात्र विकल्प अपनी स्वयं की संग्रहीत प्रक्रिया का उपयोग करना होगा। 15 sep. 112011-09-15 17:19:53