Хранимая процедура SQL Server 2005 быстро в SSMS медленно от VBA - PullRequest
4 голосов
/ 01 мая 2009

У меня есть хранимая процедура, которая при запуске из 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

Кто-нибудь знает, почему это происходит или как я могу начать отслеживать происходящее?

Спасибо

Steve

Ответы [ 4 ]

7 голосов
/ 24 февраля 2011
2 голосов
/ 11 июня 2009

Мне кажется, у меня та же проблема, что и у Стива Гомера. В дополнение к этому такому вопросу я также нашел эту ветку на eggheadcafe.com Очень медленное выполнение SP при использовании .net - очень быстро в Management Studio - totico

Ответы говорят, что речь идет о сниффинге параметров и о том, как это влияет на то, какой план выполнения используется. Там в ответах конкретно упоминается опция набора arithabort и то, как это влияет на выбор плана.

Теперь мне просто нужно узнать, как изменить установленные параметры с 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
1 голос
/ 01 мая 2009

Использование SQL Server Profiler

  • Настройка трассировки в вашей базе данных.
  • Ограничить трассировку только объектом хранимой процедуры, о котором идет речь
  • Ограничение на имя пользователя, используемое кодом VBA

Введение в SQL Server Profiler

В частности, проверьте параметры SET , используемые соединением, и сравните их со значениями по умолчанию, используемыми при запуске хранимой процедуры в SSMS.

Ранее я сталкивался со сценариями, в которых параметры SET отличались между вызывающим кодом и внутри SSMS, а разница в производительности составляла ОГРОМНО .

0 голосов
/ 01 мая 2009

Спасибо, я посмотрю на инструменты трассировки.

В ответ на комментарии к исходному вопросу

Используете ли вы точно такие же значения параметров?

Да, точно так же.

Сколько данных возвращается (примерно) - количество строк и столбцов (и являются ли какие-либо из них особенно большими)?

Менее 200 строк, возможно, 15 полей, в основном, с парой из 20 символов.

Можете ли вы запустить SQL Profiler и подтвердить, является ли sql проблемой или остатками макроса в excel?

SQL довольно уродлив, как и базовая схема базы данных, и, к сожалению, находится под NDA, поэтому я не могу опубликовать его. Если бы вопрос был проблемой, то разве это не было бы слишком медленно в студии управления?

...