Мой приятель сказал мне сегодня, что вместо отскока SQL Server я мог бы просто отсоединить, а затем повторно присоединить базу данных, и это действие очистило бы страницы и планы данной базы данных из кэша. Я не согласен и представлю свои доказательства ниже. Если вы не согласны со мной или у вас есть лучшее опровержение, чем это обязательно сделайте.
Я использую AdventureWorks2012 в этой версии SQL Server:
ВЫБЕРИТЕ @@ VERSION; Microsoft SQL Server 2012 - 11.0.2100.60 (X64) Developer Edition (64-разрядная версия) в Windows NT 6.1 (сборка 7601: пакет обновления 1)
Загрузив базу данных, я запускаю следующий запрос:
Во-первых, запустите сценарий откорма Jonathan K AW, найденный здесь:
--------------------------- - Шаг 1: Булл-хаус? --------------------------- ИСПОЛЬЗОВАНИЕ [AdventureWorks2012]; ИДТИ ВЫБРАТЬ OBJECT_NAME (p.object_id) AS [ObjectName] , p.object_id , p.index_id , COUNT (*) / 128 AS [размер буфера (МБ)] , COUNT (*) AS [buffer_count] ОТ sys.allocation_units AS a ВНУТРЕННЕЕ СОЕДИНЕНИЕ sys.dm_os_buffer_descriptors AS b ON a.allocation_unit_id = b.allocation_unit_id ВНУТРЕННЕЕ СОЕДИНЕНИЕ sys.partitions AS p ON a.container_id = p.hobt_id ГДЕ b.database_id = DB_ID () AND p.object_id> 100 ГРУППА ПО p.object_id , p.index_id СОРТИРОВАТЬ ПО buffer_count DESC;
Результат показан здесь:
Отсоедините и снова присоедините базу данных, а затем повторно запустите запрос.
--------------------------- - Шаг 2: отсоединить / прикрепить --------------------------- - отсоединить ИСПОЛЬЗОВАТЬ [мастер] ИДТИ EXEC master.dbo.sp_detach_db @dbname = N'AdventureWorks2012 ' ИДТИ -- Прикреплять ИСПОЛЬЗОВАТЬ [мастер]; ИДТИ СОЗДАТЬ БАЗУ ДАННЫХ [AdventureWorks2012] ВКЛ ( FILENAME = N'C: \ sql server \ files \ AdventureWorks2012_Data.mdf ' ) , ( FILENAME = N'C: \ sql server \ files \ AdventureWorks2012_Log.ldf ' ) ДЛЯ ПРИЛОЖЕНИЯ; ИДТИ
Что сейчас в пуле?
--------------------------- - Шаг 3: Bpool Stuff? --------------------------- ИСПОЛЬЗОВАНИЕ [AdventureWorks2012]; ИДТИ ВЫБРАТЬ OBJECT_NAME (p.object_id) AS [ObjectName] , p.object_id , p.index_id , COUNT (*) / 128 AS [размер буфера (МБ)] , COUNT (*) AS [buffer_count] ОТ sys.allocation_units AS a ВНУТРЕННЕЕ СОЕДИНЕНИЕ sys.dm_os_buffer_descriptors AS b ON a.allocation_unit_id = b.allocation_unit_id ВНУТРЕННЕЕ СОЕДИНЕНИЕ sys.partitions AS p ON a.container_id = p.hobt_id ГДЕ b.database_id = DB_ID () AND p.object_id> 100 ГРУППА ПО p.object_id , p.index_id СОРТИРОВАТЬ ПО buffer_count DESC;
И результат:
Все ли чтения логичны на этом этапе?
-------------------------------- - Шаг 4: только логическое чтение? -------------------------------- ИСПОЛЬЗОВАНИЕ [AdventureWorks2012]; ИДТИ ВКЛЮЧИТЬ СТАТИСТИКУ IO ON; SELECT * FROM DatabaseLog; ИДТИ ВЫКЛЮЧИТЬ СТАТИСТИКУ IO OFF; / * (Затронуто 1597 строк) Таблица «DatabaseLog». Сканирование 1, логическое чтение 782, физическое чтение 0, чтение с опережением 768, логическое чтение с 94, физическое чтение с 4, предварительное чтение с чтения 24. * /
И мы видим, что буферный пул не был полностью удален отсоединением / присоединением. Похоже, мой друг ошибся. Кто-нибудь не согласен или есть лучший аргумент?
Другой вариант - отключить и затем подключить базу данных. Давайте попробуем это.
-------------------------------- - Шаг 5: Оффлайн / Онлайн? -------------------------------- ALTER DATABASE [AdventureWorks2012] SET OFFLINE; ИДТИ ALTER DATABASE [AdventureWorks2012] SET ONLINE; ИДТИ --------------------------- - Шаг 6: Bpool Stuff? --------------------------- ИСПОЛЬЗОВАНИЕ [AdventureWorks2012]; ИДТИ ВЫБРАТЬ OBJECT_NAME (p.object_id) AS [ObjectName] , p.object_id , p.index_id , COUNT (*) / 128 AS [размер буфера (МБ)] , COUNT (*) AS [buffer_count] ОТ sys.allocation_units AS a ВНУТРЕННЕЕ СОЕДИНЕНИЕ sys.dm_os_buffer_descriptors AS b ON a.allocation_unit_id = b.allocation_unit_id ВНУТРЕННЕЕ СОЕДИНЕНИЕ sys.partitions AS p ON a.container_id = p.hobt_id ГДЕ b.database_id = DB_ID () AND p.object_id> 100 ГРУППА ПО p.object_id , p.index_id СОРТИРОВАТЬ ПО buffer_count DESC;
Похоже, что работа в автономном / онлайн режиме работала намного лучше.
источник