Minimum server memory与Maximum server memory是SQL Server下配置实例级别最大和最小可用内存(注意不等于物理内存)的服务器配置选项。它们是管理SQL Server内存的途径之一。

Minimum server memory与Maximum server memory

Minimum server memory(MB): 最小服务器内存。一旦超过这个线就不会再把内存换回去。但是也不是说SQL Server一启动马上就申请这么多的内存。

Maximum server memory(MB): 默认是2147483647。这个值一旦设置马上生效,无需重启SQL Server服务。

配置Minimum server memory与Maximum server memory的方法

SSMS的UI界面或者调用存储过程sp_configure

USE master;
EXEC sp_configure 'show advanced option', 1;
RECONFIGURE;
exec sp_configure 'min server memory (MB)', 5120;
exec sp_configure 'max server memory (MB)', 10240;
RECONFIGURE WITH OVERRIDE;

如果你把这个Maximum server memory(MB)设置得太小,容易出现SQL Server没有足够的内存分配给新的连接。一旦出现这种情况,你很可能不得不用DAC连接去设置Maximum server memory(MB)。所以说设置这个东西需要谨慎,评估好本机服务器的情况。

Server Memory在SQL Server 2008和SQL Server 2012下所代表(包含)的内存类型的不同

  SQL Server 2005/2008 SQL Server 2012及以后
Buffer Pool
Single Page Allocation
Multi Page Allocation
CLR Allocation
SQL Server内部线程使用的栈
其他SQL Server内部模块,如扩展存储过程、sp_OA创建的OLE对象、Linked Server Provider使用的内存页面

合理配置SQL Server内存

在配置SQL Server之前需要了解清楚

1)Windows操作系统出了SQL Server外是否还有其他重要的应用程序,比如Web服务器

2)SQL Server当前实例是否是服务器上唯一一个SQL Server实例

服务器内存大小 预留给Windows的内存大小 预留给其他应用程序的内存大小 Max Server Memory大小
4G 1G XXXX  
8G 2G XXXX  
大于8G 3~4G XXXX  

设置Max Server Memory大小的意思是避免出现SQL Server和其他应用程序出现互相争抢内存的情形,毕竟SQL Server是那种非常喜欢内存的应用程序。比如你把Web服务器和SQL Server数据库服务器放在同一台机器上,结果SQL Server把大部分内存都吃了,导致Web服务器没有足够的内存运行代码指令去数据库中获取数据,这样也没意义。Minimum Server Memory一般不建议设置,因为就算你设置了,别的进程缺内存Windows还是会让你让出内存。设置这个还不赋予SQL Server服务账号Locked pages in memory权限。

按照微软自己的说法(Effects of min and max server memory),SQL Server会按需向Windows申请内存。在达到Minimum server memory设置的内存量之前不会释放任何内存。缓冲池不会让内存分配低于Minimum server memory设置值,也不会超过Maximum server memory设置值。我对这点优点怀疑,特此做了个实验。实验是这样的。我把Minimum server memory设置成1500MB,然后重启SQL Server服务。通过Windows的任务管理器观察到SQL Server服务进程的内存占用量一路攀升到1.2左右停止。这个应该就是SQL Server初始化申请的内存量吧。然后我运行了一条脚本(返回大约数十亿数据量的查询)去让SQL Server去申请更多的内存。通过任务管理器观察到SQL Server服务进程的内存占用量攀升到了1.6G左右。同时打开浏览器去打开十几个页面(像腾讯体育、优酷)这类网站去让浏览器用尽操作系统的可用内存。这个时候我停掉了脚本。我观察到SQL Server在接下来1分钟内内存下降到0.9-1.1G间。我关闭所有的页面。过了数十秒。SQL Server进程的内存占用量下降到只有200MB。我不知道怎么解释微软在上面链接中说的。有一点不同的是文章中应用的SQL Server版本是2008,而我测试的SQL Server版本是2014。

这么看来微软和一些书上说的一旦SQL Server获得的内存到达Minimum server memory线后就不会让出内存是指在没有任何其他的应用程序遇到内存压力的情况下的结论吧。既然Minimum server memor没办法保证SQL Server的内存不被其他的进程抢去,我觉得Minimum server memory确实没太多意义。

SQL Server ->> Memory Allocation Mechanism and Performance Analysis(内存分配机制与性能分析)之 -- Minimum server memory与Maximum server memory的更多相关文章

  1. memcached学习——memcached的内存分配机制Slab Allocation、内存使用机制LRU、常用监控记录(四)

    内存分配机制Slab Allocation 本文参考博客:https://my.oschina.net/bieber/blog/505458 Memcached的内存分配是以slabs为单位的,会根据 ...

  2. 你不知道的Eclipse用法:使用Allocation tracker跟踪Android应用内存分配

    Android Tools中的DDMS带有一个很不错的跟踪内存分配的工具Allocation tracker.通过Alloction tracker,不仅知道分配了哪类对象,还可以知道在哪个线程.哪个 ...

  3. Memory Allocation with COBOL

    Generally, the use of a table/array (Static Memory) is most common in COBOL modules in an applicatio ...

  4. A Reusable Aspect for Memory Allocation Checking

    The checking logic would be refactored into an aspect file, as follows: after(void * s) : (call($ ma ...

  5. Memory Allocation in the MySQL Server

    https://dev.mysql.com/doc/internals/en/memory-allocation-mysql-server.html MySQL Internals Manual  / ...

  6. Advanced Memory Allocation 内存分配进阶[转]

    May 01, 2003  By Gianluca Insolvibile  in Embedded Software Call some useful fuctions of the GNU C l ...

  7. SQL Server内存性能分析

    内存概念: Working Set = Private Bytes + Shared Memory Working Set:某个进程的地址空间中,存放在物理内存的那一部分 Private Bytes: ...

  8. .NET Memory Allocation Profiling with Visual Studio 2012

    .NET Memory Allocation Profiling with Visual Studio 2012 This post was written by Stephen Toub, a fr ...

  9. linux 下tomcat出现 Native memory allocation (malloc) failed to allocate 1915224064 bytes for committing reserved memory问题

    ## There is insufficient memory for the Java Runtime Environment to continue.# Native memory allocat ...

随机推荐

  1. Sqlite shell 的使用

    学习python中,涉及SQLite3数据库的操作,其中一种是使用sqlite shell,在园子里找到下面这篇文章,跟着试了下,挺好. 这里要注意,语句是C语言规范的吧,语句末尾需要";& ...

  2. org.elasticsearch.search.sort.SortBuilder使用

    org.elasticsearch.search.sort.SortBuilder是一个抽象类,有4个子类 org.elasticsearch.search.sort.FieldSortBuilder ...

  3. 问题记录——com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

    最近在搞一个Spring boot + Mybatis + Mysql的项目,用Mybatis访问数据库时,报了如下的错误,先在网上搜索了,试了各种办法都不行, 奇葩的是,连接另外1个数据库又没问题. ...

  4. react大纲

    课程大纲: https://miaov.com/index.php/news/newsDetail/nid/263  原文件 Npm 基本使用 切换镜像, 国内的网络访问 npm 服务器可能比较慢, ...

  5. JSON中的坑

    坑一. 在使用localStorage时,我们会给一个key存取一个value,这个value可以是一个普通的字符串,也可以是一个对象,如果是一个字符串,我们就需要通过JSON.stringify来转 ...

  6. Oracle dbms_random随机函数包

    dbms_random是oracle提供的一个随机函数包,以下是它的一些常用的功能: 1.dbms_random.value 作用:生成一个大于等于0,大于等于1的随机的38位小数,代码如下: sel ...

  7. Junit打包测试

    在一个项目中,只写一个测试类是不可能的,我们会写出很多很多个测试类.可是这些测试类必须一个一个的执行,也是比较麻烦的事情. 鉴于此, JUnit 为我们提供了打包测试的功能,将所有需要运行的测试类集中 ...

  8. C++析构函数(转)

    创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作(例如回收创建对象时消耗的各种资源),这个函数被称为析构函数. 析构函数(Destructor)也 ...

  9. C++ 隐含的this 指针

    c++primer   页数:376-379 备份, 很有嚼头 #include <iostream> #include <string> #include <fstre ...

  10. 公用表表达式 (CTE)、递归

    指定临时命名的结果集,这些结果集称为公用表表达式 (CTE).公用表表达式可以包括对自身的引用.这种表达式称为递归公用表表达式. 对于递归公用表达式来说,实现原理也是相同的,同样需要在语句中定义两部分 ...