Тайна времени выполнения хранимой процедуры SQL - PullRequest
3 голосов
/ 05 февраля 2010

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

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 ]

5 голосов
/ 05 февраля 2010

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

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

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

2 голосов
/ 06 февраля 2010

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

Сделайте @Stopwatch входным параметром и передайте GETDATE (), затем передайте его обратно как параметр OUTPUT. Затем вы можете распечатать еще два интервала времени: время от ВЫПОЛНИТЬ до фактического запуска и время от ВОЗВРАТА до тех пор, пока вызывающий абонент не получит контроль снова.

1 голос
/ 05 февраля 2010

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

0 голосов
/ 05 февраля 2010

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

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

0 голосов
/ 05 февраля 2010

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

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

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

...