Кэш-память базы данных в системном мониторе значительно уменьшается после проверки DBCC


8

Мы отслеживали некоторые SQLServer: Memory Managerпоказатели и заметили, что после DBCC CheckDBработы показатель

Database Cache Memory (KB)

падает значительно. Если быть точным, то он упал с 140 ГБ кеш-памяти до 60 ГБ. И после этого медленно наращивать снова в течение недели. (Объем " Free Memory KB", сразу после 20 - 100 ГБ CheckDB)

DBCC CheckDB запускается каждое воскресенье, поэтому кэш-память базы данных должна возвращаться обратно каждую неделю

What is the behavior of this ? Why CheckDB pushes database pages out of memory ?

Второй вопрос: почему " buffer cache hit ratio" не изменилось после DBCC CheckDBзавершения?

В среднем оно составило 99,99%, а после DBCC CheckDBработы оно упало до ~ 98,00% и вернулось к 99% довольно быстро, хотя я ожидал, что " buffer cache hit ratio" значительно упадет, потому что данные базы данных должны снова считываться из хранилища в ОЗУ?


Что касается BCHR, причина, по которой он не удалялся дальше, может заключаться в том, что код CHECKDB может быть выполнен с использованием упреждающего чтения (RA), а ввод-вывод, выполняемый RA, не учитывается при вычислении BCHR. Что, в свою очередь, делает BCHR довольно бесполезным перфомантом.
Тибор Караси

Ответы:


9

Мы отслеживали некоторые показатели SQLServer: Memory Manager и заметили, что после задания DBCC CheckDB метрика

Кэш-память базы данных (КБ) значительно уменьшается. Если быть точным, то он упал с 140 ГБ кеш-памяти до 60 ГБ

Это правильно, вы можете ясно увидеть это поведение, когда эта DBCC CHECKDBкоманда примера завершается в21h45

введите описание изображения здесь введите описание изображения здесь


Почему

Это происходит из-за того, что database snapshotсозданная DBCCкоманда удаляется, удаляя все ее объекты в памяти.

Вы можете повторить поведение, создав снимок базы данных, загрузив некоторые данные в память, а затем отбросив этот снимок

  CREATE DATABASE MY_DATABASE
     GO
     USE MY_DATABASE 
     GO
     CREATE TABLE dbo.bla(id int identity(1,1) PRIMARY KEY NOT NULL,
                          val int,
                          val2 char(100));



    INSERT INTO dbo.bla(val,val2)
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),'bla'
    FROM master..spt_values spt
    CROSS APPLY master..spt_values spt2;
    GO

    CREATE DATABASE MY_DATABASE_SNAPSHOT
     ON  
     (  
     NAME ='MY_DATABASE',  
     FILENAME ='D:\DATA\MY_DATABASE.ss'  
     ) 
     AS SNAPSHOT OF MY_DATABASE;

     GO


    USE MY_DATABASE_SNAPSHOT
    GO
    SELECT * FROM dbo.bla;

     SELECT
      COUNT(file_id) * 8/1024.0 AS BufferSizeInMB
    FROM sys.dm_os_buffer_descriptors;

BufferSize перед сбросом снимка

BufferSizeInMB
1061.70312  --before

Отбрасывание снимка

USE master
GO
DROP DATABASE MY_DATABASE_SNAPSHOT ; 

BufferSize после удаления снимка

BufferSizeInMB
824.179687 --after

Второй вопрос: почему «коэффициент попадания в буферный кэш» не изменился после завершения DBCC CheckDB?

Это зависит от того, как быстро данные загружаются обратно в ваш буферный кеш.

Если ваш буферный пул заполняется в течение более длительного времени, он должен соответствовать этому соотношению, оставаясь в среднем выше.

Это соответствует этой части вашего вопроса:

... Он ( размер данных пула буферов ) упал с 140 ГБ кэшированной памяти БД до 60 ГБ. и после этого медленно наращивать снова в течение недели ...


спасибо, Рэнди! когда мы говорим о внутреннем снимке базы данных, сделанном DBCC CheckDB, он создает его в памяти? или на диске? или оба
Алексей
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.