使用带有ExecuteReader()的语句似乎会导致性能下降

时间:2017-08-31 18:11:29

标签: c# sql-server performance

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

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

代码运行得很慢。

我摆脱了以下的using指令:

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

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

代码在存储过程中触发一个相对简单的SQL脚本,该脚本返回2百万行数据,这些数据为3列宽。

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

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

但是没有理由省略这个。 在对代码进行概要分析时,您会发现,由于使用原因,不会对性能产生重大影响。

感谢Mike Cheel

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

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

所以我的解释是,当有一个像200万行的大查询时,它会对性能产生影响。

修改

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