我有一个SQL Server数据库并且使用ADO.NET ExecuteReader获取数据读取器。我的存储过程返回大约35000条记录。
调用ExecuteReader需要大约3秒钟返回数据读取器。
我使用类似于下面的代码来获取我的项目。
using(var conn = new SqlConnection(MySQLHelper.ConnectionString)) {
conn.Open();
var sqlCommand = SqlHelper.CreateCommand(conn, "spGetItems");
using (var dr = sqlCommand.ExecuteReader()) {
while(dr.read){
var item = new Item{ID = dr.GetInt32(0), ItemName = dr.GetString(1)};
items.Add(item);
}
}
}
大多数读取操作花费0毫秒。然而,间歇性地我会遇到一次读取需要大约5.5秒(5000+毫秒)。我查看了数据但找不到任何异常之处。因此开始查看那些耗时很长的记录出现频率。
结果很有趣。虽然不完全一致,但它们非常接近。那些读取时间较长的记录如下...
记录编号: 29、26、26、27、27、29、30、28、27、27、30、30、26、27
因此看起来26至30条记录会在0至几毫秒内读取,然后会花费5秒钟,然后下一批26至30条记录会再次按预期读取。
我完全不知所措。我可以发帖更多的代码,但这并不是很复杂的代码。
编辑 我的字段中没有varchar(max),甚至离varchar(max)也相差很远。我的最大字段是numeric(28,12)。
修改了存储过程后,我不再遇到问题。首先我将其修改为Select TOP 100,然后将其提高到Top 1000、10000和100000,我从未遇到过这个问题。然后我删除了TOP,现在我没有早期遇到的问题了。