我正在运行 MSSQL Server 2019 标准版,它具有 48GB 物理内存和 44GB SQL Server 最大内存。
主机上除了SqlServer什么都没有。
所有来自应用服务器的请求都只是调用存储过程,有数千个过程。
问题是数据库CPU使用率经常达到80%以上。
每当DB CPU达到50%以上时,存储过程重新编译就会飙升,dm_exec_cached_plans
每次扫描都会刷新视图表。
SELECT sum(CAST (size_in_bytes as decimal (14,2))) / 1048576 AS [Cache plan size MB]
FROM sys.dm_exec_cached_plans
并sys.dm_os_memory_clerks
显示如下...
这个小的缓存计划大小正常吗?
如果不是这样,我该如何处理这种情况?
任何意见,将不胜感激。
我正在根据我如何度过这种情况来回答我自己的问题。
首先,根本原因是由于内存压力而重新编译存储过程。
每当 CPU 达到高位时,
dm_os_memory_clerks
我就会看到MEMORYCLERK_SQLBUFFERPOOL
分配给 SQLServer 实例的总内存的使用率几乎是 100%,并且CACHESTORE_SQLCP
/CACHESTORE_OBJCP
下降到零。此外,我可以从扩展事件会话中看到如此多的重新编译事件。一旦我将内存加倍,重新编译事件就很少发生,CPU 开始冷却。
MEMORYCLERK_SQLBUFFERPOOL
SQLServer内存使用率保持在85%,并且到目前为止保持稳定。我希望这篇文章可以帮助其他人。
@马丁·史密斯,谢谢。