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

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

Примечание

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

Основные команды

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

Включение или выключение кэширования результирующего набора для сеанса

Проверка размера кэшированного результирующего набора

Очистка кэша

Что сохраняется в кэш

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

  • Запросы со встроенными функциями или выражениями среды выполнения, которые являются недетерминированными даже при отсутствии изменений в данных или запросах базовых таблиц. Примеры: DateTime.Now(), GetDate().
  • запросы с пользовательскими функциями;
  • Запросы, использующие таблицы с безопасностью на уровне строк
  • запросы, возвращающие данные с размером строк более 64 КБ.
  • запросы, возвращающие большой объем данных (больше 10 ГБ).

Примечание

  • Некоторые недетерминированные функции и выражения среды выполнения могут быть детерминированными для повторяющихся запросов к одним и тем же данным. Пример: ROW_NUMBER().
  • Используйте в запросе предложение ORDER BY, если порядок или последовательность строк в его результирующем наборе важны для логики приложения.
  • Если данные в столбцах ORDER BY не являются уникальными, порядок строк с одинаковыми значениями в столбцах ORDER BY является неопределенным независимо от того, включено ли кэширование результирующего набора.

Важно!

Операции по созданию кэша результирующего набора и извлечению данных из кэша выполняются на управляющем узле экземпляра выделенного пула SQL. Если включено кэширование результирующего набора, запросы, возвращающие большие результирующие наборы данных (например, >1 ГБ), могут привести к высокому регулированию ресурсов ядра управляющего узла и увеличить общее время ответа на запрос экземпляра. Как правило, такие запросы используются в ходе исследования данных, а также при выполнении операций извлечения, преобразования и загрузки. Чтобы избежать чрезмерной загрузки управляющего узла и снижения производительности, перед выполнением запросов такого типа пользователям следует отключить кэширование результирующего набора для базы данных.

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

SELECT step_index, operation_type, location_type, status, total_elapsed_time, command
FROM sys.dm_pdw_request_steps
WHERE request_id  = <'request_id'>;

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

Снимок экрана с результатами запроса, включая тип расположения и команду.

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

Снимок экрана с результатами запроса, в котором выполнена команда select * from [D W ResultCache D b] точка d b o.

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

Для запроса повторно используется кэшированный результирующий набор при соблюдении всех следующих требований:

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

Выполните эту команду, чтобы проверить, как был выполнен запрос — с попаданием или промахом в кэше результатов. Столбец result_cache_hit возвращает 1 для попадания в кэше, 0 для промаха кэша и отрицательные значения для причин, по которым кэширование результирующего набора не использовалось. Дополнительные сведения см. в описании sys.dm_pdw_exec_requests.

SELECT request_id, command, result_cache_hit FROM sys.dm_pdw_exec_requests
WHERE request_id = <'Your_Query_Request_ID'>

Управление кэшированными результатами

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

Выделенный пул SQL автоматически осуществляет исключение из кэша по следующему расписанию:

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

Пользователи могут вручную очистить весь кэш результирующих наборов, воспользовавшись одним из следующих вариантов:

  • Отключение функции кэша результирующих наборов для базы данных.
  • Выполнение инструкции DBCC DROPRESULTSETCACHE при установленном подключении к базе данных.

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

Дальнейшие действия

Дополнительные советы по разработке приведены в обзоре разработки.