Сохраняют ли хранимые процедуры SQL Server результаты данных?

11

Я слышал это от друзей, но никогда не исследовал, правда ли это.

Правда ли, что результаты данных выполненного запроса хранятся в кеше?

Я имею в виду, если у меня есть хранимая процедура, как:

SELECT * FROM USERLIST

... правда ли, что результат (в данном случае список пользователей) хранится в кеше.

Кроме того, если у меня есть эти:

SELECT * FROM USERLIST WHERE user="user"
SELECT * FROM USERLIST WHERE user="userzzz"

(в котором user / userzzz передаются в качестве параметров), верно ли, что он хранит 2 разных результата в кэше базы данных.

Я так не думаю, но я хочу от вас подтверждения, эксперты!


источник
только что ответил для вас

Ответы:

19

Результаты запроса не кэшируются

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

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

Скомпилированный план выполнения будет сохранен в кеше, откуда и возникает путаница

ГБН
источник
«То есть результаты запроса будут оцениваться при каждом выполнении, но таблицы (и любые индексы и т. Д.), Используемые запросом, скорее всего, уже будут в памяти». Да, также я не использую SP Я думаю ... это оптимизация базы данных, которая не имеет значения для Sp, верно?
@markzzz: почти весь SQL-код компилируется в план выполнения, будь то прямое ОБНОВЛЕНИЕ, SELECT или хранимая процедура
gbn
6

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

Процедуры остаются в кэше для других пользователей, пока есть место. Процедуры удаляются с использованием алгоритма наименьшего количества использовавшихся (LRU).


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

Итак, в кеше находится оптимизированный план из хранимой процедуры, а не результаты хранимой процедуры.

аР.
источник
6

Когда запрос готов к обработке SQL Server, SQL Manager ищет его в cache; и если его там нет, он должен быть скомпилирован. Процесс компиляции включает в себя несколько вещей.

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

Обратитесь к Compilation and Executionразделу « Внутренние компоненты и архитектура процессора запросов Microsoft SQL Server» для получения подробной информации об обработке запросов и т. Д.

Конечным продуктом этапа компиляции является план запроса, который помещается в кэш процедур. Результат / операция SQL-запроса может иметь размер в МБ, ГБ, поэтому он не помещается в кэш процедур или план запросов.

Проверьте следующую диаграмму (из MSDN) для выполнения хранимой процедуры, чтобы прояснить ваш вопрос: введите описание изображения здесь

Ниранджан Сингх
источник
-1

SQL Server в основном выполняет эти шаги для выполнения любого запроса (вызов хранимой процедуры или специальный оператор SQL):

1) синтаксически проверить запрос
2) если он в порядке - он проверяет кэш плана, чтобы увидеть, есть ли у него уже план выполнения для этого запроса
3) если есть план выполнения - этот план (повторно) используется и запрос выполняется
4) если плана еще нет, определяется план выполнения
5) этот план сохраняется в кэше планов для последующего повторного использования
6) выполняется запрос

(копия ответа Marc_s)

Nighil
источник
-1

Как утверждали другие, результаты запросов в SQL Server не кэшируются.

Если вы хотите кэшировать результаты запроса (или SP), есть обходные пути. Например, посмотрите эту статью на сайте Brent Ozar .

pedrofernandes
источник