假设我将 SQL\xc2\xa0Server 内存限制为 100\xc2\xa0GB。
\n这是否仅将缓冲区限制为 100\xc2\xa0GB 还是也限制了查询内存授予?
\nPau*_*ite 15
在 SQL Server 2012 及更高版本上,max server memory
限制 SQL Server 提交的几乎所有内存。缓冲池只是一个缓存,它与其他缓存(例如内存授予和计划缓存)竞争该限制内的内存。
如果设置max server memory
为 100GB,则会限制所有潜在消费者可用的总内存。所以,不,这不仅仅是对缓冲池的限制,它会更广泛地限制内存使用。
然而,没有什么是简单的。如果多页分配需要当前不可用的连续内存,则SQL Server 可能会max server memory
在短时间内超出限制(过度分配)。
此行为通常会在以下操作期间观察到:
- 大型列存储索引查询。
- 行存储查询的大批量模式。
- (重新)构建列存储索引,它使用大量内存来执行哈希和排序操作。
- 需要大内存缓冲区的备份操作。
- 跟踪必须存储大量输入参数的操作。
请参阅文档中的内存管理架构指南和服务器内存配置选项。后者包含以下建议:
使用max_server_memory来保证操作系统不会遇到有害的内存压力。要设置最大服务器内存配置,请监视 SQL Server 进程的总体消耗以确定内存要求。对于初始配置或当没有机会收集 SQL Server 进程内存随时间的使用情况时,请使用以下通用最佳实践方法为单个实例配置max_server_memory :
- 从总操作系统内存中减去最大服务器内存控制之外的潜在 SQL Server 线程内存分配的等效值,该内存分配由堆栈大小1 * 计算出的最大工作线程2组成。
- 然后,为最大服务器内存控制之外的其他内存分配减去 25% ,例如备份缓冲区、扩展存储过程 DLL、使用自动化过程(sp_OA 调用)创建的对象以及来自链接服务器提供程序的分配。这是一个通用的近似值,里程可能会有所不同。
- 剩下的应该是单实例设置的 max_server_memory 设置。
1有关每个架构的线程堆栈大小的信息,请参阅内存管理架构指南。
2请参阅有关如何配置最大工作线程服务器配置选项的文档页面,了解有关当前主机中给定数量的关联 CPU 的计算默认工作线程的信息。