Löscht die Datenbank den Puffercache und den gespeicherten Prozesscache

8

Auf unserem Entwicklungsserver aktualisieren wir jede Woche die Datenbank (Wiederherstellung aus Produktionssicherung). Meine Frage ist, löscht die Wiederherstellung der Datenbank ihren Puffer-Cache / Cache für gespeicherte Prozeduren aus dem SQL-Speicher? Hat es den gleichen / ähnlichen Effekt von DBCC FREEPROCCACHEundDBCC DROPCLEANBUFFERS

Vielen Dank.

Joy Walker
quelle
2
Wenn Sie von einem Backup wiederherstellen, glaube ich nicht, dass dies der Fall ist. Ich könnte mich irren und werde gerne hören warum.
Kermit
7
Verwandte / ähnliche Themen
Mark Storey-Smith

Antworten:

13

Ja. Der Puffer und der Plan-Cache, die der Datenbank vor der Wiederherstellung zugeordnet sind, beziehen sich nicht auf die Datenbank nach der Wiederherstellung, sodass sie gelöscht werden. In jeder Hinsicht ist die wiederhergestellte Datenbank eine völlig separate, nicht verwandte Einheit. Es gibt nichts im Cache, das wiederverwendet werden kann.

Mark Storey-Smith
quelle
12

Interessante Frage und (jetzt sehe ich, dass @ MarkStorey-Smith geantwortet hat, zögere ich zu antworten - also akzeptiere seine, da er zuerst geantwortet hat) Ich habe mich entschlossen, etwas zu überprüfen. Ich habe eine Datenbank mit dem Namen analysiseiner meiner lokalen VMs. Also habe ich dieses Skript ausgeführt (weitere Informationen zum Puffer und die Basis für meine Abfragen finden Sie hier ):

SELECT database_id 
    FROM sys.databases
    WHERE name = 'analysis';
GO
-- database_id = 7


            DECLARE @total_buffer INT;
            SELECT  @total_buffer = cntr_value
                FROM sys.dm_os_performance_counters
                WHERE RTRIM([object_name]) LIKE '%Buffer Manager'
                    AND (counter_name = 'Total Pages' --this is 2008
                    OR counter_name = 'Database pages'); -- this is 2012
            ;WITH src AS (
                SELECT
                    database_id, DB_Buffer_Pages = COUNT_BIG(*)
                    FROM sys.dm_os_buffer_descriptors
                    --WHERE database_id BETWEEN 5 AND 32766
                    GROUP BY database_id
                )

            SELECT 
                @@SERVERNAME AS InstanceName,
                GETDATE() AS collection_date,
                database_name = DB_NAME(mem.database_id), 
                db_buffer_pages, 
                cached_size_mb,
                db_buffer_pct, 
                cpu_time, 
                cpu_percent_usage, 
                total_io_mb, 
                io_percent          
            FROM (              
                    SELECT
                    database_id,
                    db_buffer_pages = DB_Buffer_Pages,
                    cached_size_mb = DB_Buffer_Pages / 128.0,
                    db_buffer_pct = CONVERT(DECIMAL(6,3),
                                        DB_Buffer_Pages * 100.0 / @total_buffer)        
                    FROM src
                ) mem
                JOIN (
                        SELECT 
                            database_id, cpu_time, 
                            CAST(cpu_time * 1.0 / SUM(cpu_time) OVER() * 100.0 AS DECIMAL(5, 2)) AS cpu_percent_usage
                        FROM (
                                SELECT database_id, SUM(total_worker_time) AS cpu_time
                                FROM sys.dm_exec_query_stats AS qs
                                CROSS APPLY (SELECT CONVERT(int, value) AS database_id 
                                                FROM sys.dm_exec_plan_attributes(qs.plan_handle)
                                                WHERE attribute = N'dbid') AS F_DB
                                GROUP BY database_id) DB_CPU_Stats
                ) cpu
                    ON mem.database_id = cpu.database_id
                JOIN (
                        SELECT database_id, io_in_mb AS [total_io_mb],
                            CAST(io_in_mb/ SUM(io_in_mb) OVER() * 100.0 AS DECIMAL(5,2)) AS [io_percent]
                        FROM (
                                SELECT database_id,
                                    CAST(SUM(num_of_bytes_read + num_of_bytes_written)/1048576 AS DECIMAL(12, 2)) AS io_in_mb
                                FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS [DM_IO_STATS]
                                GROUP BY database_id) Aggregate_IO_Statistics) [io]
                ON mem.database_id = [io].database_id             
            where mem.database_id = 7
GO  


-- 471

USE master
GO

BACKUP DATABASE analysis TO DISK=N'analysis.bak';
GO
BACKUP LOG analysis TO DISK=N'analysis.trn' WITH NORECOVERY;
GO
RESTORE DATABASE analysis FROM DISK=N'analysis.bak' WITH NORECOVERY;
GO
RESTORE DATABASE analysis FROM DISK=N'analysis.trn';
GO


            DECLARE @total_buffer INT;
            SELECT  @total_buffer = cntr_value
                FROM sys.dm_os_performance_counters
                WHERE RTRIM([object_name]) LIKE '%Buffer Manager'
                    AND (counter_name = 'Total Pages' --this is 2008
                    OR counter_name = 'Database pages'); -- this is 2012
            ;WITH src AS (
                SELECT
                    database_id, DB_Buffer_Pages = COUNT_BIG(*)
                    FROM sys.dm_os_buffer_descriptors
                    --WHERE database_id BETWEEN 5 AND 32766
                    GROUP BY database_id
                )

            SELECT 
                @@SERVERNAME AS InstanceName,
                GETDATE() AS collection_date,
                database_name = DB_NAME(mem.database_id), 
                db_buffer_pages, 
                cached_size_mb,
                db_buffer_pct, 
                cpu_time, 
                cpu_percent_usage, 
                total_io_mb, 
                io_percent          
            FROM (              
                    SELECT
                    database_id,
                    db_buffer_pages = DB_Buffer_Pages,
                    cached_size_mb = DB_Buffer_Pages / 128.0,
                    db_buffer_pct = CONVERT(DECIMAL(6,3),
                                        DB_Buffer_Pages * 100.0 / @total_buffer)        
                    FROM src
                ) mem
                JOIN (
                        SELECT 
                            database_id, cpu_time, 
                            CAST(cpu_time * 1.0 / SUM(cpu_time) OVER() * 100.0 AS DECIMAL(5, 2)) AS cpu_percent_usage
                        FROM (
                                SELECT database_id, SUM(total_worker_time) AS cpu_time
                                FROM sys.dm_exec_query_stats AS qs
                                CROSS APPLY (SELECT CONVERT(int, value) AS database_id 
                                                FROM sys.dm_exec_plan_attributes(qs.plan_handle)
                                                WHERE attribute = N'dbid') AS F_DB
                                GROUP BY database_id) DB_CPU_Stats
                ) cpu
                    ON mem.database_id = cpu.database_id
                JOIN (
                        SELECT database_id, io_in_mb AS [total_io_mb],
                            CAST(io_in_mb/ SUM(io_in_mb) OVER() * 100.0 AS DECIMAL(5,2)) AS [io_percent]
                        FROM (
                                SELECT database_id,
                                    CAST(SUM(num_of_bytes_read + num_of_bytes_written)/1048576 AS DECIMAL(12, 2)) AS io_in_mb
                                FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS [DM_IO_STATS]
                                GROUP BY database_id) Aggregate_IO_Statistics) [io]
                ON mem.database_id = [io].database_id             
            where mem.database_id = 7

--242

471 Pufferseiten vor der Wiederherstellung, 242 danach. Leider habe ich die Seitentypen im Cache nicht aggregiert, aber ich glaube, dass die Seiten im Cache damit zu tun haben, dass ich die Pufferanalyse-Abfragen ausgeführt habe.

Hier sind die Ergebnisse der Abfrage für vor und nach der Wiederherstellung Analyse ... analysis.

VOR: Geben Sie hier die Bildbeschreibung ein

POST: Geben Sie hier die Bildbeschreibung ein

Swasheck
quelle
9

Wie Swasheck und Mark begann ich zu spielen, als dieser herauskam. Bitte akzeptiere diese Antwort nicht, akzeptiere Marks, gib mir nicht einmal Punkte, ich habe keine Screenshots, als ich sah, wie Swasheck schrieb, woran ich angefangen hatte zu arbeiten, aber das ist zu lang für einen Kommentar.

Die kurze Antwort lautet also: Ja, dir geht es gut

Trotzdem habe ich von Berichten in früheren SQL-Versionen gehört, in denen die Leute anscheinend dachten, dies sei erforderlich. Also wollte ich sicher sein und habe einen Test gemacht. Ich habe eine Datenbank erstellt, einige Tabellen erstellt und dann Glenns Abfrage verwendet, um festzustellen , wie viel von dieser Datenbank sich vor der Wiederherstellung im Puffercache befand. Bevor ich ungefähr 50,2 MB Daten hatte, nachdem ich ungefähr 1,5 MB hatte - dies ist höchstwahrscheinlich auf etwas nach der Wiederherstellung zurückzuführen, nicht auf Daten, die herumhängen.

Ich habe auch mehrere Abfragen zuvor ausgeführt und Tabellen-Aliase wie "foo" eingefügt, damit ich sie mithilfe der folgenden Abfrage im Cache finden konnte. Ich habe sie alle dort gesehen, die Wiederherstellung durchgeführt und sie waren weg.

SELECT st.text, qs. sql_handle, qs.plan_handle
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(sql_handle) st
where text like '%foo%'

Daher kann ich bei meinen eingeschränkten Tests unter SQL Server 2012 mit Sicherheit sagen, dass die Spuren der Datenbank vollständig aus dem Pufferpool und dem Plan-Cache entfernt wurden. Was Sinn macht, weil die DB, auf die sie sich bezogen, verschwunden ist, das ist das erwartete Verhalten.

Das heißt - nach einer Wiederherstellung sollten Sie auf jeden Fall in Betracht ziehen, Ihre Statistiken zu aktualisieren. Ich mag es, mit dem Aufbau sauberer Statistiken zu beginnen, und ich mag es wirklich, wenn Leute produktionsähnliche Daten in dev verwenden, und ich mag es, mit sauberen Statistiken zu beginnen. So gut, dass Sie echte Daten in dev verwenden. (Vorsichtsmaßnahme - manchmal müssen Sie Ihre Daten vorher identifizieren, bevor Sie dies tun, aber yay zum Testen mit realen Datenverteilungen und -größen.)

Mike Walsh
quelle
1

Ich melde mich gerne zurück. Die Wiederherstellung wurde vor einigen Minuten für eine VLDB (1 TB) (SQL2008R2 SP2CU7) durchgeführt. Wie vermutet, ist der Datencache nach der Wiederherstellung so gut wie verschwunden. Alle obigen Antworten sind also richtig.

PRIOR
ObjectName  object_id   index_id    buffer size(MB) buffer_count
table_1 185767719   1   29434   3767645
table_2 1531152500  1   559 71604

POST                
ObjectName  object_id   index_id    buffer size(MB) buffer_count
table_1 185767719   1   34  4367
table_2 1531152500  1   22  2879

Um die Statistiken zu erhalten, habe ich ein Skript verwendet, das aus einem von Mark angedeuteten verwandten Beitrag entlehnt / gestohlen wurde . Sehr hilfreich. Vielen Dank.


SELECT OBJECT_NAME (p. object_id) AS [ObjectName],p. object_id,p .index_id, count(*)/128 AS [buffer size(MB)],count(*) AS [buffer_count]
FROM 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
WHERE b. database_id=DB_ID () AND p.object_id >100
GROUP BY p.object_id ,p. index_id
ORDER BY buffer_count DESC;
Joy Walker
quelle