हमेशा की तरह संदिग्ध:
- एडहॉक में स्थिरांक, कोड में पैरामीटर
- कोड में डेटा प्रकारों का बेमेल
- पैरामीटर सूँघ रहा है
बिंदु 1: ऑप्टिमाइज़र स्थिरांक के लिए सबसे अच्छी योजना चुन सकता है।
स्थिरांक बदलना = योजना बदलना। एक पैरामाइज्ड प्लेन रिजुवेबल है
बिंदु 2 डेटा रूपांतरण की वजह से निहित रूपांतरणों को पेश करेगा
जैसे कि nvarchar पैरामीटर की तुलना में varchar स्तंभ
बिंदु 3: उपयोग के लिए पैरामीटर मास्किंग या ऑप्टिमाइज़
करें UNKNOWN के लिए संपादित करें: परीक्षण करने के लिए: संग्रहित खरीदारी चलाएँ, sp_updatestats चलाएँ, फिर से चलाएँ। यह कैश की गई योजनाओं को अमान्य कर देगा, जो तब की योजना कैश को बेहतर करना है
संपादित करें: jcolebrand की टिप्पणी के बाद
आप कई तरीकों से सूँघने को निष्क्रिय कर सकते हैं। मुख्य 3 हैं
- पुनः संकलित करें। यह मूर्खतापूर्ण IMO है।
- UNKNOWN के लिए OPTIMIZE (sic)
- पैरामीटर मास्किंग
पैरामीटर मास्किंग:
DECLARE @MaskedParam varchar(10)
SELECT @MaskedParam = @SignaureParam
SELECT...WHERE column = @MaskedParam
मास्किंग और ऑप्टिमाइज हिंट का एक ही प्रभाव है (शायद अलग-अलग कारणों से)। यही है, आशावादी को सांख्यिकी और डेटा वितरण का उपयोग करना होगा ( नोट: अभी भी मार्क स्टोरी-स्मिथ द्वारा परीक्षण के तहत ) अपनी स्वयं की योग्यता के मापदंडों का मूल्यांकन करते हैं ? , बजाय इसके कि वे अंतिम कॉल क्या थे। आशावादी पुनर्मिलन कर सकता है या नहीं। SQL सर्वर 2005 ने स्टेटमेंट लेवल recompilation जोड़ा ताकि कम प्रभाव पड़े
अब, नकाबपोश / "अज्ञात" मापदंडों की तुलना में "सूंघ" मापदंडों के साथ एक योजना "चिपचिपा" क्यों है, मुझे यकीन नहीं है।
मैंने SQL सर्वर 2000 के बाद से सभी सरलतम कोड के लिए पैरामीटर मास्किंग का उपयोग किया है। मैंने नोट किया है कि यह अधिक जटिल कोड के साथ होने के लिए उत्तरदायी है। और अपनी पुरानी नौकरी में मेरे पास कुछ रिपोर्ट है जो कहती है कि मैं योजना के मापदंडों को बदल सकता हूं। मुझे लगता है कि "कार्गो पंथ" दृष्टिकोण समर्थन कॉल की तुलना में आसान था।
कुछ चैट के बाद 2, 12 अक्टूबर 2011 को संपादित करें
पैरामीटर मास्किंग और ऑप्टिमाइज़ फॉर UNKNOWN का वही प्रभाव है जहाँ तक मैं बता सकता हूँ कि
संकेत मास्किंग की तुलना में क्लीनर है लेकिन SQL सर्वर 2008 के साथ जोड़ा गया था।
कम्पाइलर सूँघने का संकलन समय पर होता है।
RECOMPILE के साथ प्रत्येक निष्पादन के लिए एक नई योजना तैयार करता है। इसका मतलब यह है कि चूक का एक खराब विकल्प योजना को प्रभावित करेगा। अपनी अंतिम नौकरी में, मैं इसे आसानी से कुछ रिपोर्ट कोड के साथ प्रदर्शित कर सकता था: बदलते पैरामीटर चूक ने आपूर्ति के मापदंडों की परवाह किए बिना योजना को बदल दिया।
यह एमएस कनेक्ट लेख दिलचस्प है: संग्रहीत कार्यविधि के भीतर उप-दांतेदार सूचकांक उपयोग (नीचे दिए गए SO उत्तरों में से एक में उल्लिखित)
- बॉब बेउचेमिन ने भी इसका उल्लेख किया है
बकाया मुद्दे
क्या सूँघना अभी भी RECOMPILE के साथ लागू होता है? यही है, अगर आशावादी जानता है कि योजना को त्यागना क्या इसका उद्देश्य फिर से उपयोग करना है?
क्यों सूँघते हैं योजनाएँ "चिपचिपी"?
एसओ से लिंक:
WHERE
खंड में परिवर्तनशील है ?