Как вы измеряете производительность хранимой процедуры? - PullRequest
9 голосов
/ 22 сентября 2009

Я использую версию SQL Server 2005, которая не поддерживает профилировщик, пытаясь выяснить, как лучше сравнить производительность двух хранимых процедур. Я выполнил план выполнения для каждого, но мне не ясно, на какой из предоставленных метрик я должен сосредоточиться. Должен ли я пройти и сложить различные расходы? Какой лучший подход?

Заранее спасибо.

Ответы [ 7 ]

18 голосов
/ 22 сентября 2009

Посмотрите на эту статью: Измерение производительности SQL

Если вы не хотите регистрироваться в бесплатной учетной записи, вот решение 1:

DECLARE @start datetime, @stop datetime
SET @start = GETDATE()
EXEC your_sp
SET @stop = GETDATE()

второй:

SET STATISTICS TIME ON
EXEC your_sp

третий:

SET STATISTICS IO ON
EXEC your_sp

Кстати, на этом сайте есть несколько хороших статей. Я бы порекомендовал зарегистрироваться. Это бесплатно.

1 голос
/ 22 сентября 2009

, если вы используете что-то вроде

SET SHOWPLAN_ALL ON

посмотрите на значение столбца TotalSubtreeCost для строки с EXE-именем YourProcedure.

это может помочь:

http://technet.microsoft.com/en-us/library/ms180765.aspx

1 голос
/ 22 сентября 2009

Вопрос в том, что вы оптимизируете? Это для скорости или используемых ресурсов?

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

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

0 голосов
/ 22 сентября 2009

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

0 голосов
/ 22 сентября 2009

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

0 голосов
/ 22 сентября 2009

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

Вы всегда можете запустить хранимую процедуру вручную в Query Analyzer и также измерить результаты. Жгут .NET просто автоматизирует процесс для вас.

0 голосов
/ 22 сентября 2009

Как и большинство вопросов, ответ зависит ... В конечном счете, единственная мера, которая имеет значение, это восприятие конечного пользователя, на которое могут влиять многие вещи, включая не только хранимую процедуру, но и производительность сети, шаблоны использования (называется ли sProc 20x / день или 1000x / секунда?) и т. д., - и sProc может не быть определяющим фактором.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...