我在MSSMS中查询执行~2秒(返回25K行)
.NET(sqlReader)中使用的相同查询只需几分钟!
我也尝试过只执行阅读器
(在while循环中注释所有代码,只留下reader.Read()) - 仍然相同!
知道发生了什么事吗?
我不是DBA,也没有特权与Profiler一起玩 - 会问我的DBA,让所有人知道。
与此同时,我注意到在向SP添加“ WITH RECOMPILE ”参数后,基本的性能提升我正在谈论
因此,从我的角度来看,执行计划似乎就是这样...... 你觉得怎么样?
[编辑] 我所检查的还是在QA和.NET下执行以下查询
select @@options
我的理解是它将为两个环境返回相同的值。 (如果没有不同的exnet计划将被使用) 我是对的吗?
[EDIT2] 我已经阅读(来自http://www.sqldev.net/misc/fn_setopts.htm)QA中的 ARITHABOIRT = ON(在.NET中已关闭)
enybody是否知道如何为每个.NET连接强制ARITHABOIRT = ON?
答案 0 :(得分:5)
我将在SQL Server Profiler中设置一个跟踪,以查看从.NET代码连接时连接使用的SET选项设置,以及SSMS中使用的设置。通过SET选项设置,我的意思是
ARITHABORT
ANSI_NULLS
CONCAT_NULL_YIELDS_NULL
//etc
查看MSDN以获取选项表
我之前看到的问题是选项不同(在这种情况下,ARITHABORT
)并且性能差异很大。
答案 1 :(得分:4)
我遇到了这个问题。勾选数据库服务器的“连接设置”中的“算术中止”设置。
答案 2 :(得分:1)
此外,查询分析器不会下载大文本或大二进制字段的全部内容。您的SqlDataReader可能需要更长时间,因为它会下载完整内容。
答案 3 :(得分:0)
我会查看实际检索的持续时间。
例如:
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
这将允许您查看是否在检索或执行阅读器中。
答案 4 :(得分:0)
如果您在循环中执行阅读器,执行多次,请确保您使用的是CommandBehavior.CloseConnection
SqlCommand cmd = new SqlCommand();
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
如果不这样做,每次循环处理该行时,当它完成并且rdr和连接对象超出范围时,连接对象将不会被显式关闭,因此它只会被关闭并释放回来当垃圾收集器最终到处完成它时到池中...
然后,如果你的循环足够快(很可能),你将失去连接。 (池有一个可以生成的最大限制)
这将导致额外的延迟和延迟,因为代码不断创建额外的不必要连接(最多)并等待GC“赶上”正在使用它们的循环......