एसएसएमएस में आपका कोड वही कोड नहीं है जिसे आप अपने आवेदन में चलाते हैं। आपके आवेदन में यह पंक्ति एक NVARCHAR पैरामीटर जोड़ती है:
ada.SelectCommand.Parameters.AddWithValue("@clientID", ClientID);
जबकि SSMS स्क्रिप्ट में आप इसे VARCHAR घोषित करते हैं:
declare @clientID varchar(200)
डेटा प्रकार वरीयता के नियमों के कारण Where client_id = @clientID
जहां @clientID
. आपकी क्वेरी में अभिव्यक्ति SARG-able नहीं है NVARCHAR प्रकार का है (मैं विश्वास की छलांग लगा रहा हूं और मान लेता हूं कि client_id
कॉलम VARCHAR प्रकार का है)। इस प्रकार एप्लिकेशन एक टेबल स्कैन को मजबूर करता है जहां एसएसएमएस क्वेरी त्वरित कुंजी खोज कर सकती है। यह Parameters.AddWithValue का उपयोग करने के साथ एक अच्छी तरह से ज्ञात और समझी जाने वाली समस्या है और इससे पहले कई लेखों में चर्चा की गई है, उदाहरण के लिए। देखें कि डेटा एक्सेस कोड डेटाबेस के प्रदर्शन को कैसे प्रभावित करता है। एक बार जब समस्या समझ में आ जाती है, तो समाधान तुच्छ हो जाते हैं:
-
कंस्ट्रक्टर के साथ पैरामीटर जोड़ें जो एक प्रकार को स्वीकार करता है:
Parameters.Add("@clientID", SqlDbType.Varchar, 200)
(और करें कैश प्रदूषण को रोकने के लिए स्पष्ट लंबाई में पास करें, क्वेरी प्रदर्शन देखें और कैश समस्याओं की योजना बनाएं जब पैरामीटर लंबाई सही ढंग से निर्दिष्ट न हो -
या SQL टेक्स्ट में पैरामीटर डालें:
where client_id = cast(@clientID as varchar(200))
।
पहला समाधान बेहतर है क्योंकि यह SARG-क्षमता समस्या के अलावा कैश प्रदूषण की समस्या को भी हल करता है।
मैं आपको एप्लिकेशन में धीमा, SSMS में तेज़ पढ़ने की भी सलाह दूंगा? प्रदर्शन रहस्यों को समझना