Zkontrolujte typ parametru (@SSN), který předáváte SQL. Častěji se parametr přidává takto:
List<...> GetBySSN(string ssn) {
SqlCommand cmd = new SqlCommand (@"select ... from ... where [email protected]", conn);
cmd.Parameters.AddWithValue("@SSN", ssn);
using (SqlDataReader rdr = cmd.ExecuteQuery()) {
...
}
}
Tento vzor bohužel přidává @SSN
parametr jako NVARCHAR
typu (tj. Unicode). Pravidla pro SQL Server Prednost datových typů
vyžadují, aby porovnání mezi NVARCHAR a VARCHAR bylo provedeno jako NVARCHAR, takže dotaz bude proveden, jako by byl požadován následující SQL:
select ... from ... where CAST(SSN as NVARCHAR) = @SSN;
Tento dotaz nemůže těžit z indexu ve sloupci SSN, takže se místo toho provádí skenování tabulky. V 90 % případů, kdy prošetřuji tvrzení „dotaz běží pomalu z aplikace, ale rychle z SSMS“, je tento problém, protože velká většina vývojářů ve skutečnosti spouští jiné dotaz v SSMS k porovnání (použijí argument VARCHAR nebo pevně zakódovanou hodnotu).
Pokud se skutečně jedná o tento problém, řešení je triviální:explicitně zadejte typ parametru jako SqlDbType.VarChar
.