【发布时间】: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