मैं है एक संग्रहीत प्रक्रिया है कि एक तारीख इनपुट कि बाद में आज की तारीख के लिए निर्धारित है कोई मूल्य में पारित हो जाता है, तो स्वीकार करता है:एसक्यूएल गरीब संग्रहीत प्रक्रिया कार्य योजना लागू करके प्रदर्शन - पैरामीटर सूँघने
CREATE PROCEDURE MyProc
@MyDate DATETIME = NULL
AS
IF @MyDate IS NULL SET @MyDate = CURRENT_TIMESTAMP
-- Do Something using @MyDate
मैं परेशानी हो रही हूँ जिससे @MyDate
NULL
के रूप में पारित किया जाता है जब संग्रहित प्रक्रिया पहली बार संकलित की जाती है, तो प्रदर्शन सभी इनपुट मानों (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
या अन्यथा ।
क्या किसी को यह समझने में कोई अंतर्दृष्टि मिली है कि यह क्यों हो रहा है?
यह दिलचस्प है, लेकिन आप कर रहे हैं वास्तव में यहां कहीं भी एक प्रश्न नहीं पूछ रहा है ... – cjk
बस ध्यान दिया कि :-) – Justin