Прежде чем запускать тест производительности / базовый уровень для приложения, использующего SQL Server, я хочу иметь возможность установить экземпляр в «чистое» состояние без перезапуска экземпляра. Есть шаги, которым я склонен следовать, но я хочу создать окончательный список, который находится в правильной последовательности и не содержит лишних шагов.
Достиг ли этот список шагов установки SQL Server в «чистое» состояние?
Является ли последовательность логичной / правильной?
Есть ли лишние шаги?
CHECKPOINT -- Write all dirty pages
DBCC DROPCLEANBUFFERS -- All should be clean after checkpoint?
DBCC FREEPROCCACHE -- Clear the plan cache
DBCC FREESYSTEMCACHE -- Is this necessary after FREEPROCCACHE?
DBCC FREESESSIONCACHE -- May not be necessary if distributed queries aren't used, but want to catch all scenarios
EXEC SP_UPDATESTATS -- Refresh stats
'BEGIN TESTING!'
sql-server
dbcc
performance-testing
cache
Эрик Хиггинс
источник
источник
DROPCLEANBUFFERS
это хорошо для тестирования, но не всегда точно. Если вы ссылаетесь на таблицу большого объема, очень вероятно, что у вас почти всегда будут страницы в памяти, и время ввода-вывода не будет иметь большого значения в этом запросе. Вы можете придавать IO больший вес, чем это реально в этом случае.Ответы:
Во-первых, я отступлю и спрошу, какие измерения вы планируете собирать во время теста. Например, если вы рассчитываете логическое чтение по запросу, вам не нужно освобождать кеш. Я большой поклонник использования логических операций чтения, потому что это не зависит от того, кэшируются ли данные или на диске - и в работе трудно предположить, будут ли кэшироваться данные запроса или нет (если вы не кэшируете всю базу данных в памяти) , Если вы настроите минимизацию логического чтения, то приложение будет работать быстрее, независимо от того, находятся данные в кэше или нет.
Далее я бы спросил, что меняется между прогонами. Например, запустив EXEC SP_UPDATESTATS в каждой базе данных, как вы предложили, вы будете пересматривать статистику для таблиц, которые были обновлены. Однако, если вы не обновляете статистику с помощью fullscan, вы получаете случайные строки из таблицы - это не слишком повторяется, и я не думаю, что вы действительно хотите это делать. Вместо этого вы можете восстанавливать базы данных между каждым запуском, чтобы всегда проверять одни и те же данные. Если ваши тесты выполняют вставки / обновления / удаления, они могут иметь разные профили производительности при каждом запуске, если вы не восстанавливаете базу данных (потому что они добавляют / изменяют данные, а также меняют статистику по данным) - и даже хуже,
источник