SQLServer存储引擎之内存篇:

  (1)SQL SERVER 内存结构

          

SQL SERVER 内存结构简图

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

  

  (1.1)可执行代码(Executable Code)

   主要包括SQL SERVER 实例中的一些EXE和DLL文件

  (0)SQL 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 SERVER到SQL SERVER),这里加载访问异构数据源的OLE DB PROVIDER;

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

  (5)OLE自动化(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根据性能需要动态管理的,而其他内存空间则是随着用户请求的发起在变化。

  (2)SQL SERVER内存管理

  (2.1)进程地址空间

进程地址空间结构图

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

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

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

  (2.2)SQL SERVER内存管理

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

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

    (2)锁定内存页(Lock Pages In Memory),将这个操作系统策略指定给启动SQL SERVER服务的用户,以阻止SQL SERVER从物理内存到page file的交换。在打开AWE时,对于除local system以外的SQL Server服务启动用户,必须要显式分配lock pages in memory的权限;

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

SQLServer存储引擎——02.内存的更多相关文章

  1. SQLServer存储引擎——03.日志

    3. SQLServer存储引擎之日志篇 (3.1)日志结构 (3.1.1)物理日志 (0)物理日志即数据库的.ldf文件, 当然后缀名是可以自定义的,默认是.ldf (1)一个SqlServer数据 ...

  2. SQLServer存储引擎——05.索引的结构和分类

    5. SQLServer存储引擎——索引的结构和分类 关系型数据库中以二维表来表达关系模型,表中的数据以页的形式存储在磁盘上,在SQL SERVER中,数据页是磁盘上8k的连续空间,那么,一个表的所有 ...

  3. SQLServer存储引擎——01.数据库如何读写数据

    一.引言 在SQL Server数据库中,数据是如何被读写的?日志里都有些什么?和数据页之间是什么关系?数据页又是如何存放数据的?索引又是用来干嘛的? 一起看看SQL Server的存储引擎. 二.S ...

  4. innodb存储引擎之内存

    1.innoDB存储引擎体系架构 如上图所示,innoDB存储是基于磁盘存储的,并且其中的记录以页的方式进行管理,但为什么要引入一个内存池呢? 其目的就是为了协调CUP速度与磁盘速度的鸿沟,基于磁盘的 ...

  5. SQLServer存储引擎——04.数据

    4. SQL SERVER存储引擎之数据篇 (4.1)文件 (0)主数据文件.mdf初始文件大小至少为3MB,次要数据文件.ndf初始大小,同日志文件一样至少为512KB: (1)SQL SERVER ...

  6. SQLServer存储引擎——06.索引的遍历与维护

    一.遍历 索引树的每个节点都是一个页面. 索引树有三种类型的节点:根节点.中间节点.叶子节点. (1) 根节点与中间节点一样,只包含下一层节点的入口值与入口指针,它们称为索引节点: (2) 叶子节点包 ...

  7. Atitit.数据库存储引擎的原理与attilax 总结

    Atitit.数据库存储引擎的原理与attilax 总结 1. 存储引擎是什么1 2. 其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储2 3. 表的存储有三个文件:结构+数据+索引2 4 ...

  8. Atitit.数据库存储引擎的原理与attilax 总结

    Atitit.数据库存储引擎的原理与attilax 总结 1. 存储引擎是什么1 2. 其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储2 3. 表的存储有三个文件:结构+数据+索引2 4 ...

  9. MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述

    MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述: 1.MySQL有多种存储引擎: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(Berk ...

随机推荐

  1. 纯css 更改原生raiod与 checkbox的样式

    原文地址: .checkbox input[type=checkbox], .checkbox-inline input[type=checkbox], .radio input[type=radio ...

  2. inotify 同步脚本

    #!/bin/bash path1=/home/htoa/tomcat/webapps/ROOT/htoa/ ip=192.168.30.13 /usr/bin/inotifywait -mrq -- ...

  3. ECMAScript 2016(ES7) 知多少

    ECMAScript 2016(ES7) 知多少 1. 数组方法 Array.prototype.includes(value : any) : boolean 2. 幂运算符 x ** y 扩展阅读 ...

  4. RSA公钥,私钥和数字签名通用理解

    一.公钥加密 假设一下,我找了两个数字,一个是1,一个是2.我喜欢2这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,1是我的公钥. 我有一个文件,不能让别人看,我就用1加密了.别人找到了这个 ...

  5. 伪差IO分标准

    伪差分电平 所谓伪差分电平,就是信号在接收端是一个差分的接收器,但其中一端固定接参考电压,而另一端接单端信号线.输入信号电压与参考电压之间进行比较,作为判断输入信号高低的标准. 常用的伪差分电平标准有 ...

  6. JavaScript去除字符串两边空格trim

    去除字符串左右两端的空格,在大部分编程语言中,比如PHP.vbscript里面可以轻松地使用 trim.ltrim 或 rtrim实现.但在js中却没有这3个内置方法,需要手工编写.下面的实现方法是用 ...

  7. java 基础知识学习

    1:  JDK VS  JRE JDK: java开发工具包,提供编译和运行环境,将java编译成字节码文件,即.class文件.JDK有三个版本: j2SE,  J2EE,  j2me jre: 运 ...

  8. 2016.1.23 通过cmd在程序中执行sql脚本

    System.Diagnostics.Process pro = new System.Diagnostics.Process(); pro.StartInfo.FileName = "cm ...

  9. php5.6,curl上传的变化

    $ch = curl_init ();curl_setopt ( $ch, CURLOPT_SAFE_UPLOAD, false); //php5.6要加上这个 $fields = array(); ...

  10. day17-jdbc 6.Connection介绍

    package cn.itcast.jdbc; import com.mysql.jdbc.Connection; import java.sql.DriverManager; import java ...