一、内存使用分类 1按用途分类 1)Database cache(数据页面)。SQL Server在调用页面时,先将该页面读到内存中,使用完后会缓存在内存中,当SQL Server感觉到内存的压力时会将最长时间没有使用的页面从内存中删除来空出内存。 2)各类Consumer(功能组件) Connection的连接信息 General:语句的编译、范式化、每个锁数据结构、事务上下文、表格和索引的元数据等。 Query Plan:语句和存储过程的执行计划。和Database cache类似,SQL Server也会将执行计划缓存以供将来使用,减少编译时间。 Optimizer:生成执行计划的过程中消耗的内存。 Utilities:像BCP、Log Manager、Backup等比较特殊的操作消耗的内存。 3)线程内存:存放进程内每个线程的数据结构和相关信息消耗的内存,每个线程需0.5MB的内存。 4)第三方代码消耗的内存:SQL Server的进程里,会运行一些非SQL Server自身的代码。 2 按申请方式分类 1)预先Reserve一块大的内存,然后在使用的时候就是一块一块的Commit。如:Database Page的申请方式。 2)直接用Commit方式申请的内存,成为Stolen方式。除了Database Page之外其他内存基本都是按这种方式申请的。 3按申请内存的大小分类 1)申请小于等于8KB为一个单位的内存,这些内存称为Buffer Pool 2)申请大于8KB为一个单位的内存,这些内存称为Multi-Page(或MemToLeave) SQL Server对于Database cache都是采用先Reserved后Commit的方式申请的,而数据页都是以8KB为单位进行申请的。 对于Consumer中的内存申请,一般都是按Stolen方式申请的,且大多数的执行计划的大小都是小于8KB的,少数特别复杂的存储过程的执行计划会超过8KB,默认的连接的数据包是4KB,除非客户端特别设置了超过8KB(不建议) 第三方代码的内存申请一般是按Stolen方式申请的,个别比如CLR中可能会用Reserved/Commit的方式申请。 线程的内存每个都以0.5MB的方式申请,自然是放在MemToLeave中。 二、SQL Server内存使用情况的分析 一般来说有两种方式,第一种就是用来分析系统内存情况时使用的用性能计数器来分析,第二种是使用动态管理视图(DMV,只适用于SQL Server2005和2008) |