Löscht / Trennt oder Offline / Online den Puffercache für eine bestimmte Datenbank?

8

Ein Freund von mir sagte mir heute, anstatt SQL Server zu bouncen, könnte ich einfach eine Datenbank trennen und dann wieder anhängen, und diese Aktion würde die Seiten und Pläne der angegebenen Datenbank aus dem Cache löschen. Ich war anderer Meinung und legte meine Beweise unten vor. Wenn Sie mit mir nicht einverstanden sind oder eine bessere Widerlegung haben, als auf jeden Fall liefern.

Ich verwende AdventureWorks2012 für diese Version von SQL Server:

VERSION AUSWÄHLEN;
Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
Developer Edition (64-Bit) unter Windows NT 6.1 (Build 7601: Service Pack 1)

Nachdem ich die Datenbank geladen habe, führe ich die folgende Abfrage aus:

Führen Sie zunächst Jonathan Ks AW-Mast-Skript aus, das Sie hier finden:

AW Fett werden

---------------------------
- Schritt 1: Bpool Stuff?
---------------------------
USE [AdventureWorks2012];
GEHEN

WÄHLEN
     OBJECT_NAME (p.object_id) AS [ObjectName]
   , p.object_id
   , p.index_id
   , COUNT (*) / 128 AS [Puffergröße (MB)]
   , COUNT (*) AS [buffer_count]
VON
     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
WO
     b.database_id = DB_ID ()
     AND p.object_id> 100
GRUPPIERE NACH
     p.object_id
   , p.index_id
SORTIEREN NACH
     buffer_count DESC;

Das Ergebnis wird hier gezeigt: Geben Sie hier die Bildbeschreibung ein

Trennen Sie die Datenbank, hängen Sie sie erneut an und führen Sie die Abfrage erneut aus.

---------------------------
- Schritt 2: Abnehmen / Anbringen
---------------------------
-- Ablösen
USE [master]
GEHEN
EXEC master.dbo.sp_detach_db @dbname = N'AdventureWorks2012 '
GEHEN

-- Anfügen
USE [master];
GEHEN

CREATE DATABASE [AdventureWorks2012] ON 
( 
    FILENAME = N'C: \ SQL Server \ Dateien \ AdventureWorks2012_Data.mdf ' 
)
    ,
( 
    FILENAME = N'C: \ SQL Server \ Dateien \ AdventureWorks2012_Log.ldf ' 
)
 FÜR BEFESTIGEN;
GEHEN

Was ist jetzt im Pool?

---------------------------
- Schritt 3: Bpool Stuff?
---------------------------
USE [AdventureWorks2012];
GEHEN

WÄHLEN
     OBJECT_NAME (p.object_id) AS [ObjectName]
   , p.object_id
   , p.index_id
   , COUNT (*) / 128 AS [Puffergröße (MB)]
   , COUNT (*) AS [buffer_count]
VON
     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
WO
     b.database_id = DB_ID ()
     AND p.object_id> 100
GRUPPIERE NACH
     p.object_id
   , p.index_id
SORTIEREN NACH
     buffer_count DESC;

Und das Ergebnis: Geben Sie hier die Bildbeschreibung ein

Sind alle Lesevorgänge zu diesem Zeitpunkt logisch?

--------------------------------
- Schritt 4: Nur logische Lesevorgänge?
--------------------------------
USE [AdventureWorks2012];
GEHEN

SET STATISTICS IO ON;   
    SELECT * FROM DatabaseLog;
    GEHEN
SET STATISTICS IO OFF;  

/ *
(1597 betroffene Zeile (n))
Tabelle 'DatabaseLog'. Scananzahl 1, logische Lesevorgänge 782, physische Lesevorgänge 0, Vorauslesevorgänge 768, logische Vorlesevorgänge 94, physikalische Vorlesevorgänge 4, Vorlesevorgänge 24.
* /  

Und wir können sehen, dass der Pufferpool durch das Trennen / Anhängen nicht vollständig weggeblasen wurde. Scheint, als hätte sich mein Kumpel geirrt. Ist jemand anderer Meinung oder hat er ein besseres Argument?

Eine andere Möglichkeit besteht darin, die Datenbank offline und dann online zu schalten. Lassen Sie uns das versuchen.

--------------------------------
- Schritt 5: Offline / Online?
--------------------------------
ALTER DATABASE [AdventureWorks2012] SET OFFLINE;
GEHEN
ALTER DATABASE [AdventureWorks2012] ONLINE SETZEN;
GEHEN

---------------------------
- Schritt 6: Bpool Stuff?
---------------------------
USE [AdventureWorks2012];
GEHEN

WÄHLEN
     OBJECT_NAME (p.object_id) AS [ObjectName]
   , p.object_id
   , p.index_id
   , COUNT (*) / 128 AS [Puffergröße (MB)]
   , COUNT (*) AS [buffer_count]
VON
     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
WO
     b.database_id = DB_ID ()
     AND p.object_id> 100
GRUPPIERE NACH
     p.object_id
   , p.index_id
SORTIEREN NACH
     buffer_count DESC;

Es scheint, dass der Offline- / Online-Betrieb viel besser funktioniert hat.

Geben Sie hier die Bildbeschreibung ein

ooutwire
quelle

Antworten:

9

Ich dachte anfangs, du hättest hier etwas vor. Die Arbeitsannahme war in etwa so, dass der Pufferpool möglicherweise nicht sofort geleert wurde, da dies "etwas Arbeit" erfordert und warum man sich die Mühe macht, bis der Speicher benötigt wird. Aber...

Ihr Test ist fehlerhaft.

Was Sie im Pufferpool sehen, sind die Seiten, die als Ergebnis des erneuten Anhängens der Datenbank gelesen wurden, nicht die Überreste der vorherigen Instanz der Datenbank.

Und wir können sehen, dass der Pufferpool durch das Trennen / Anhängen nicht vollständig weggeblasen wurde. Scheint, als hätte sich mein Kumpel geirrt. Ist jemand anderer Meinung oder hat er ein besseres Argument?

Ja. Sie interpretieren physical reads 0so, dass es keine physischen Lesevorgänge gab

Tabelle 'DatabaseLog'. Scananzahl 1, logische Lesevorgänge 782, physische Lesevorgänge 0, Vorlesevorgänge 768 , logische Vorlesevorgänge 94, physikalische Vorlesevorgänge 4, Vorlesevorgänge 24.

Wie in Craig Freedmans Blog beschrieben , versucht der sequentielle Vorauslesemechanismus sicherzustellen, dass sich Seiten im Speicher befinden, bevor sie vom Abfrageprozessor angefordert werden. Aus diesem Grund wird eine Anzahl von null oder weniger als erwartet angezeigt.

Wenn SQL Server einen sequentiellen Scan einer großen Tabelle durchführt, initiiert die Speicher-Engine den Vorauslesemechanismus, um sicherzustellen, dass sich die Seiten im Speicher befinden und zum Scannen bereit sind, bevor sie vom Abfrageprozessor benötigt werden. Der Vorauslesemechanismus versucht, 500 Seiten vor dem Scan zu bleiben.

Keine der Seiten, die zur Erfüllung Ihrer Anfrage erforderlich waren, befand sich im Speicher, bis sie vorgelesen wurden.

Warum Online / Offline zu einem anderen Pufferpoolprofil führt, ist eine etwas müßigere Untersuchung erforderlich. @MarkSRasmussen kann uns möglicherweise bei seinem nächsten Besuch helfen.

Mark Storey-Smith
quelle