为什么参数比where子句中的文字值慢?

Chr*_*ris 3 c# sql t-sql sql-server sql-server-2000

情况:c#,sql 2000

我有一张桌子,我们称之为'mytable',有3000万行.主键由字段A和B组成:

A char(16)
B smallint(2)
Run Code Online (Sandbox Code Playgroud)

当我像这样进行搜索时,它的运行速度非常慢(例如,它会执行完整的表扫描)

string a="a";
int b=1;
string sql = "select * from table(nolock) where a=@a and b=@b";
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
  cmd.Parameters.AddWithValue("@a", a);
  cmd.Parameters.AddWithValue("@b", b);
  using (SqlDataReader rdr = cmd.ExecuteReader()) {...}
}
Run Code Online (Sandbox Code Playgroud)

然而,将它更改为此,并且它运行得非常快(例如,它命中索引):

string where =
  String.Format("a='{0}' and b={1}", a, b);

string sql = "select * from table(nolock) where " + where;
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
  using (SqlDataReader rdr = cmd.ExecuteReader()) {...}
}
Run Code Online (Sandbox Code Playgroud)

到底是怎么回事?对我来说似乎很奇怪.

gbn*_*gbn 8

参数和列的数据类型是否匹配?它们不显示,因此适用数据类型优先级

该列是smallint,但您发送int.该列将转换为int,因为它具有更高的优先级.所以它不会使用索引.