数据表:它是一次检索所有数据还是在需要时检索所有数据

时间:2012-11-07 12:15:21

标签: c# asp.net sql database polling

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

我们的流程

  1. 我们对数据库运行一个select查询
  2. 将数据放入DataTable
  3. 我们将所有数据写入StringBuilder并带有分隔符
  4. StringBuilder将所有文字写入构建CSV文件的Response.Write
  5. 问题在于生产,我们的客户表示操作超时。我们无法在开发中重现超时,这可能是因为生产中的数据量。

    第1步

    我们在select查询上运行了一个分析器,运行速度非常快。

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

1 个答案:

答案 0 :(得分:4)

  

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

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

  

是否使用延迟加载?

不,它没有。


你能做什么:

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