SQL Server 2005在SSMS中快速存储过程从VBA缓慢

时间:2009-04-30 20:35:21

标签: sql-server vba stored-procedures

我有一个存储过程,当从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

有没有人知道为什么会发生这种情况或者我如何开始追踪正在发生的事情?

谢谢,

史蒂夫

4 个答案:

答案 0 :(得分:7)

您需要了解的有关此主题的所有内容:Slow in the Application, Fast in SSMS? Understanding Performance Mysteries

答案 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)

使用 SQL Server Profiler

  • 在数据库上设置跟踪。
  • 仅将跟踪限制为有问题的存储过程对象
  • 限制为VBA代码使用的用户名

An introduction to SQL Server Profiler

特别是,检查连接使用的SET options,并将它们与在SSMS中运行存储过程时使用的默认值进行比较。

在调用代码和SSMS之间SET选项不同之前我遇到过各种情况,性能差异是 HUGE

答案 3 :(得分:0)

谢谢,我将看一下跟踪工具。

回复原始问题的评论

您使用完全相同的参数值吗?

是完全一样的。

返回多少数据(粗略地) - 行数和列数(并且它们中的任何一个特别大)?

在200行以下,可能有15个字段,主要是含有20个字符的varchars。

您可以运行SQL事件探查器并确认sql是问题还是excel中宏的遗留?

SQL非常难看,底层数据库架构也是如此,不幸的是在NDA下,所以我无法发布它。如果查询是问题,那么管理工作室也不会很慢吗?