c# - 数据表 : Does it retrieve all data at once or when it is needed

标签 c# asp.net sql database polling

我们在生产中遇到性能问题,我们正在努力解决。在我们尝试解决它的过程中,我们将目光投向了数据表。

我们的流程:

  1. 我们在数据库上运行一个选择查询
  2. 将数据放入DataTable
  3. 我们将所有数据写出到带有分隔符的StringBuilder
  4. StringBuilder 将所有文本写入 Response.Write,后者构建一个 CSV 文件

问题出在生产中,我们的客户说操作超时。我们无法重现开发中的超时,这可能是因为生产中的数据量。

第 1 步:

我们对选择查询运行了一个分析器,运行速度非常快。

第 2 步:

我们有以下代码:

SqlDataReader reader = searchQuery.ExecuteReader();
returnTable.Load(reader);

第 3 步:

我们像这样迭代returnTable:

foreach (DataRow order in orders.Rows)
{
      trackingNumber = order["TrackingNumber"] != null ? order["TrackingNumber"].ToString() : errString;
      created = order["Created"] != null ? ((DateTime)order["Created"]).ToString() : errString;
      // rest of the fields
}

第 4 步:

HttpContext.Current.Response.Write(bld.ToString());

现在,当我们运行第 2 步时,会发生什么? DataTable 是否已完全加载?

如果我们在第 3 步中的每一行中轮询数据库,我可能会发现一个问题,因为这可能会减慢我们的进程。但如果它一次加载所有内容,我看不出这怎么会是个问题。

基本上:DataTable 是一次加载所有内容,还是使用延迟加载?

最佳答案

when we have run step 2, what happens? Is the datatable fully loaded?

查询返回的所有值都将传输到应用程序并加载到 DataTable 中。

does it use lazy loading?

不,不是。


你可以做什么:

  • 考虑一个有界查询——只返回前 100 行(或任何适用的行)。如果有数千个,它不太可能有用。
  • 根据上述内容,考虑使用分页来仅获取和显示有界的结果集。
  • 优化查询。它在测试中运行速度很快,并不意味着查询是最佳的。您可能希望在您的客户拥有的类似数据量上对此进行测试。

关于c# - 数据表 : Does it retrieve all data at once or when it is needed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13269609/

相关文章:

c# - 正则表达式获取具有特殊字符的单词

c# - 如何阻止日期时间验证器填充?

javascript - 避免在浏览器中浏览缓存

sql - 在 SQL Server 2008 中将数据从浮点类型的 Excel 导入 varchar

c# - 无法从传输连接读取数据 : the connection was closed

c# - 在 C# 中使用 ExpressionVisitor 识别 lambda 表达式中的括号

javascript - 在弹出窗口而不是 DIV 中打开一个新页面

sql - 如何在没有不需要的值的情况下将列包含在组中

mysql - 使用函数: The used SELECT statements have a different number of columns时出错

c# - EF - 无法确定关系