【发布时间】:2009-09-08 06:33:03
【问题描述】:
情况:c#, sql 2000
我有一张桌子,我们称它为“mytable”,有 3000 万行。 主键由字段 A 和 B 组成:
A char(16)
B smallint(2)
当我进行这样的搜索时,它的运行速度非常慢(例如,它会进行全表扫描)
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()) {...}
}
然而,把它改成这个,它运行得非常快(例如它命中索引):
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 的缓存。
-
很遗憾,这不是生产服务器的选择。
-
这可能会有所帮助 - 但可能不会:stackoverflow.com/questions/1211287/…
-
仍然确保在得出更快的结论之前多次执行每个选项。并且每个选项都有不同的参数值。
-
您可以查看执行计划或配置文件吗?
标签: c# sql sql-server tsql sql-server-2000