Um amigo meu me disse hoje que, em vez de devolver o SQL Server, eu poderia simplesmente desanexar e reconectar um banco de dados, e essa ação limparia as páginas e os planos do banco de dados fornecidos do cache. Discordei e forneço minhas evidências abaixo. Se você discorda de mim ou tem uma refutação melhor, do que por qualquer meio forneça-a.
Estou usando o AdventureWorks2012 nesta versão do SQL Server:
SELECT @@ VERSION; Microsoft SQL Server 2012 - 11.0.2100.60 (X64) Developer Edition (64 bits) no Windows NT 6.1 (Build 7601: Service Pack 1)
Depois de carregar o banco de dados, eu executo a seguinte consulta:
Em primeiro lugar, execute o script de engorda AW de Jonathan K encontrado aqui:
--------------------------- - Etapa 1: Bpool Stuff? --------------------------- USE [AdventureWorks2012]; VAI SELECT OBJECT_NAME (p.object_id) AS [ObjectName] , p.object_id , p.index_id , COUNT (*) / 128 AS [tamanho do buffer (MB)] , COUNT (*) AS [buffer_count] DE sys.allocation_units como um JUNÇÃO INTERNA sys.dm_os_buffer_descriptors AS b ON a.allocation_unit_id = b.allocation_unit_id INNER JOIN sys.partitions AS p ON a.container_id = p.hobt_id ONDE b.database_id = DB_ID () AND p.object_id> 100 GRUPO POR p.object_id , p.index_id ORDENAR POR buffer_count DESC;
O resultado é mostrado aqui:
Desanexe e reconecte o banco de dados e execute novamente a consulta.
--------------------------- - Etapa 2: desanexar / anexar --------------------------- - Destacar USE [mestre] VAI EXEC master.dbo.sp_detach_db @dbname = N'AdventureWorks2012 ' VAI - Anexar USE [mestre]; VAI CRIAR BASE DE DADOS [AdventureWorks2012] LIGADO ( FILENAME = N'C: \ sql server \ files \ AdventureWorks2012_Data.mdf ' ) , ( FILENAME = N'C: \ sql server \ files \ AdventureWorks2012_Log.ldf ' ) PARA ANEXAR; VAI
O que há no bpool agora?
--------------------------- - Etapa 3: Bpool Stuff? --------------------------- USE [AdventureWorks2012]; VAI SELECT OBJECT_NAME (p.object_id) AS [ObjectName] , p.object_id , p.index_id , COUNT (*) / 128 AS [tamanho do buffer (MB)] , COUNT (*) AS [buffer_count] DE sys.allocation_units como um JUNÇÃO INTERNA sys.dm_os_buffer_descriptors AS b ON a.allocation_unit_id = b.allocation_unit_id INNER JOIN sys.partitions AS p ON a.container_id = p.hobt_id ONDE b.database_id = DB_ID () AND p.object_id> 100 GRUPO POR p.object_id , p.index_id ORDENAR POR buffer_count DESC;
E o resultado:
Todas as leituras são lógicas neste momento?
-------------------------------- - Etapa 4: somente leituras lógicas? -------------------------------- USE [AdventureWorks2012]; VAI ESTATÍSTICAS LIGADAS; SELECT * FROM DatabaseLog; VAI DESLIGAR ESTATÍSTICAS IO; / * (1597 linhas afetadas) Tabela 'DatabaseLog'. Contagem de varreduras 1, leituras lógicas 782, leituras físicas 0, leituras de leitura antecipada 768, leituras lógicas de lob 94, leituras físicas de lob 4, leituras físicas de lob 4, leituras de leitura antecipada de lob 24. * /
E podemos ver que o buffer pool não foi totalmente deslumbrado com a desanexação / conexão. Parece que meu amigo estava errado. Alguém discorda ou tem um argumento melhor?
Outra opção é offline e, em seguida, online o banco de dados. Vamos tentar isso.
-------------------------------- - Etapa 5: offline / online? -------------------------------- ALTER DATABASE [AdventureWorks2012] SET OFFLINE; VAI ALTER DATABASE [AdventureWorks2012] SET ONLINE; VAI --------------------------- - Etapa 6: Bpool Stuff? --------------------------- USE [AdventureWorks2012]; VAI SELECT OBJECT_NAME (p.object_id) AS [ObjectName] , p.object_id , p.index_id , COUNT (*) / 128 AS [tamanho do buffer (MB)] , COUNT (*) AS [buffer_count] DE sys.allocation_units como um JUNÇÃO INTERNA sys.dm_os_buffer_descriptors AS b ON a.allocation_unit_id = b.allocation_unit_id INNER JOIN sys.partitions AS p ON a.container_id = p.hobt_id ONDE b.database_id = DB_ID () AND p.object_id> 100 GRUPO POR p.object_id , p.index_id ORDENAR POR buffer_count DESC;
Parece que a operação offline / online funcionou muito melhor.
fonte