一个缓冲区就是一个 8KB 大小的内存页,其大小与一个数据页或索引页相当。因此,缓冲区高速缓存被划分为多个 8KB 页。缓冲区管理器负责将数据页或索引页从数据库磁盘文件读入缓冲区高速缓存中,并将修改后的页写回磁盘。缓冲区缓存中会保留一页,直到缓冲区管理器需要该缓冲区读入更多数据。数据只有在被修改后才重新写入磁盘。在将缓冲区高速缓存中的数据写回磁盘之前,可对其进行多次修改。有关详细信息,请参阅读取页和写入页。
当 SQL Server 启动时,它根据许多参数(例如,系统中的物理内存容量、已配置的服务器最大线程数以及各种启动参数)计算出缓冲区高速缓存的虚拟地址空间大小。SQL Server 将为缓冲区高速缓存保留计算后得出的进程虚拟地址空间(称为“内存目标”),但它仅获取(提交)当前负荷所需的物理内存量。您可以查询 sys.dm_os_sys_info 目录视图中的 bpool_commit_target 和 bpool_committed 列,分别返回保留为内存目标的页数以及缓冲区高速缓存中当前提交的页数。
SQL Server 启动与缓冲区高速缓存获得其内存目标之间的间隔称为“增长期”。在此期间,读取请求将根据需要填充缓冲区。例如,单页读取请求将填充一个缓冲区页。也就是说,增长期取决于客户端请求的数量和类型。通过将单页读取请求转换为对齐的八页请求加快增长。这样可更快地完成增长,尤其是那些内存容量很大的机器。
因为缓冲区管理器将多数内存用于 SQL Server 进程,所以它会与内存管理器协作以使其他组件能使用其缓冲区。缓冲区管理器主要与下列组件交互:
-
资源管理器。此交互用于控制内存的整体使用情况以及 32 位平台中的地址空间使用情况。
-
数据库管理器和 SQL Server 操作系统 (SQLOS)。此交互用于低级文件 I/O 操作。
-
日志管理器。此交互用于预写日志记录。