Database Cache Memory di Monitor Kinerja turun secara signifikan setelah DBCC CheckDB

8

Kami telah memantau beberapa SQLServer: Memory Managermetrik, dan memperhatikan bahwa setelah DBCC CheckDBbekerja, metrik

Database Cache Memory (KB)

turun secara signifikan. Jika lebih tepatnya, itu turun dari 140 GB memori DB cache ke 60 GB. Dan setelah itu, perlahan-lahan naik lagi selama seminggu. (Jumlah " Free Memory KB", mulai dari 20 hingga 100 GB tepat setelah CheckDB)

DBCC CheckDB dijalankan setiap hari Minggu, jadi Memori Cache Database harus ditingkatkan lagi setiap minggu

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

Pertanyaan kedua adalah mengapa " buffer cache hit ratio" tidak berubah setelah DBCC CheckDBselesai?

Rata-rata 99,99% dan setelah DBCC CheckDBpekerjaan turun menjadi ~ 98,00%, dan kembali ke 99% cukup cepat sementara saya berharap " buffer cache hit ratio" turun secara signifikan karena data basis data harus dibaca dari penyimpanan ke RAM lagi?

Aleksey Vitsko
sumber
Mengenai BCHR, alasan mengapa itu tidak jatuh lebih jauh dapat karena kode CHECKDB dapat dilakukan dengan menggunakan read-ahead (RA), dan I / O yang dilakukan oleh RA tidak termasuk ketika menghitung BCHR. Yang pada gilirannya membuat BCHR counter perf yang cukup berguna.
Tibor Karaszi

Jawaban:

9

Kami telah memantau beberapa SQLServer: metrik Memory Manager, dan memperhatikan bahwa setelah pekerjaan DBCC CheckDB, metrik

Database Cache Memory (KB) turun secara signifikan. Jika lebih tepatnya, itu turun dari 140 GB memori DB cache ke 60 GB

Ini benar, Anda dapat dengan jelas melihat perilaku ini ketika DBCC CHECKDBperintah contoh ini selesai di21h45

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini


Mengapa

Perilaku ini disebabkan database snapshotoleh DBCCperintah yang dibuat, yang menghapus semua objek di memori.

Anda dapat mereplikasi perilaku dengan membuat snapshot dari database, memuat beberapa data dalam memori, dan kemudian menjatuhkan snapshot itu

  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 sebelum menjatuhkan snapshot

BufferSizeInMB
1061.70312  --before

Menjatuhkan foto itu

USE master
GO
DROP DATABASE MY_DATABASE_SNAPSHOT ; 

BufferSize setelah menjatuhkan snapshot

BufferSizeInMB
824.179687 --after

Pertanyaan kedua adalah mengapa "rasio hit cache cache" tidak berubah setelah DBCC CheckDB selesai?

Ini tergantung pada seberapa cepat data dimuat kembali dalam cache buffer Anda.

Jika kolam penyangga Anda terisi lebih lama, rasio ini seharusnya setara dengan rata-rata yang lebih tinggi.

Ini sesuai dengan bagian dari pertanyaan Anda:

... Ini ( Buffer pool datasize ) turun dari 140 GB memori DB cache ke 60 GB. dan setelah itu, perlahan-lahan tingkatkan lagi selama seminggu ...

Randi Vertongen
sumber
Randi terima kasih! ketika kita berbicara tentang Snapshot Database Internal yang dibuat oleh DBCC CheckDB, apakah itu membuatnya dalam memori? atau di disk? atau keduanya
Aleksey Vitsko