SQLに渡すパラメーターのタイプ(@SSN)を確認してください。多くの場合、パラメータは次のように追加されます:
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
としてのパラメータ タイプ(つまりUnicode)。 SQLServerのルール
select ... from ... where CAST(SSN as NVARCHAR) = @SSN;
このクエリはSSN列のインデックスの恩恵を受けることができないため、代わりにテーブルスキャンが実行されます。私が主張を調査する回数の90%は、「クエリはアプリからは遅くなりますが、SSMSからは速くなります」という主張を調査します。これは、開発者の大多数が実際に異なるを実行しているためです。 比較するSSMSでのクエリ(VARCHAR引数またはハードコードされた値を使用します)。
これが実際に問題である場合、解決策は簡単です。パラメータタイプを SqlDbType.VarChar
。