C# 将语句与ExecuteReader()一起使用似乎会导致性能下降
在我的代码中,将数据从SQL Server中的存储过程流式传输到C# 将语句与ExecuteReader()一起使用似乎会导致性能下降,c#,sql-server,performance,C#,Sql Server,Performance,在我的代码中,将数据从SQL Server中的存储过程流式传输到.csv文件中,我有以下内容: ... using(SqlDataReader reader = cmd.ExecuteReader()) { ... } 代码运行得非常慢 我删除了针对以下内容的using指令: ... SqlDataReader reader = cmd.ExecuteReader() ... 现在它运行得快多了。这种性能差异的原因是什么 代码在一个存储过程中触发了一个相对简单的SQL脚本,该过程返回
.csv
文件中,我有以下内容:
...
using(SqlDataReader reader = cmd.ExecuteReader())
{
...
}
代码运行得非常慢
我删除了针对以下内容的using指令:
...
SqlDataReader reader = cmd.ExecuteReader()
...
现在它运行得快多了。这种性能差异的原因是什么
代码在一个存储过程中触发了一个相对简单的SQL脚本,该过程返回200万行3列宽的数据。可能是第二次运行时,数据库已经将数据缓存在内存中 使用的会关闭并处理读卡器,这就是它速度稍慢(几毫秒)的原因。 如果垃圾收集器在代码执行时启动,则会产生影响 但是没有理由省略这个用法。 在分析代码时,您将认识到,使用脚本不会对性能造成太大影响 感谢: Close方法填充输出参数、返回值和RecordsAffected的值,增加了关闭用于处理大型或复杂查询的SqlDataReader所需的时间。当返回值和受查询影响的记录数不显著时,可以通过在调用close方法之前调用关联的SqlCommand对象的Cancel方法来减少关闭SqlDataReader所需的时间。” 因此,我的解释是,当有像200万行这样的大型查询时,它会对性能产生影响 编辑:
因此,当我认为这只需要几毫秒的时间时,我错了。在这样大的查询中,似乎使用肯定会对整体性能产生更大的影响。using语句不同于using语句directive@whytheq您的问题描述了using语句。using指令是导入名称空间的指令(即
使用System.Linq;
)是的,不应该有任何显著的差异。你能分析一下差异吗?我不相信人们在性能方面的直觉。请尝试分析SQL,检查逻辑读取和物理读取。如果物理读取较低,可能意味着数据已经缓存在内存中,这可能会在第二天发生请告诉我您运行了一个查询。我不认为“非常慢”和“非常快”之间的差异对于任何有理智的人来说都是以毫秒为单位来衡量的。如果您这样做了1000次,它就会发生变化。另外,如果gc启动,它肯定会产生影响。但是仍然没有理由忽略usingAlso,您应该调用Dispose()无论如何手动…@Guilherme为什么要这样做?这正是使用
-语句所做的,不需要调用Dispose
self.@HimBromBeere我的意思是当不使用使用
时。把它留给GC来处理是不好的。