如何衡量sql server的内存需求?

var*_*ble 0 sql-server memory

我有一个带有 200GB RAM 的生产 SQL 服务器。

其中 150GB 分配给 sql server(通过在 sql server 属性中设置最大内存设置)

其余的由 ssis、操作系统、防病毒、应用程序使用。

我想测试 150GB 内存对于 sql server 是否足够,因为大约有 20 个数据库,数据文件大小从 5GB 到 500GB。如何捕获内存使用信息?

Eri*_*ing 5

消费者

SQL Server 有两个主要的内存消耗者。还有很多其他的,但在正常情况下,它们不会消耗足够的额外内存而引人注目。

  • 缓冲池
  • 查询内存授予

缓冲池

由于 SQL Server 不处理磁盘上的数据,因此查询需要将相关页面放入缓冲池,然后查询才能开始处理它们。读和写都是如此。当查询等待数据最终进入内存时,它们会等待 PAGEIOLATCH_%%

通常,数据和内存之间的差异越大,您看到的这种等待类型就越多。有时,索引在这里发挥作用,无论是从您有许多无用索引的角度来看,还是从缺少有用索引的角度来看。您可以使用sp_BlitzIndex 来诊断索引

EXEC sp_BlitzIndex
    @DatabaseName = 'YourDatabase',
    @Mode = 0;
Run Code Online (Sandbox Code Playgroud)

内存授予

每个查询都会要求一些内存来运行,但是某些查询运算符会要求额外的内存用作临时空间:

  • 排序
  • 哈希值
  • 优化的嵌套循环

当查询相互争夺内存授予时,它们将等待RESOURCE_SEMAPHORE。很多时候发生这种情况是因为 SQL Server 中相当残酷的默认设置:

  • 任何查询都可以请求服务器最大服务器内存设置的 25%,并且
  • 任何一组查询都可以窃取服务器最大服务器内存设置的约 75%

您可以通过使用资源调控器将 MAX_MEMORY_PERCENT 设置更改为 < 25 的数字来更改企业版中的第一个。

ALTER RESOURCE POOL 
    [default]  
WITH
(   
     MAX_MEMORY_PERCENT = 10
);  

ALTER RESOURCE GOVERNOR RECONFIGURE;  
Run Code Online (Sandbox Code Playgroud)

您还可以使用MAX_GRANT_PERCENT查询提示在单个查询级别对此进行控制。

我有一个视频向您展示了不同类型的内存争用是什么样的,您可以在此处点击类似按钮

我需要更多内存吗?

您可以使用一些免费脚本来查看服务器上的等待情况和内存利用率:

示例要求这些:

EXEC sp_BlitzFirst
    @SinceStartup = 1;

EXEC dbo.sp_PressureDetector
    @what_to_check = N'memory';

EXEC sp_WhoIsActive;
Run Code Online (Sandbox Code Playgroud)

分析

对这些输出的分析超出了本答案的范围,但一般来说您想要寻找我提到的等待

  • PAGEIOLATCH_%%
  • RESOURCE_SEMAPHORE

如果其中任何一个占您的等待统计数据的很大一部分,那么您可能需要:

  • 添加更多内存
  • 调整内存授予
  • 调整查询和索引

为了更好地了解服务器的性能,可靠的监控工具是您的最佳选择。我目前最喜欢的是SQL Sentry,尽管事实上它们已被 Sheinhardt Wig Company 的子公司 SolarWinds 收购。