【问题标题】:using statement with ExecuteReader() seems to cause performance hit [closed]使用带有 ExecuteReader() 的语句似乎会导致性能下降 [关闭]
【发布时间】:2017-08-31 18:11:28
【问题描述】:

在我的代码中,它将数据从 SQL Server 中的存储过程流式传输到 .csv 文件中,我有这个:

...
using(SqlDataReader reader = cmd.ExecuteReader())
{
    ...
}

代码运行得很慢。

我摆脱了以下使用指令:

...
SqlDataReader reader = cmd.ExecuteReader()
...

现在它运行得更快了。造成这种性能差异的原因是什么?

代码在一个存储过程中触发一个相对简单的 SQL 脚本,它返回 3 列宽的 200 万行数据。

【问题讨论】:

  • 使用 statement 与 using directive 不同
  • @whytheq 你的问题描述了一个 using statement。 using 指令是导入命名空间的内容(即using System.Linq;
  • 是的,应该没有任何显着差异。
  • 你能描述一下区别吗?在性能方面,我不倾向于相信人们的直觉。
  • OP,尝试分析 SQL 并检查逻辑读取与物理读取。如果物理读取较低,则可能意味着数据已经缓存在内存中,这可能会在您第二次运行查询时发生。

标签: c# sql-server performance


【解决方案1】:

可能是您第二次运行它时,数据库已经将数据缓存在内存中。

【讨论】:

    【解决方案2】:

    using 关闭并处理阅读器,这就是为什么它有点慢(几毫秒)。 如果垃圾收集器在您的代码执行时启动,您将产生影响。

    但是没有理由省略这个使用。 在分析您的代码时,您会发现,使用不会对性能造成太大影响。

    感谢Mike Cheel

    "Close 方法填充输出参数、返回值和 RecordsAffected 的值,增加了关闭用于处理大型或复杂查询的 SqlDataReader 所需的时间。当返回值和记录数受查询影响不大,可以通过在调用 Close 方法之前调用关联 SqlCommand 对象的 Cancel 方法来减少关闭 SqlDataReader 所需的时间。"

    https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.close(v=vs.110).aspx

    所以我的解释是,当有像 200 万行这样的大型查询时,它会导致性能影响。

    编辑

    所以当我认为它只会花费几毫秒时我错了,似乎使用明确可以对如此大的查询的整体性能产生更大的影响。

    【讨论】:

    • 与性能无关。并且在手术结束后完成!!
    • 关闭阅读器所花费的时间在正常情况下不会被人类察觉。
    • 嗯,没有明确说明,他是如何测量执行时间的。应该没有太大的区别,除了 using 导致执行完语句后关闭阅读器。所以 using 会导致代码运行慢几毫秒。
    • 我认为“非常慢”和“非常快”之间的差异对于任何理性的人来说都不是以毫秒为单位来衡量的。
    • 如果你这样做一千次,它就会有。另外,如果 gc 启动,它肯定会产生影响。但是仍然没有理由省略使用
    猜你喜欢
    • 2013-05-17
    • 2012-09-12
    • 2018-09-13
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多