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.
