对于大于8 KB内存的所有请求,都是由windows API直接分配的。所有缓存存储计划、数据和索引页都存储在这个缓冲池中。当用户请求row/rows时,如果缓冲区池中没有,则使该页面从磁盘进入内存。这种输入/输出可能在繁忙的系统上特别昂贵,因此尽可能减少SQL服务器缓存的大小,这可能会被用户看作是内存泄漏或SQL Server占用大量内存,但实际上它提高了性能,实际上这个特性是通过设计实现的。
下面这些内存不是来自缓冲池:
SQL LCR
扩展存储过程
链接服务器分配的内存
内存管理器完成的大页面分配(大页面为任意页面>8 KB)
COM对象
3.2 single-page
这块内存是<=8kb 的存储,适用于sql server 2008及以前, 属于buffer pool 缓冲池来分配。有存储数据页面,Consumer功能组件。
3.3 multi- page
这块内存是>8kb的 存储,适用于sql server 2008及以前, 不属于buffer pool 缓冲池来分配, 有存储Consumer功能组件, 第三方代码, Threads线程。
3.4 any size page
这个适用于sql server 2012及以上,整合了single-page,multi-page 统称pages。
四. sql server 2008 内存
从内存图我们可以看到有 page reservation 需预先申请的内存, 有momory objects 从windows api申请的内存, 有clr第三方申请的内存。
内存的分类方式有很多,下面介绍三种方式:
1. 按用途分类
1.1 Database Cache(数据页面缓冲区)
当用户修改了某个页面上的数据时,sql server会在页存中将这个页修改。但不会立刻将这个页面写回硬盘,而是等后面的checkpoint 或lazy write集中处理。
1.2 各类Consumer功能组件
Connection 连接:包括输入缓冲池和输出缓冲池, 用来存储用户指令和返回结果。










