Как вы исправляете запросы, которые работают медленно, пока они не кэшируются - PullRequest
9 голосов
/ 29 января 2009

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

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

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

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

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

Ответы [ 6 ]

10 голосов
/ 30 января 2009

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

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

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

https://www.red -gate.com / Dynamic / Загрузки / DownloadForm.aspx? Скачать = ebook1

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

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

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

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

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

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

Надеюсь, это поможет. Приветствия.

8 голосов
/ 29 января 2009

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

DBCC DROPCLEANBUFFERS   
DBCC FREEPROCCACHE  

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

4 голосов
/ 29 января 2009

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

DBCC DROPCLEANBUFFERS   
DBCC FREEPROCCACHE

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

3 голосов
/ 30 января 2009

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

Приведенные выше команды DBCC очищают кеш, вызывая МНОЖЕСТВЕННУЮ производительность.

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

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

2 голосов
/ 29 января 2009

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

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

0 голосов
/ 29 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...