2010-02-05 3 views
3

Я пытаюсь выяснить, почему SQL Server хранимая процедура медленно выполняется, так что я положил в некоторых сырых таймерами, как это:SQL время выполнения хранимой процедуры тайна

Create Procedure DoStuff 
As Begin 

    Declare @Stopwatch datetime 
    Set @Stopwatch=GetDate() 

    Print char(13) + 'Task A' 
    /* Perform Task A */ 
    Print DateDiff(ms, @Stopwatch, GetDate()); Set @Stopwatch = GetDate() 

    Print char(13) + 'Task B' 
    /* Perform Task B */ 
    Print DateDiff(ms, @Stopwatch, GetDate()); Set @Stopwatch = GetDate() 

    Print char(13) + 'Task C' 
    -- Perform Task C 
    Print DateDiff(ms, @Stopwatch, GetDate()); Set @Stopwatch = GetDate() 

End 

Exec DoStuff 

я получаю что-то вроде этого:

 
Task A 
0 

Task B 
80 

Task C 
100 

Таким образом, я думаю, что для выполнения этой процедуры потребуется 180 мс. Однако для выполнения этой процедуры требуется 3000+ мс; в статистике клиента, я получаю

 
Client processing time: 12 
Total execution time: 3105 
Wait time on server replies: 3093 

Что составляет дополнительную ~ 2800 мс?

ответ

5

Это грубый способ проверить отдельные времена. Лучшим способом было бы запустить трассировку в SQL Profiler и отслеживать события SP:Completed и SP:StmtCompleted.

SP: Завершено, когда sproc завершается, давая общее время.
SP: StmtCompleted записывается, когда каждое утверждение внутри sproc завершается. Таким образом, это даст вам время для каждой отдельной части sproc.

Стоит использовать этот подход, перепроверяя фигуры, а затем отправляясь оттуда.

0

Это может быть блок на столе или ждать ресурсов по какой-то причине.

Вы можете посмотреть утилиты управления и посмотреть, есть ли блокировки или ожидания, которые основаны на том, что он показывает.

ИЛИ, это может быть сетевая связь для ответа входящей и исходящей связи на SP.

0

Транзакция, если вы выполняете ее в SSMS, является неосведомленной догадкой. Но вы должны посмотреть на план выполнения, чтобы узнать больше о реальной причине. Это может быть несколько вещей.

http://msdn.microsoft.com/en-us/library/ms178071.aspx

1

Также попробуйте отключить опцию «Показывать план выполнения», если вы включите его. Это действительно отбрасывает ваши номера за общее время выполнения - это часто может привести к очень ошибочному результату для общего времени выполнения.

2

Готов поспорить, что ваша процедура перекомпилируется при каждом запуске, что занимает время. дайте этому почитать: http://www.sql-server-performance.com/articles/per/optimizing_sp_recompiles_p1.aspx

Сделайте @Stopwatch входным параметром и перейдите в GETDATE(), а затем передайте его обратно как параметр OUTPUT. Затем вы можете распечатать еще два временных интервала, время от EXECUTE до фактического прогона и время от RETURN до тех пор, пока вызывающий элемент не получит управление снова.

Смежные вопросы