[英]SQL Server 2005 stored procedure fast in SSMS slow from VBA
我有一個存儲過程,從SQL Server Management Studio運行時,這樣調用時一直需要5秒才能運行。
exec dbo.MyStoredProc '2009-04-30 00:00:00', '2009-04-30 20:00:00'
當通過VBA從excel電子表格調用時,需要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
有誰知道為什么會發生這種情況或者我如何開始追蹤正在發生的事情?
謝謝,
史蒂夫
您需要了解的有關此主題的所有內容: 應用程序速度慢,SSMS速度快? 了解性能之謎
我相信我和Steve Homer有同樣的問題。 除了這個問題,我還在eggheadcafe.com上找到了這個帖子。 使用.net時執行速度非常慢 - 在Management Studio中非常快 - totico
答案說它是關於參數嗅探以及它如何影響使用哪個執行計划。 那里的答案特別提到了arithabort
set選項以及它如何影響計划的選擇。
現在我只需要了解如何從VBA更改設置選項...
最后,感謝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
特別是,檢查連接使用的SET選項 ,並將它們與在SSMS中運行存儲過程時使用的默認值進行比較。
在調用代碼和SSMS之間SET選項不同之前我遇到過各種情況,而且性能差異很大 。
謝謝,我將看一下跟蹤工具。
回復原始問題的評論
您使用完全相同的參數值嗎?
是的完全相同。
返回多少數據(粗略地) - 行數和列數(並且它們中的任何一個特別大)?
在200行以下,可能有15個字段,其中大多數是有20個字符的varchars。
你可以運行SQL分析器並確認sql是問題還是excel中宏的遺留?
SQL非常難看,底層數據庫架構也是如此,不幸的是在NDA下,所以我無法發布它。 如果查詢是問題,那么管理工作室也不會很慢嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.