9

मैं है एक संग्रहीत प्रक्रिया है कि एक तारीख इनपुट कि बाद में आज की तारीख के लिए निर्धारित है कोई मूल्य में पारित हो जाता है, तो स्वीकार करता है:एसक्यूएल गरीब संग्रहीत प्रक्रिया कार्य योजना लागू करके प्रदर्शन - पैरामीटर सूँघने

CREATE PROCEDURE MyProc 
    @MyDate DATETIME = NULL 
AS 
    IF @MyDate IS NULL SET @MyDate = CURRENT_TIMESTAMP 
    -- Do Something using @MyDate 

मैं परेशानी हो रही हूँ जिससे @MyDateNULL के रूप में पारित किया जाता है जब संग्रहित प्रक्रिया पहली बार संकलित की जाती है, तो प्रदर्शन सभी इनपुट मानों (NULL या अन्यथा) के लिए हमेशा भयानक होता है, अगर किसी दिनांक/वर्तमान दिनांक को संग्रहीत प्रक्रिया संकलित करते समय वर्तमान दिनांक पारित किया जाता है तो वेरास होता है सभी इनपुट मानों के लिए ठीक है (NULL या अन्यथा)।

क्या भी भ्रामक है कि गरीब निष्पादन योजना है कि में उत्पन्न होता है भयानक है यहां तक ​​कि जब इस्तेमाल किया @MyDate का मूल्य वास्तव मेंNULL (और नहीं CURRENT_TIMESTAMP को यदि बयान से सेट)

मैं है की खोज की है, जिसे पैरामीटर (पैरामीटर स्पूफिंग द्वारा) सूँघने अक्षम करने मेरी समस्या ठीक होती है:

CREATE PROCEDURE MyProc 
    @MyDate DATETIME = NULL 
AS 
    DECLARE @MyDate_Copy DATETIME 
    SET @MyDate_Copy = @MyDate 
    IF @MyDate_Copy IS NULL SET @MyDate_Copy = CURRENT_TIMESTAMP 
    -- Do Something using @MyDate_Copy 

मैं जानता हूँ कि इस पैरामीटर सूँघने के साथ कुछ है, लेकिन उदाहरण मैं के देखा है के सभी "पैरामीटर सूँघने बुरा चला गया" संग्रहित प्रक्रिया शामिल है एक गैर-प्रतिनिधि पैरामीटर के साथ संकलित किया गया है, हालांकि यहां मैं देख रहा हूं कि निष्पादन योजना सभी कल्पनीय मानों के लिए भयानक है कि SQL सर्वर सोच सकता है कि पैरामीटर उस बिंदु पर ले सकता है जहां कथन निष्पादित किया गया है - NULL, CURRENT_TIMESTAMP या अन्यथा ।

क्या किसी को यह समझने में कोई अंतर्दृष्टि मिली है कि यह क्यों हो रहा है?

+1

यह दिलचस्प है, लेकिन आप कर रहे हैं वास्तव में यहां कहीं भी एक प्रश्न नहीं पूछ रहा है ... – cjk

+0

बस ध्यान दिया कि :-) – Justin

उत्तर

6

मूल रूप से हाँ - पैरामीटर स्नीफिंग (कुछ पैच स्तरों में) SQL सर्वर 2005 बुरी तरह टूटा हुआ है। मैंने उन योजनाओं को देखा है जो प्रभावी रूप से पूरा नहीं होते हैं (छोटे डेटा सेट पर घंटों के भीतर) डेटा के छोटे (कुछ हजार पंक्तियों) सेट के लिए भी, जो पैरामीटर मास्क किए जाने के बाद सेकंड में पूरा हो जाते हैं। और यह उन मामलों में है जहां पैरामीटर हमेशा एक ही संख्या रहा है। मैं जोड़ता हूं कि साथ ही साथ मैं इस बात से निपट रहा था, मुझे बाएं जॉइन/एनयूएलएल के साथ बहुत सारी समस्याएं पूरी नहीं हुईं और मैंने उन्हें प्रतिस्थापित नहीं किया या न ही EXISTS के साथ बदल दिया और इसने कुछ पूरा करने की योजना को हल किया। फिर, एक (बहुत गरीब) निष्पादन योजना मुद्दा। उस समय मैं इससे निपट रहा था, डीबीए मुझे SHOWPLAN पहुंच नहीं देगी, और चूंकि मैंने प्रत्येक एसपी पैरामीटर को मास्किंग शुरू कर दिया है, इसलिए मेरे पास कोई और निष्पादन योजना नहीं है जहां मुझे इसे पूरा करने के लिए खोदना होगा ।

SQL सर्वर 2008 में आप OPTIMIZE FOR UNKNOWN का उपयोग कर सकते हैं।

0

एक तरफ मैं स्थानीय पैरामीटर को फिर से चलाकर पैरामीटर को मास्क करने के बजाय (SQL सर्वर 2005) में इस समस्या को हल करने में सक्षम था, क्वेरी ऑप्टिमाइज़र संकेत जोड़ना था। Parameter Sniffing in SqlServer 2005

मैं प्रयोग किया है::

यहाँ एक अच्छा ब्लॉग पोस्ट है कि यह के बारे में अधिक बात करती है विकल्प (के लिए अनुकूलित (@p = '-1'))

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