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

Posted

技术标签:

【中文标题】数据表:它是一次检索所有数据还是在需要时检索所有数据【英文标题】:Datatable: Does it retrieve all data at once or when it is needed 【发布时间】:2012-11-07 12:15:20 【问题描述】:

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

我们的流程

    我们在数据库上运行选择查询 将数据放入DataTable 我们将所有数据写入带有分隔符的StringBuilder 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 是一次加载所有内容,还是使用延迟加载?

【问题讨论】:

别担心,查询只执行一次,并在内存中对DataTable 的每一行进行迭代。 您似乎需要一个“请稍候”页面(例如在处理付款时)。将文件写入磁盘并在完成后提供文件/提供文件作为下载。 12 小时后删除临时文件。 【参考方案1】:

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

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

它使用延迟加载吗?

不,它没有。


你可以做什么:

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

【讨论】:

以上是关于数据表:它是一次检索所有数据还是在需要时检索所有数据的主要内容,如果未能解决你的问题,请参考以下文章

oracle查询一次返回3个表

从数据库中检索分层数据的最佳方法[重复]

Doctrine:这是关系还是自定义数据检索?

如何从 postgreSQL 表中检索随机数据行?

前嗅ForeSpider教程:通过搜索框检索关键词采集数据

使用 eloquent 从多个连接中检索数据