Производительность SQL-запросов и dropcleanbuffers

Существует "лучшая практика", которую вы должны запустить

DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

Перед выполнением анализа производительности SQL-запроса.

Однако, например, более поздний DROPCLEANBUFFERS:

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

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

Я думаю, это означает, что вы будете тестировать свой запрос, как если бы это был первый запрос, который был запущен на сервере, поэтому фактическое "реальное" влияние запроса будет ниже.

Действительно ли целесообразно запускать три команды, чтобы узнать стоимость запроса или заставить вас получить довольно эмпирические результаты, которые не имеют близкого отношения к реальному времени запроса в живой среде?

Ответ 1

Я не согласен, что это лучшая практика и очень редко ее использую.

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

Я тестирую выполнение запроса: не система чтения диска или компиляция Query Optimiser

Это было задано на DBA.SE некоторое время назад. См. Их

Ответ 2

Действительно ли целесообразно запускать три команды, чтобы узнать стоимость запроса или заставить вас получить довольно эмпирические результаты, которые не имеют близкого отношения к реальному времени запроса в живой среде?

Это зависит.

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

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

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


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

Ответ 3

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

Кроме того, в большинстве случаев было бы неразумно запускать эти три DBCC в производственной среде только для тестирования. И запросы настройки производительности в тестовой среде с тестовыми данными и тестовой нагрузкой часто приводят вас к неверным выводам относительно вашего запроса.

Обычно, когда я настраиваю запрос, я использую профилировщик для получения фактической статистики исполнения из жизни, я использую SSMS для получения планов выполнения из живого, и я делаю несколько тестовых прогонов (по тестовым данным), чтобы узнать, что отличается. Для более сложных проблем я также использую монитор производительности Windows - и всегда в ситуации, максимально приближенной к реальной. Запуск DBCC просто удалит настройку с реальной сделки.