Ale*_*sko 8 sql-server dbcc-checkdb buffer-pool sql-server-2017 performance-monitor
我们一直在监控一些SQLServer: Memory Manager
指标,并注意到在DBCC CheckDB
工作后,指标
Database Cache Memory (KB)
Run Code Online (Sandbox Code Playgroud)
大幅下降。准确地说,它从 140 GB 缓存数据库内存下降到 60 GB。之后,在一周内再次缓慢上升。(“ Free Memory KB
”的数量,紧随其后从 20 GB 增加到 100 GB CheckDB
)
DBCC CheckDB
每周日运行,因此数据库缓存内存必须每周再次增加
What is the behavior of this ? Why CheckDB pushes database pages out of memory ?
Run Code Online (Sandbox Code Playgroud)
第二个问题是为什么“ buffer cache hit ratio
”DBCC CheckDB
完成后没有变化?
平均为 99.99%,在DBCC CheckDB
工作后它下降到 ~98.00%,并很快恢复到 99%,而我预计“ buffer cache hit ratio
”会显着下降,因为数据库数据必须再次从存储读取到 RAM?
我们一直在监控一些 SQLServer: Memory Manager 的指标,并注意到在 DBCC CheckDB 作业之后,指标
数据库缓存内存 (KB) 显着下降。如果准确地说,它从 140 GB 缓存数据库内存下降到 60 GB
这是正确的,当此示例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;
Run Code Online (Sandbox Code Playgroud)
删除快照前的 BufferSize
BufferSizeInMB
1061.70312 --before
Run Code Online (Sandbox Code Playgroud)
删除快照
USE master
GO
DROP DATABASE MY_DATABASE_SNAPSHOT ;
Run Code Online (Sandbox Code Playgroud)
删除快照后的 BufferSize
BufferSizeInMB
824.179687 --after
Run Code Online (Sandbox Code Playgroud)
第二个问题是为什么 DBCC CheckDB 完成后“缓冲区缓存命中率”没有改变?
这取决于数据加载回缓冲区缓存的速度。
如果您的缓冲池在较长时间内填满,则该比率应保持在平均水平较高的水平。
这与您问题的这一部分相对应:
...它(缓冲池数据大小)从 140 GB 缓存数据库内存下降到 60 GB。之后,在一周内再次缓慢上升......