Ситуация: C#, sql 2000Почему параметры медленнее, чем литеральные значения в предложении where?
У меня есть таблица, давайте назовем ее «mytable» с 30 миллионами строк. Первичный ключ состоит из полей А и В:
A char(16)
B smallint(2)
Когда я делаю поиск, как это, она работает очень медленно (например, это делает полный просмотр таблицы)
string a="a";
int b=1;
string sql = "select * from table(nolock) where [email protected] and [email protected]";
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@a", a);
cmd.Parameters.AddWithValue("@b", b);
using (SqlDataReader rdr = cmd.ExecuteReader()) {...}
}
Изменить его однако, он работает очень быстро (например, он попадает в индекс):
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()) {...}
}
Что происходит? Кажется странным для меня.
Попробуйте перезагрузить сервер базы данных и отмените порядок своих тестов.Цель всего этого - исключить кеширование на стороне SQL Server. –
К сожалению, это не вариант для производственного сервера. – Chris
Это может помочь - но может и не быть: http://stackoverflow.com/questions/1211287/getting-a-query-to-index-seek-rather-than-scan – PaulB