Un de mes amis m'a dit aujourd'hui qu'au lieu de faire rebondir SQL Server, je pouvais simplement détacher puis rattacher une base de données et cette action effacerait les pages et les plans de la base de données donnée du cache. Je suis en désaccord et je fournis ma preuve ci-dessous. Si vous n'êtes pas d'accord avec moi ou avez une meilleure réfutation, fournissez-la par tous les moyens.
J'utilise AdventureWorks2012 sur cette version de SQL Server:
SELECT @@ VERSION; Microsoft SQL Server 2012 - 11.0.2100.60 (X64) Developer Edition (64 bits) sur Windows NT 6.1 (Build 7601: Service Pack 1)
Après avoir chargé la base de données, j'exécute la requête suivante:
Tout d'abord, exécutez le script d'engraissement AW de Jonathan K trouvé ici:
---------------------------
- Étape 1: Bpool Stuff?
---------------------------
USE [AdventureWorks2012];
ALLER
SÉLECTIONNER
OBJECT_NAME (p.object_id) AS [ObjectName]
, p.object_id
, p.index_id
, COUNT (*) / 128 AS [taille du tampon (Mo)]
, COUNT (*) AS [buffer_count]
DE
sys.allocation_units AS a
INNER JOIN 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
OÙ
b.database_id = DB_ID ()
ET p.object_id> 100
PAR GROUPE
p.object_id
, p.index_id
COMMANDÉ PAR
buffer_count DESC;
Le résultat est affiché ici:

Détachez et rattachez la base de données, puis réexécutez la requête.
---------------------------
- Étape 2: détacher / attacher
---------------------------
- Détacher
UTILISER [maître]
ALLER
EXEC master.dbo.sp_detach_db @dbname = N'AdventureWorks2012 '
ALLER
-- Attacher
UTILISER [maître];
ALLER
CRÉER UNE BASE DE DONNÉES [AdventureWorks2012] ON
(
FILENAME = N'C: \ sql server \ files \ AdventureWorks2012_Data.mdf '
)
,
(
FILENAME = N'C: \ sql server \ files \ AdventureWorks2012_Log.ldf '
)
POUR FIXER;
ALLER
Qu'y a-t-il dans le pool maintenant?
---------------------------
- Étape 3: Bpool Stuff?
---------------------------
USE [AdventureWorks2012];
ALLER
SÉLECTIONNER
OBJECT_NAME (p.object_id) AS [ObjectName]
, p.object_id
, p.index_id
, COUNT (*) / 128 AS [taille du tampon (Mo)]
, COUNT (*) AS [buffer_count]
DE
sys.allocation_units AS a
INNER JOIN 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
OÙ
b.database_id = DB_ID ()
ET p.object_id> 100
PAR GROUPE
p.object_id
, p.index_id
COMMANDÉ PAR
buffer_count DESC;
Et le résultat:

Toutes les lectures sont-elles logiques à ce stade?
--------------------------------
- Étape 4: lectures logiques uniquement?
--------------------------------
USE [AdventureWorks2012];
ALLER
ACTIVER STATISTIQUES IO;
SELECT * FROM DatabaseLog;
ALLER
DÉSACTIVER LES STATISTIQUES IO;
/ *
(1597 ligne (s) affectée (s))
Tableau «DatabaseLog». Nombre de balayages 1, lectures logiques 782, lectures physiques 0, lectures anticipées 768, lectures logiques lob 94, lectures physiques lob 4, lectures anticipées lob 24.
* /
Et nous pouvons voir que le pool de tampons n'a pas été totalement emporté par le détachement / attachement. On dirait que mon copain avait tort. Quelqu'un est-il en désaccord ou a-t-il un meilleur argument?
Une autre option consiste à déconnecter puis à mettre en ligne la base de données. Essayons cela.
--------------------------------
- Étape 5: Hors ligne / en ligne?
--------------------------------
ALTER DATABASE [AdventureWorks2012] SET OFFLINE;
ALLER
ALTER DATABASE [AdventureWorks2012] SET ONLINE;
ALLER
---------------------------
- Étape 6: Bpool Stuff?
---------------------------
USE [AdventureWorks2012];
ALLER
SÉLECTIONNER
OBJECT_NAME (p.object_id) AS [ObjectName]
, p.object_id
, p.index_id
, COUNT (*) / 128 AS [taille du tampon (Mo)]
, COUNT (*) AS [buffer_count]
DE
sys.allocation_units AS a
INNER JOIN 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
OÙ
b.database_id = DB_ID ()
ET p.object_id> 100
PAR GROUPE
p.object_id
, p.index_id
COMMANDÉ PAR
buffer_count DESC;
Il semble que l'opération hors ligne / en ligne ait beaucoup mieux fonctionné.
