gpt4 book ai didi

c# - 非常奇怪的 DataReader 性能问题

转载 作者:行者123 更新时间:2023-11-30 15:41:36 26 4
gpt4 key购买 nike

我有一个 SQL Server 数据库,我正在使用 ADO.NET ExecuteReader 获取数据读取器。我的存储过程返回大约 35,000 条记录。

调用 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+ 毫秒)的读取。我查看了数据,没有发现任何异常。我想开始查看花费这么长时间的记录的频率。

这很有趣。虽然不完全一致,但它们很接近。加载时间较长的记录如下...

记录#s:29、26、26、27、27、29、30、28、27、27、30、30、26、27

所以看起来 26 到 30 条记录将在 0 到几毫秒内读取,然后需要 5 秒,然后接下来的 26 到 30 条记录将再次按预期读取。

我在这里完全不知所措。我可以发布更多代码,但没有太多内容。这是非常简单的代码。

编辑我的字段都不是 varchar(max),甚至不是 close。我最大的字段是数字 (28,12)。

修改我的存储过程后,我不再有问题。我首先将其修改为 Select TOP 100,然后将其提升到 Top 1000,然后是 10,000,然后是 100,000。我从来没有遇到过这些问题。然后我移到 TOP,现在我没有遇到之前的问题。

最佳答案

SqlDataReader 缓冲发送到客户端的结果。参见 this page on MSDN for details :

When the results are sent back to the client, SQL Server puts as many result set rows as it can into each packet, minimizing the number of packets sent to the client.

我怀疑您在每个数据包中获得 26-30 条记录。当您遍历记录时,加载新记录时会出现延迟。

关于c# - 非常奇怪的 DataReader 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8158072/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com