MS SQL 2005, पैरामीटर सूँघना, संग्रहित प्रक्रिया को रोकना

हाल ही में मैं एक समस्या में भाग गया: क्वेरी एनालाइज़र में शुरू की गई स्क्रिप्ट ने एक सेकंड में काम किया, और यह पहले से ही 50 सेकंड के लिए संग्रहीत प्रक्रिया के रूप में था। यह पैरामीटर स्निफिंग का दोष निकला, जिसे अनुरोध को अनुकूलित करने के लिए डिज़ाइन किया गया था। :)



भंडारण को संकलित करते समय, SQL सर्वर निष्पादन योजना बनाता है, जहां यह मानता है कि प्रक्रिया के इनपुट पैरामीटर एक निश्चित प्रकार के होंगे। इसे Parameter Sniffing कहा जाता है।

जब पैरामीटर थोड़ा अलग होते हैं, तो अनुरोध के इष्टतम निष्पादन के लिए निष्पादन योजना कुछ हद तक अनुचित हो सकती है।



समस्या को हल करने का सबसे आसान तरीका पैरामीटर सूँघने को अक्षम करना है। यह निम्नानुसार किया जाता है: प्रक्रिया के शरीर में स्थानीय चर बनाए जाते हैं और इनपुट मापदंडों के मान उन्हें सौंपे जाते हैं।



ALTER PROCEDURE [dbo].[REPORT_USERS_BRANCHES]



@branchId INT ,

@branchName NVARCHAR(100) OUTPUT ,

@filterByPaymentActivity VARCHAR (50),

@dateFrom DATETIME,

@dateTo DATETIME



AS



DECLARE @dtFrom DATETIME, @dtTo DATETIME, @filter VARCHAR (50), @bId INT

SET @bId = @branchId

SET @dtFrom = @DateFrom

SET @dtTo = @DateTo

SET @filter = @filterByPaymentActivity

...




* This source code was highlighted with Source Code Highlighter .








आप ऑप्टिमाइज़ेशन विकल्प (OPTION (OPTIMIZE FOR ...)) का भी उपयोग कर सकते हैं, हर बार प्रक्रिया को दोबारा शुरू करने के लिए आवश्यक प्रक्रिया बनाते समय इंगित करें।

लेकिन इन विकल्पों ने मेरी मदद नहीं की।

एक डिसीजन ट्री एसपी विधि भी है, लेकिन यह पहले से ही पूरी तरह से राक्षसी है।



ps: मुझे यकीन है कि यह सिर्फ एक बैसाखी है, और समस्या का सही समाधान नहीं है, लेकिन यह सब मुझे एक प्रोग्रामर के रूप में पर्याप्त है। शायद DBA यहाँ सबसे अच्छा तरीका सलाह देंगे?



All Articles