पैरामीटर के प्रकार की जाँच करें (@SSN) जिसे आप SQL में पास करते हैं। अक्सर पैरामीटर इस तरह जोड़ा जाता है:
List<...> GetBySSN(string ssn) {
SqlCommand cmd = new SqlCommand (@"select ... from ... where [email protected]", conn);
cmd.Parameters.AddWithValue("@SSN", ssn);
using (SqlDataReader rdr = cmd.ExecuteQuery()) {
...
}
}
दुर्भाग्य से यह पैटर्न @SSN
. जोड़ता है पैरामीटर के रूप में NVARCHAR
प्रकार (यानी यूनिकोड)। SQL सर्वर के नियम डेटा प्रकार वरीयता
NVARCHAR और VARCHAR के बीच तुलना को NVARCHAR के रूप में करने की आवश्यकता होती है, इसलिए क्वेरी को निष्पादित किया जाता है जैसे कि निम्न SQL का अनुरोध किया गया था:
select ... from ... where CAST(SSN as NVARCHAR) = @SSN;
यह क्वेरी SSN कॉलम पर किसी इंडेक्स से लाभ नहीं उठा सकती है, इसलिए इसके बजाय एक टेबल स्कैन किया जाता है। 90% बार मैं इस दावे की जांच करता हूं कि 'क्वेरी ऐप से धीमी लेकिन एसएसएमएस से तेज चलती है' यह समस्या है, क्योंकि अधिकांश डेवलपर्स वास्तव में एक अलग चलाते हैं। तुलना करने के लिए SSMS में क्वेरी (वे VARCHAR तर्क या हार्ड कोडित मान का उपयोग करते हैं)।
यदि यह वास्तव में समस्या है, तो समाधान तुच्छ है:पैरामीटर प्रकार को स्पष्ट रूप से निर्दिष्ट करें SqlDbType.VarChar
।