.net SqlDataReader性能低下
我在MSSM中执行了约2秒的查询(返回25K行) 在.NET(sqlReader)中使用相同的查询,只需几分钟 我还尝试只执行reader (注释了while循环中的所有代码,只是离开了reader.Read())-还是一样 知道怎么回事吗.net SqlDataReader性能低下,.net,sql-server,sql-server-2005,sqldatareader,.net,Sql Server,Sql Server 2005,Sqldatareader,我在MSSM中执行了约2秒的查询(返回25K行) 在.NET(sqlReader)中使用相同的查询,只需几分钟 我还尝试只执行reader (注释了while循环中的所有代码,只是离开了reader.Read())-还是一样 知道怎么回事吗 我不是DBA,也无权使用Profiler-我将询问我的DBA并让所有人都知道 同时,我注意到在我所说的SP中添加“WITH RECOMPILE”参数后,性能有了本质的提升 所以,从我的角度来看,执行计划似乎是如此。。。 你觉得怎么样 [编辑] 另外,我检查
我不是DBA,也无权使用Profiler-我将询问我的DBA并让所有人都知道 同时,我注意到在我所说的SP中添加“WITH RECOMPILE”参数后,性能有了本质的提升 所以,从我的角度来看,执行计划似乎是如此。。。 你觉得怎么样 [编辑] 另外,我检查的是从QA和.NET执行下面的查询
select @@options
我的理解是,它将为两种环境返回相同的值。
(如果没有差异,将使用ex.plans)
我说得对吗
[EDIT2]
我(从)读到,ARITHABOIRT=在QA中是开的(在.NET中是关的)
每个人都知道如何为每个.NET连接强制启用ARITHABOIRT=吗?我会检查实际检索需要多长时间 例如:
Private Sub timeCheck()
'NOTE: Assuming you have a sqlconnection object named conn
'Create stopwatch
Dim sw As New System.Diagnostics.Stopwatch
'Setup query
Dim com As New SqlClient.SqlCommand("QUERY GOES HERE", conn)
sw.Start()
'Run query
Dim dr As SqlClient.SqlDataReader = com.ExecuteReader()
sw.Stop()
'Check the time
Dim sql_query_time As String = CStr((sw.ElapsedMilliseconds / 1000)) & " seconds"
End Sub
这将允许您查看挂起是在检索中,还是在读卡器的执行中。如果在循环中执行读卡器,读卡器执行多次,请确保使用CommandBehavior.CloseConnection
SqlCommand cmd = new SqlCommand();
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
如果不这样做,每次循环处理该行时,当它完成并且rdr和连接对象退出作用域时,连接对象将不会显式关闭,因此只有在垃圾收集器最终完成它时,它才会被关闭并释放回池中
然后,如果您的循环足够快(很可能),您将耗尽连接。(池有其可以生成的最大限制)
这将导致额外的延迟和延迟,因为代码不断创建额外的不必要的连接(达到最大值),并等待GC“赶上”正在使用它们的循环 我将在SQL Server Profiler中设置一个跟踪,以查看从.NET代码连接时连接使用的设置选项设置,以及SSMS中使用的设置。我指的是设置选项设置
ARITHABORT
ANSI_NULLS
CONCAT_NULL_YIELDS_NULL
//etc
请查看选项表
我以前见过一个问题,选项不同(在这种情况下,
ARITHABORT
),性能差异很大。此外,查询分析器不下载大文本或大二进制字段的完整内容。您的SqlDataReader可能需要更长的时间,因为它确实下载了完整的内容。我遇到了这个问题。勾选DB服务器连接设置中的“算术中止”设置。Sql查询探查器是否显示有关此问题的任何提示?EJB:代码不适用于发布。问题是相同的,即使我们使用纯执行读取器命令(可在MS帮助中获得)Matt Murrell:我不是DBA,也不太了解探查器。你能告诉我在哪里/如何检查这些提示吗?最初的问题只提到运行一个需要花费时间的查询,而没有提到创建大量SqlConnection对象和执行大量查询。杜德,最初的查询提到了一个循环。。。这个网站上的人到底怎么了?你的职责不是识别别人回答中的每一个小细节。除非有人说错了什么,请把你的评论保持在积极的状态。我认为西蒙的意思是,如果建议的答案与原来的问题有关,那就好了。他是对的,最初的问题与连接无关,它与在.Read()循环中执行的代码有关,这意味着只有一个连接。所以从技术上讲,你确实说错话了,因为你回答了一个没有被问到的问题。哦,你是对的。。。我想我在他的评论中遗漏了这一点。在您的案例中,帮助检查或取消选中此选项?您想这样打开它,MyCommand.CommnadText=“SET ARITHABORT on;”+MyCommand.CommnadText代码>