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

У меня есть несколько запросов, которые вызывают тайм-ауты в нашей живой среде. (> 30 секунд)

Если я запускаю профилировщик, беру точный SQL-запуск и запускаю его из Management Studio, то они занимают много времени для запуска в первый раз, а затем сокращаются до нескольких сотен миллисекунд при каждом запуске после этого.

Очевидно, что SQL кэширует данные и получает их все в память.

Я уверен, что в SQL можно внести оптимизации, которые заставят его работать быстрее.

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


person Robin Day    schedule 29.01.2009    source источник


Ответы (6)


Согласно http://morten.lyhr.dk/2007/10/how-to-clear-sql-server-query-cache.html, вы можете запустить следующее, чтобы очистить кеш:

DBCC DROPCLEANBUFFERS   
DBCC FREEPROCCACHE  

РЕДАКТИРОВАТЬ: я сверился с имеющейся у меня документацией по SQL Server, и это, по крайней мере, верно для SQL Server 2000.

person Welbog    schedule 29.01.2009
comment
Отлично! Именно то, что я искал. Теперь я получаю полностью согласованные результаты при выполнении запроса! - person Robin Day; 29.01.2009
comment
Разве это не замедляет работу каждый раз? - person DevinB; 29.01.2009
comment
вам не нужно, чтобы запрос каждый раз выполнялся медленно, чтобы оптимизировать его. план запроса останется согласованным независимо от того, кэшируются результаты или нет (см. мой ответ) - person Adam Ralph; 31.01.2009

Могу ли я предложить вам проверить план выполнения запросов, которые вызывают проблемы с производительностью.

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

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

https://www.red-gate.com/Dynamic/Downloads/DownloadForm.aspx?download=ebook1

Вы можете обнаружить, что существует конкретный план выполнения, который вы хотели бы использовать для своего запроса. Вы можете указать, какой план выполнения используется для запроса в SQL Server, используя подсказки запроса. Однако это довольно продвинутая концепция, и ее следует использовать с осторожностью. Дополнительные сведения см. в следующем официальном документе Microsoft.

http://www.microsoft.com/technet/prodtechnol/sql/2005/frcqupln.mspx

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

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

Информацию о настройке общей производительности можно найти в блоге Брента Озара.

http://www.brentozar.com/sql-server-performance-tuning/

Надеюсь это поможет. Ваше здоровье.

person John Sansom    schedule 30.01.2009
comment
Несколько отличных ссылок (и предложений) там! +1 - person Ankur-m; 09.10.2012

Использование может использовать

DBCC DROPCLEANBUFFERS   
DBCC FREEPROCCACHE

Но используйте это только в своей среде разработки при настройке запросов для развертывания на работающем сервере.

person Coolcoder    schedule 29.01.2009
comment
Но используйте это только в своей среде разработки. +1 - person Welbog; 29.01.2009

Я думаю, что люди бегут в неправильном направлении. Я так понимаю, вы хотите, чтобы производительность всегда была хорошей? Разве они не работают быстро во 2-й раз (и последующие исполнения) и медленнее в первый раз?

Приведенные выше команды DBCC очищают кеш, что приводит к ХУЖЕ производительности.

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

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

person Steve Jones    schedule 30.01.2009

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

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

person Adam Ralph    schedule 29.01.2009

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

person gkrogers    schedule 29.01.2009