Команды SQL Server для очистки кэши перед проведением сравнения производительности

dba.stackexchange https://dba.stackexchange.com/questions/10818

  •  16-10-2019
  •  | 
  •  

Вопрос

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

В поиске Google я мог бы найти эти команды:

DBCC FREESYSTEMCACHE
DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE

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

Какая лучшая практика?

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

Решение

Лично для общего запроса 2 -й и последующие казни важнее.

Вы тестируете диск ввода -вывода или производительность запроса?

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

Если ты хочешь, ты можешь:

  • DBCC DROPCLEANBUFFERS очищают чистые (немодифицированные) страницы из буферного бассейна
    Предшествовать этому с помощью CHECKPOINT Сначала промыть грязные страницы на диск
  • DBCC FLUSHPROCINDB очищает планы выполнения для этой базы данных

Также см. (На DBA.SE)

Другие советы

Поздний ответ, но может быть полезен другим читателям

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

Посоветовать, что эта команда должна нет быть в производственной среде. Запуск этой команды приведет в основном к пустому буферному кешу. Запуск любого запроса после выполнения команды DBCC Dropcleanbuffers будет использовать физические чтения, чтобы вернуть данные в кэш, что, скорее всего, будет намного медленнее, чем память.

Опять же, относитесь к этой команде аналогично DBCC Freeproccache - ее не следует запускать на каком -либо производственном сервере, если вы не знаете, что делаете.

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

Узнайте больше на: http://www.sqlshack.com/insight-into-the-sql-server-buffer-cache/

Мне всегда говорили использовать:

dbcc dropcleanbuffers;

Из MSDN:

Используйте DBCC Dropcleanbuffers для тестирования запросов с холодным буферным кешем, не выключая и перезапустив сервер.

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

Другие ответы верны по поводу причин нет бежать DBCC FREEPROCCACHE. Анкет Тем не менее, есть также несколько причин для этого:

  1. Последовательность

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

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

  1. Худшая производительность

Скажем, у вас есть запрос, который занимает одну секунду против горячего кеша, но одна минута против холодного кеша. Оптимизация, которая делает запрос в памяти на 20% медленнее, но вводный запрос на 20% быстрее может быть большой победой: во время нормальных операций никто не заметит дополнительные 200 мс при нормальных обстоятельствах, но если что-то вызывает запрос Выбежать против диска, затрачивая 48 секунд вместо 60, может сэкономить продажу.

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

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