SQL Server存储引擎(2) - 内存

来源:互联网 发布:店铺精品数据采集神器 编辑:程序博客网 时间:2024/06/06 02:14

内存

 

1SQL SERVER 内存结构

 

 

2.1

SQL SERVER 内存结构简图

 

SQL SERVER 内存空间主要可分为两部分:

 

1.1、可执行代码(Executable Code

主要包括SQL SERVER 实例中的一些EXEDLL文件

0SQL SERVER 引擎(SQL SERVER ENGINE),SQL SERVER 数据库的主程序;

 

1)服务端网络库(SERVER NET-LIBRARY),用于与客户端网络库通讯,将TDS包交给开放数据服务(OPEN DATA SERVICES),关于SQL SERVER访问的内容会在《SQL SERVER 体系架构》中作介绍;

 

2)开放数据服务(OPEN DATA SERVICES),用于将TDS包中的SQL 语句还原,交给关系引擎,关于关系引擎的内容会在《SQL SERVER 关系引擎》中作介绍;

 

3)分布式查询(DISTRIBUTED QUERIES),用于支持从异构数据源中访问数据(也包括从SQL SERVERSQL SERVER),这里加载访问异构数据源的OLE DB PROVIDER

 

4)扩展存储过程(EXTENDED STORED PROCEDURES),在后续版本中将彻底用CLR集成来取代扩展存储过程;

 

5OLE自动化(OLE AUTOMATION),用于SQL SERVER引用OLE自动化对象,事实上也是扩展存储过程,单独列出只是因为其功能特殊性;

 

1.2、缓冲池(Buffer Pool

0)系统级数据结构(SYSTEM-LEVEL DATA STRUCTURES),数据实例上的全局信息,包括数据库描述、锁、正在引用的对象及数据库等;

 

1)连接上下文(CONNECTION CONTEXT),有点类似WEB应用程序中SESSION的概念,包含当前数据库连接及状态,存储过程的参数、游标的当前位置、所引用的表等;

 

2)过程缓存(PROCEDURE CACHE),所有存储过程或SQL语句的执行计划,如果SQL语句存在相应的执行计划,则直接使用该执行计划,无须再次编译SQL语句。性能计数器PLAN CACHE中的缓存命中率(CACHE HIT RATIO)就是指的这里。

 

3)数据缓存(DATA CACHE), 用于数据库数据或索引页的读写,性能计数器BUFFER MANAGER中的缓存命中率(BUFFER CACHE HIT RATIO)就是指的这里。在物理内存充足的情况下,通常这个值会高于90%乃至更高,只有很少的数据页需要去物理读,如果低于90%可能是需要扩展物理内存了;

 

4)日志缓存(LOG CACHE),用于数据库日志页的读写,每一次的DML都会在这里生成相应的REDO日志操作,如果回滚事务的话,还会根据REDO日志生成相应的反向REDO日志;

 

只有过程缓存、数据缓存、日志缓存的大小是由SQL SERVER根据性能需要动态管理的,而其他内存空间则是随着用户请求的发起在变化。

 

2SQL SERVER内存管理

2.1、进程地址空间

 

2.2

进程地址空间结构图

 

0VASVirtual Address Space):进程地址空间或者叫虚拟地址空间,也即是内存寻址空间,32位的CPU与操作系统(以下简称32系统),寻址空间为232次方,即4G

 

13GB32WINDOWS系统上4G的寻址空间,应用程序只有2G的访问权(即用户模拟地址空间),剩下的2G留给操作系统自己(即内核模拟地址空间),通过打开3GB选项,可以让应用程序寻址3G的地址空间;

 

2PAEPhysical Addressing Extensions):物理地址扩展,将32WINDOWS系统的寻址空间提升到236次方,即64GAWEAddress Windows Extension)是地址窗口扩展插件或者叫API,应用程序可以通过AWE以实现PAE(先打开操作系统的PAE,再实现应用程序的AWE);

 

2.2SQL SERVER内存管理

0SQL SERVER的缓冲池统一以8k作为内存块大小,大于8k的大内存块是被独立管理的,从缓冲池外通过操作系统直接分配;

 

1AWE内存只能用于数据缓存,其他内存组件是无法使用AWE内存的;

 

2)锁定内存页(Lock Pages In Memory),将这个操作系统策略指定给启动SQL SERVER服务的用户,以阻止SQL SERVER缓存从物理内存到虚拟内存的交换。很多书本资料上都提出建议:无论在32位或64位机器上都打开这个策略。事实上在32位机上,用户模拟地址空间很少,当一些非数据缓存的内存组件吃掉大量内存空间时,又不能使用虚拟内存,此时就会内存告急了(虽然这种情况很少会遇到);

 

3SQL SERVER随着用户连接和请求的增加,会不断去获取物理内存,直至达到目标内存(TARGET MEMORY)和最大服务器内存(MAX SERVER MEMORY)中较小的一个。如果SQL SERVER服务器上操作系统没有自由内存,或其他应用程序有内存压力存在,SQL SERVER会调整其目标内存大小,也会释放物理内存,但不会释放到低于最小服务器内存(MIN SERVER MEMORY);如果没有其他内存压力,SQL SERVER在繁忙时获取的内存不会在空闲时主动释放。