Вопрос

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

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

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

Это было полезно?

Решение

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

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

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

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

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

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

SET STATISTICS IO ON
SET STATISTICS TIME ON

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top