Как получить точную производительность запроса?
-
16-10-2019 - |
Вопрос
Я пытаюсь повысить производительность хранимой процедуры. Когда я запускаю SP, он заканчивается почти мгновенно, как будто что -то кэшировало. Мне сказали использовать следующие две строки SQL перед выполнением SP в SSM:
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
Когда я запускаю SP с двумя строками кода над SP, заканчивается примерно через 8 секунд. Тем не менее, это действительно дает мне реальное время исполнения (например, если я запускаю это из приложения)? Откуда я знаю?
Решение
Эти команды делают две вещи:
- Очистите кэш страниц, на котором хранится страницы данных, которые уже были извлечены с диска (обычно самый большой фактор времени в запросе - доступ к диску)
- Очистите кэш плана запросов, что означает, что серверу необходимо создать новый план запросов. Обычно это не значит, за исключением очень высоких объемов транзакций.
В основном вы получаете время, эквивалентное сценарию «худшего случая» - вы просто перезагрузили сервер, и ничто не в памяти. Последующие прогоны не должны платить затраты, чтобы извлечь данные с диска, поскольку эти страницы уже загружены в память.
Это похоже на ситуацию в реальном мире - ваш первый пользователь, который запустил конкретный запрос, скорее всего, придется ждать дольше, чем в последующих пробегах, предполагая, что вы проверяете те же данные.
Хороший метод, который я люблю использовать, - это работа несколько раз и в среднем. Это особенно полезно в общей среде, так как вы не имеете полного контроля над общими ресурсами, такими как TempdB.
Вы также можете использовать эти команды, чтобы получить больше информации о том, что на самом деле происходит за кулисами:
SET STATISTICS IO ON
SET STATISTICS TIME ON
Они дадут вам подробную информацию о чтениях страницы с диска (по объекту), чтениям логической страницы, времени, потраченном на составление плана, и времени, потраченном на выполнение запроса.