【问题标题】:SQL DataReader network usage limitSQL DataReader 网络使用限制
【发布时间】:2018-05-04 19:30:32
【问题描述】:

我有这样的想法(不知道好坏)。 我有实用程序,它通过 reglament 连接到 SQL 服务器并将一些数据提取到应用程序。数据很简单(2 个 varchar 文本属性),但数据数约为 300 万行。因此,我的应用程序非常密集地使用网络。 我可以通过 SQL DataReader 以编程方式减少(限制、节流等)网络带宽使用吗?让它更慢地工作,但不要对服务器和客户端施加压力。这个主意好吗?如果没有,我该怎么办?

这里是代码,到目前为止:

using (SqlConnection con = new SqlConnection("My connection string here"))
{
    con.Open();
    using (SqlCommand command = new SqlCommand(query, con))
    {                        
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                yield return new MyDBObject()
                {                               
                    Date = (DateTime)reader["close_date"],                                
                    JsonResult = (string)reader["json_result"]
                };
            }
        }
    }
}

【问题讨论】:

  • 是 - 数据读取器可用于懒惰地评估大型数据集,而无需在客户端实现所有数据。如果您在数据访问中使用 async / await,您可能需要将 yield return 生成器移动到单独的函数(或者可能是本地函数)中。 Example here
  • 您无法在客户端上有效地节流。如果你这样做了,你所做的就是在服务器端保持锁和缓冲区,并阻止无法继续生成行的线程——即使它“工作”,从你减少带宽的意义上说,服务器的等待统计信息将尖峰,这可以让您从看到很多 ASYNC_NETWORK_IO 等待的忧心忡忡的 DBA 那里得到一些关注。您可以减少每次调用获取的数据量,为其他查询留出更多空间,但始终尽可能快地处理您获取的任何数据。

标签: c# sql-server datareader


【解决方案1】:

使服务器缓冲数据或保持打开的查询更长时间实际上可能会显着增加服务器上的负载,但最终唯一的方法是应用“分页”到您的查询,并访问连续页面中的数据,可能在页面之间暂停。页面可能仍然很大——例如 100k。您可以在 SQL Server 中使用 OFFSET/FETCH 相对轻松地实现此目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2016-05-18
    • 2014-11-02
    • 1970-01-01
    相关资源
    最近更新 更多