# Sql Server 内存管理：限制最大占用内存

### （一）：

Sqlserver对系统内存的管理原则是：按需分配，且贪婪(用完不还)。它不会自动释放内存，因此执行结果集大的sql语句时，数据取出后，会一直占用内存，直到占满机器内存(并不会撑满，还是有个最大限制，比机器内存稍小)，在重启服务前，sqlserver不会释放该内存，也没有任何办法可人为释放。以下命令虽然可释放缓存，但sqlserver并不会因此释放已占用的内存。

```
DBCC FREEPROCCACHE     #清除存储过程相关的缓存
DBCC FREESESSIONCACHE     #清除会话缓存
DBCC FREESYSTEMCACHE('All')     #清除系统缓存
DBCC DROPCLEANBUFFERS     #清除所有缓存
```

### （二）：

唯一的办法是：人为修改最大可占用物理内存进行限制。

### （三）：

修改办法如下：

管理员用户登录数据库客户端（Microsoft SQL Server Management Studio），在实例名（树形菜单根节点，显示登录名那栏）上右键，选择属性-->内存，设置“最大服务器内存”，单位为MB，可根据实际内存调整。

![](https://2884556365-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MI1qMRdYWwFVqlM-CRV%2F-MSBHiZJptIb9O8bH31T%2F-MSBIOTjJKT2tMl1SuOU%2Fimage.png?alt=media\&token=a9ff1647-1a9b-4274-a527-f13fc4310fa2)

### （四）

{% hint style="info" %}
扩展：

由于Sql Server对于系统内存的管理策略是有多少占多少，除非系统内存不够用了（大约到剩余内存为4M左右），Sql Server才会释放一点点内存。所以很多时候，我们会发现运行Sql Server的系统内存往往居高不下。这些内存一般都是Sql Server运行时候用作缓存的，例如你运行一个select语句，那么Sql Server会将相关的数据页（Sql Server操作的数据都是以页为单位的）加载到内存中来，下一次如果再次请求此页的数据的时候，就无需读取磁盘了，大大提高了速度。这类的缓存叫做数据缓存。还有一些其他类型的缓存，如执行存储过程时，Sql Server需要先编译再运行，编译后的结果也会缓存起来，下一次就无需再次编译了。
{% endhint %}
