1

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

我们的流程

  1. 我们在数据库上运行选择查询
  2. 将数据放入一个DataTable
  3. StringBuilder我们用分隔符将所有数据写入 a
  4. StringBuilder所有文本写入Response.WriteCSV 文件

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

第 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一次加载所有内容,还是使用延迟加载?

4

1 回答 1

4

当我们运行第 2 步时,会发生什么?数据表是否已满载?

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

它使用延迟加载吗?

不,它没有。


你可以做什么:

  • 考虑一个有界查询——只返回前 100 行(或任何适用的行)。如果有数千个,则不太可能有用。
  • 有了上面,考虑使用分页来只获取和显示一个有界的结果集。
  • 优化查询。它在测试中运行得很快,并不意味着查询是最优的。您可能希望在您的客户拥有的类似数量的数据上对此进行测试。
于 2012-11-07T12:17:35.353 回答