我有一个存储过程,当从SQL Server Management Studio运行时,在这样调用时一直需要5秒才能运行。
exec dbo.MyStoredProc '2009-04-30 00:00:00', '2009-04-30 20:00:00'
当从excel电子表格通过VBA调用时,需要6分钟(不包括将记录集复制到工作表所花费的时间.VBA只是简单地使用ADO连接来返回记录集。不幸的是Excel方法是我无法摆脱的客户要求。
Public Function GenerateSQL(strQueryName As String) As Recordset
Dim rs As Recordset, cm As Command, dbsConn As Connection
Set dbsConn = New ADODB.Connection
dbsConn.Open Configuration.Range("ConnectionString")
Set cm = New ADODB.Command
With cm
.CommandText = strQueryName
.CommandType = adCmdStoredProc
.CommandTimeout = 300
.ActiveConnection = dbsConn
Set rs = .Execute()
End With
Set GenerateSQL = rs
End Function
有没有人知道为什么会发生这种情况或者我如何开始追踪正在发生的事情?
谢谢,
史蒂夫
答案 0 :(得分:7)
答案 1 :(得分:2)
我相信我和Steve Homer有同样的问题。 除了这个问题,我还在eggheadcafe.com上发现了这个帖子Very slow SP execution when using .net - very fast in Management Studio - totico
答案说它是关于参数嗅探以及它如何影响使用哪个执行计划。这里的答案特别提到arithabort
集选项以及它如何影响计划的选择。
现在我只需要了解如何从VBA更改设置选项......
最后感谢forum entry on social.msdn.com我设法做到了。首先,将多个连接设置为false:
connectionObject.Properties("Multiple Connections") = False
然后在你的连接上使用以下功能来设置arithabort ...
Private Sub OptionSet(ByRef cnn As adodb.Connection)
Dim cmd As adodb.Command
Set cmd = New adodb.Command
With cmd
Set .ActiveConnection = cnn
.CommandType = adodb.CommandTypeEnum.adCmdText
.CommandText = "set arithabort on"
Call .Execute
End With
Set cmd = Nothing
End Sub
答案 2 :(得分:1)
An introduction to SQL Server Profiler
特别是,检查连接使用的SET options,并将它们与在SSMS中运行存储过程时使用的默认值进行比较。
在调用代码和SSMS之间SET选项不同之前我遇到过各种情况,性能差异是 HUGE 。
答案 3 :(得分:0)
谢谢,我将看一下跟踪工具。
回复原始问题的评论
您使用完全相同的参数值吗?
是完全一样的。
返回多少数据(粗略地) - 行数和列数(并且它们中的任何一个特别大)?
在200行以下,可能有15个字段,主要是含有20个字符的varchars。
您可以运行SQL事件探查器并确认sql是问题还是excel中宏的遗留?
SQL非常难看,底层数据库架构也是如此,不幸的是在NDA下,所以我无法发布它。如果查询是问题,那么管理工作室也不会很慢吗?