Как получить точную производительность запроса?

9

Я пытаюсь улучшить производительность хранимой процедуры. Когда я запускаю SP, он заканчивается почти мгновенно, как если бы что-то было кэшировано. Мне сказали использовать следующие две строки SQL перед выполнением SP в SSMS:

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

Когда я запускаю SP с двумя строками кода выше, SP заканчивается примерно через 8 секунд. Однако действительно ли это дает мне реальное время выполнения (например, если я запускаю это из приложения)? Откуда мне знать?

OO
источник

Ответы:

9

Эти команды делают две вещи:

  • Очистите кэш страниц, в котором хранятся страницы данных, которые уже были извлечены с диска (обычно самым большим фактором времени в запросе является доступ к диску)
  • Очистите кэш плана запросов. Это означает, что серверу необходимо создать новый план запросов. Обычно это несущественно, за исключением очень больших объемов транзакций.

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

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

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

Вы также можете использовать эти команды, чтобы получить больше информации о том, что на самом деле происходит за кулисами:

SET STATISTICS IO ON
SET STATISTICS TIME ON

Они предоставят вам подробную информацию о чтениях страниц с диска (для каждого объекта), чтениях логических страниц, времени, потраченном на составление плана, и времени, потраченном на выполнение запроса.

JNK
источник
отличный ответ как обычно JNK.
OO
Рад был помочь! Вы просто задаете вопросы о вещах, с которыми я часто сталкивался. Если вы спросите о репликации или управлении памятью, мне не о чем будет добавлять :)
JNK
2
Я знал о SET STATISTICS IO ON, но я никогда не знал о SET STATISTICS TIME ON. Спасибо JNK.
Датагод
2
Только к вашему сведению, вы можете получить много этой информации без всех настроек SET, генерируя реальные планы с помощью SQL Sentry Plan Explorer. И чтобы получить несколько (скажем, 5) запусков, вы можете просто завершить пакет, GO 5как в SSMS. Это бесплатная загрузка, я не пытаюсь вам что-либо продать. sqlsentry.net/plan-explorer/sql-server-query-view.asp
Аарон Бертран
1
@JNK, конечно, это бесплатно, это экономит время и показывает информацию, которую невозможно или очень громоздко получить из Management Studio. И я там работаю. :-)
Аарон Бертран