Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описывается, как сканирование буферного пула 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 будет записан следующим образом, когда событие включено.
имя | идентификатор_базы_данных | время_истекло_мс | Команда | Операция | сканированные буферы | общее число итерационных буферов |
---|---|---|---|---|---|---|
сканирование_буферного_пула_завершено | 7 | 1308 | РЕЗЕРВНОЕ КОПИРОВАНИЕ БАЗЫ ДАННЫХ | СбросКэша | 243 | 19932814 |
Примечание.
Пороговое значение в XEvent меньше, чтобы вы могли фиксировать информацию более детально.
Обходное решение
До SQL Server 2022 не было способа устранить эту проблему. Не рекомендуется выполнять какие-либо действия для очистки буферного пула, так как удаление чистых буферов (DBCC DROPCLEANBUFFERS) из буферного пула может привести к значительному снижению производительности. Удаление страниц базы данных из памяти приведет к повторному чтению данных из файлов базы данных на диске. Этот процесс доступа к данным через дисковый ввод-вывод приводит к замедлению запросов.
В SQL Server 2022 эта проблема устранена, так как сканирование буферного пула параллелизировано с помощью нескольких ядер. Будет одна задача на 8 миллионов буферов (64 ГБ), где последовательная проверка по-прежнему будет использоваться, если есть менее 8 миллионов буферов. Для получения дополнительной информации посмотрите Параллельное сканирование буферного пула.
Дополнительная информация
Дополнительные сведения о проблемах, которые могут возникнуть в больших буферных пулах, см. в статье SQL Server: крупные ОЗУ и контрольные точки базы данных.