Поделиться через


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

В этой статье описывается, как сканирование буферного пула 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 CU9, buffer_pool_scan_complete Расширенное событие было представлено для выявления длительных проверок буферного пула.

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

name database_id elapsed_time_ms Команда Операция scanned_buffers total_iterated_buffers
buffer_pool_scan_complete 7 1308 BACKUP DATABASE FlushCache 243 19932814

Примечание.

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

Обходное решение

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

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

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

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