Кэширование плана выполнения SQL - PullRequest
6 голосов
/ 25 января 2012

У меня есть несколько вопросов относительно производительности Microsoft SQL Server 2008, в основном о планах выполнения.

Согласно MSDN , хранимые процедуры имеют более высокую производительность по сравнению с прямыми запросами SQL, потому что:

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

Мой первый вопрос: почему это так?дело.Ранее я читал, что при использовании параметризованных запросов (подготовленных операторов) план выполнения кэшируется для последующих выполнений с потенциально различными значениями (контекст выполнения).Будет ли хранимая процедура еще более эффективной?Если да, то план выполнения хранимой процедуры воссоздается только по требованию или он просто менее вероятен для удаления из кэша?Рассматривается ли параметризованный запрос как специальный запрос , означающий, что план выполнения с большей вероятностью будет удален из кэша?

Кроме того, поскольку я еще новичок в этой области, мне интересно, есть ли определенные команды, которые работают только в T-SQL.У меня есть запрос, который занимает ~ 12 секунд для выполнения при первом запуске, а затем ~ 3 секунды после этого, как в Microsoft SQL Management Studio, так и в ADO.NET.Предполагается, что запрос будет неэффективным в рамках моей презентации.Дело в том, что в моем запросе я использую CHECKPOINT и DBCC DROPCLEANBUFFERS согласно этой статье , а также OPTION (RECOMPILE).Тем не менее, по крайней мере, два первых, кажется, не имеют значения, так как запрос все равно займет 3 секунды.Я думаю, это связано с тем, что кэш данных не очищается.Любые идеи, почему кеш не очищается, или идеи о том, почему мой запрос значительно быстрее после первого выполнения?

Это вопросы, о которых я мог подумать.

1 Ответ

3 голосов
/ 25 января 2012

«Будет ли хранимая процедура еще более эффективной?»: По существу, нет. Это экономит очень мало. С точки зрения производительности, вы можете в значительной степени использовать литералы SQL в своем приложении (кроме случаев, когда они ОГРОМНЫ). SQL Server будет точно соответствовать строке, которую вы отправляете в кешированный план.

"У меня есть запрос, который занимает ~ 12 секунд для выполнения при первом запуске, а затем ~ 3 секунды после" Учитывая, что вы очистили все кэши, это, вероятно, проблема статистики. SQL Server автоматически создает статистику при первом обращении к столбцу. Я думаю, это то, что однажды случилось с тобой. Попробуйте запустить sp_updatestats (перед тем, как очистить кеши).

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