【问题标题】:Optimizing SQL data reader优化 SQL 数据读取器
【发布时间】:2009-08-10 16:59:27
【问题描述】:

我正在使用 SQl 数据阅读器从 SQL 数据库中获取值。

语言 VB.NET

将数据输入阅读器后,我运行一个while循环

   While reader.Read

      If reader.HasRows() Then

/* Proessing of data */

      End If

  End While

我观察到 while 循环需要很多时间来处理,因为有很多行。 有没有更好的实现方式。

请评论: 我是否应该将 SQlDataReader 数据放入 arraylists,然后使用 arraylists 处理数据?

算法:

 While reader.read

    /* Put data into Arraylists */

    End While

    for(arraylist row count)
    /*Process data*/
    end for

【问题讨论】:

  • 了解您在 while 循环中究竟想要实现什么会很有趣。
  • 您要处理多少行?行中存储了哪些信息?你对每一行项目做了什么样的处理?将项目放入ArrayList(您还应该考虑使用泛型而不是ArrayList)然后对它们进行处理保证会更慢。您是否有理由无法对要返回的数据进行分页?

标签: asp.net sql vb.net optimization


【解决方案1】:

您能否将循环的逻辑放入 TSQL 中基于 SET 的逻辑中?

因此,与其遍历代码中的每一行,不如让 RDBMS 在 TSQL 中执行它。这就是 RDBMS 的设计目标和擅长的领域。

请告诉我们你在循环中做了什么以及使用什么 TSQL 来生成数据集。

【讨论】:

    【解决方案2】:

    检查数据读取器是否在循环内有行是没有意义的。如果没有行,Read 方法返回 false,因此它不会进入循环;如果有行,HasRows 方法返回 true,即使您已读取所有行。删除它会为您节省一些时间,但几乎不会引起注意:

    While reader.Read
    
      /* Proessing of data */
    
    End While
    

    在处理之前将所有数据读入列表不会给您带来任何更好的性能。相反,您将使用大量可能更好地用于其他用途的内存。

    【讨论】:

      【解决方案3】:

      不要认为从数据库中读取数据会花费大量时间。
      您可以测量一段 VB 代码中经过的时间,例如:

      startTime = Now
      ....
      stopTime = Now
      elapsedTime = stopTime.Subtract(startTime)
      

      先衡量,然后优化真正需要时间的东西。

      (附注:如果您使用的是 Team Studio,您可以尝试使用内置分析器。)

      【讨论】:

      • 系统时钟的分辨率非常低,因此只有在至少以秒为单位进行测量时才能使用它。要测量更短的时间,您可以使用 System.Diagnostics.Stopwatch 类。
      猜你喜欢
      • 2019-12-28
      • 2020-11-20
      • 1970-01-01
      • 2015-02-25
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      相关资源
      最近更新 更多