Операции, запускающие проверку буферного пула, могут выполняться медленно на компьютерах с большим объемом памяти

В этой статье описывается, как проверка буферного пула SQL Server может занять много времени на компьютерах с большим объемом памяти.

Применяется к: SQL Server
Исходный номер базы знаний: 4566579

Симптомы

Некоторые операции в Microsoft SQL Server запускают проверку буферного пула (кэша, в котором хранятся страницы базы данных в памяти). В системах с большим объемом ОЗУ (1 ТБ памяти или больше) проверка буферного пула может занять много времени. Это замедляет операцию, которая активирует проверку.

Операции, которые вызывают проверку буферного пула

Ниже приведены некоторые операции, которые могут вызвать проверку буферного пула:

  • Запуск базы данных
  • Завершение работы или перезапуск базы данных
  • Отработка отказа группы доступности
  • Удаление базы данных (удаление)
  • Удаление файлов из базы данных
  • Полная или разностная резервная копия базы данных
  • Восстановление базы данных
  • Восстановление журнала транзакций
  • Восстановление по сети
  • DBCC CHECKDB или DBCC CHECKTABLE операция

Журнал ошибок показывает, что сканирование заняло много времени

Начиная с SQL Server 2016 с пакетом обновления 3 (SP3),SQL Server 2017 CU23 и SQL Server 2019 CU9 в журнал ошибок SQL Server добавлено сообщение об ошибке, указывающее, что проверка буферного пула занимает много времени (10 секунд или больше):

Проверка буферного пула заняла 14 секунд: база данных с идентификатором 7, команда "BACKUP DATABASE", операция "FlushCache", сканированные буферы 115, общее количество итерированных буферов 204640239, время ожидания 0 мс. Дополнительные сведения см. в разделе "https://go.microsoft.com/fwlink/?linkid=2132602".

Расширенное событие для диагностики длительной проверки

Кроме того, начиная с тех же сборок SQL Server 2016 с пакетом обновления 3 (SP3),SQL Server 2017 CU23 и SQL Server 2019 с накопительным пакетом обновления 9 (CU9) появилось расширенное событие buffer_pool_scan_complete, которое поможет вам определить длинные проверки буферного пула.

Если проверка занимает более 1 секунды, событие XEvent будет записано следующим образом, когда событие включено.

name database_id elapsed_time_ms Команда Операции scanned_buffers total_iterated_buffers
buffer_pool_scan_complete 7 1308 РЕЗЕРВНАЯ БАЗА ДАННЫХ FlushCache 243 19932814

Примечание.

Пороговое значение в XEvent меньше, что позволяет собирать информацию с более детальной детализацией.

Обходной путь

До SQL Server 2022 года не было способа устранить эту проблему. Не рекомендуется выполнять какие-либо действия по очистке буферного пула, так как удаление чистых буферов (DBCC DROPCLEANBUFFERS) из буферного пула может привести к значительному снижению производительности. Удаление страниц базы данных из памяти приведет к тому, что последующие выполнения запросов будут повторно считывать данные из файлов базы данных на диске. Этот процесс доступа к данным с помощью дискового ввода-вывода приводит к медленному выполнению запросов.

В SQL Server 2022 г. эта проблема устранена, так как проверка буферного пула выполняется параллельно с использованием нескольких ядер. На 8 миллионов буферов (64 ГБ) будет выполняться одна задача, при которой последовательное сканирование будет по-прежнему использоваться при наличии менее 8 миллионов буферов. Дополнительные сведения watch Параллельное сканирование буферного пула.

Дополнительная информация

Дополнительные сведения о проблемах, которые могут возникнуть в больших буферных пулах, см. в разделе SQL Server: контрольные точки больших объемов ОЗУ и базы данных.