【问题标题】:Fastest way to loop through and manipulate a SQL result set? [closed]循环和操作 SQL 结果集的最快方法是什么? [关闭]
【发布时间】:2019-12-19 21:03:44
【问题描述】:

我现在监控的一个应用程序在很长一段时间内一直处于加载时间过长的状态。我已将问题缩小到 Telerik RadGrid 的填充方式。我们查询一个SQL View,把返回的数据赋值给一个DataTable,用for each循环遍历每个DataRow,把每一列赋值给一个对象的对应属性,把这个对象加到一个集合中,然后给这个集合赋值作为 RadGrid 的数据源。

通过 DataTable 的每个循环大约需要 20 毫秒,返回的结果集可以是 700 到 5000 条记录。这会导致延迟 10-20 秒只是构建初始集合。

是否有更好的对象和方法集来完成此任务,或者是使用 DataTable 并通过我的方式遍历它是我最好的选择?我已经看到了有关 Parallel-Fors 和 SQLDataReaders 的建议,但我不确定它们中的任何一个是否会更快。

【问题讨论】:

  • 许多好的问题会根据专家的经验产生一定程度的意见,但这个问题的答案往往几乎完全基于意见,而不是事实、参考资料或特定专业知识。
  • 如果您只需要遍历数据,DataReader 将是最快的方法。获得数据阅读器后,不要按列名访问数据,尽可能通过ordinal(列号)访问它(您可以一次解析列名)。考虑使用 Dapper 之类的工具来读取和映射您的数据(获取对象集合),然后将该集合用作数据源。

标签: c# sql asp.net data-manipulation


【解决方案1】:

首先,请阅读速度咆哮,因为这个问题只是为它尖叫:https://ericlippert.com/2012/12/17/performance-rant/

第二:

通过 DataTable 的每个循环大约需要 20 毫秒,返回的结果集可以是 700 到 5000 条记录。这会导致 10-20 秒的延迟仅用于构建初始集合

还有您的问题:您检索 数百数千 条记录。永远不要那样做。永远不要检索更多,然后您可以实际显示和显示用户。甚至 100 也远不止于此。

不要检索超出您需要的数据,然后在 UI 中进行过滤。在查询中做尽可能多的过滤、分页、处理等。尝试在 UI 中执行这些部分只会增加大量的网络负载,而且您执行此操作的速度可能仍然比 DBMS 执行相同工作的速度慢。

【讨论】:

    【解决方案2】:

    DataTable 在内部使用DataReader 来构建其结构并填充其数据,因此切换到DataReader 应该可以减少开销。

    也就是说,唯一确定的方法是尝试测量差异。您还可以分析代码中速度较慢的其他部分。特别是,在 windows 网格中显示数千行可能比您想象的要慢。分页数据将是一种减少填充网格所花费时间的方法。还可能有一些方法可以在您向下滚动时动态添加新记录,这至少可以为用户提供初始视图以及根据需要滚动到新记录的能力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-28
      • 2021-04-08
      • 1970-01-01
      • 2020-01-17
      • 2012-08-16
      • 2015-04-06
      • 2019-10-28
      • 1970-01-01
      相关资源
      最近更新 更多