Buffer Pool扩展简介

Buffer Pool扩展是buffer pool 和非易失的SSD硬盘做连接。以SSD硬盘的特点来提高随机读性能。

在Buffer Pool 扩展之前,SQL Server 从磁盘中读入数据,并且存放在buffer pool中以供读取和修改,修改完之后脏数据还是放在buffer pool中,当内存紧张时,lazy write把脏数据写入磁盘,并且释放内存页。当再次使用当前数据时,再一次从磁盘读取数据到内存。这样会导致大量的IO操作,影响性能。对于这类IO操作频繁造成的性能问题,我们通常采用的方法是加内存,较少IO操作。

SQL SERVER 2014新增加了Buffer Pool的扩展特性,使用SSD硬盘扩展缓存容量;

SSD作为Buffer Pool的扩展,可以很好的解决因频繁读取数据引发的系统大量IO操作问题。 Buffer pool在SSD上创建一个缓冲文件,该文件与内存一起构成多层的缓存区,如下图:

其中第一层为内存构成的缓冲池,第二层为扩展的后备存储区。在L2上只存储干净的数据,为读提供缓存,不提供脏数据的缓存。这样的设计让我们不用担心SSD出现损坏的情况,当SSD出现损坏时,只是我们的缓存结构回到了加扩展前的状态,之前缓存在SSD上的数据,只需要从磁盘上再读取进内存。

Buffer Pool扩展实现

在SSD盘上设置扩展缓存区:

alter server configuration

set buffer pool extension on

(filename = 'I:\EXAMPLE.BPE', size= 4GB )

执行该命令后,在SSD盘上回生成一个EXAMPLE的文件,如下图:

撤销在SSD盘上设置的扩展缓存区:

alter server configuration

set buffer pool extension off

撤销缓冲池扩展后,将从注册表中删除所有相关的配置设置。SQL Server 实例关闭时,将会删除缓冲池扩展文件。

扩展缓存区注意事项

设置缓存区的时候,缓冲池扩展大小最大可为 max_server_memory 值的 32 倍。建议物理内存 (max_server_memory) 的大小与缓冲池扩展的大小之比不应超过 1:16。 介于 1:4 至 1:8 之间的比率是最佳的。

Buffer Pool扩展的优势

为了验证Buffer Pool扩展的作用,我们做了3个场景的数据读取,并对比磁盘物理读取次数与执行时间。

数据在磁盘上,从磁盘读取数据。

该种场景是在语句执行时,数据存储在磁盘上,执行步骤如下:

  • 使用 dbcc dropcleanbuffers 命令清空 Buffer  Pool 中的数据
  • 开启IO 统计 set statistics io on
  • 执行查询语句

从上图可以看出,当数据在磁盘上时,该查询执行了2次物理读即从磁盘读取了2页的数据。

从上图可以看出,该语句读持续了169毫秒。

数据在内存缓存中,从内存读取数据

该种场景是在语句执行时,数据在内存缓存上:

  • 执行查询语句,数据从磁盘读取到缓存
  • 开启IO 统计 set statistics io on
  • 再次执行语句,查看IO信息与执行时间

从上图可以看出,当数据在内存缓存上时,该查询执行了0次物理读。

从上图可以看出,该语句读持续了2毫秒。

数据在SSD扩展盘上有缓存,从SSD缓存读取数据

该种场景是在语句执行时,数据存储在Buffer Pool扩展 SSD硬盘上:

定位当前查询的数据所在的页,执行查询,使用 %%physloc%%获取当前记录行对应的标记信息(0x85E5000001000000)

标记信息是十六进制,将其转换为十进制数字,该标记0x后8为表示所在的页号;在转换的过程中这8位数字需要做个顺序调整,如上图中的值(0x85E5000001000000)需要转换为如下计算方式:

select cast(0x0000e585 as int )

获取页号后执行如下语句查看该页在Buffer Pool 中的情况。

select * from sys.dm_os_buffer_descriptors a where  a.page_id='58757'

从如上执行结果可以看出,58757 页对应的is_in_bpool_extension值为1,说明该页存储在Buffer Pool 扩展上。

执行查询语句,查看IO信息,如下图:

从上图可以看出,当数据在Buffer Pool 扩展有缓存时,该查询执行了0次物理读。

从上图可以看出,该语句读持续了49毫秒。

结论

通过同一环境中的如上三个场景测试,测试结果如图:

 

物理读次数

持续时间

数据页在磁盘

2次

169毫秒

数据页缓存在内存

0

2毫秒

数据页缓存在SSD Buffer Pool扩展

0

49毫秒

通过如上测试,我们知道使用SSD Buffer Pool扩展后,当内存不足时内存中的干净数据会移至SSD Buffer Pool扩展上,此时再次读取这些数据的时候降低了IO操作,并且读取时间较直接从硬盘读取数据快。

SQL SERVER Buffer Pool扩展的更多相关文章

  1. SQL Server 2014新特性——Buffer Pool扩展

    Buffer Pool扩展 Buffer Pool扩展是buffer pool 和非易失的SSD硬盘做连接.以SSD硬盘的特点来提高随机读性能. 缓冲池扩展优点 SQL Server读以随机读为主,S ...

  2. 如果正确读取SQL Server中的扩展事件?

        SQL Server中使用扩展事件捕捉所需的信息后,可以选择存放的位置.比如说内存或文件中,但无论存在哪里,其本质都是一个大XML.因此在SQL Server中读取该XML就是解析扩展事件结果 ...

  3. sql server 常用的扩展存储过程

    sql server 里面提供了丰富的系统存储过程来辅助我们管理数据库以及开发.今天分享介绍一些常用的数据库扩展存储过程 xp_cmdshell 这个大家都比较熟悉了,使用xp_cmdshell 可以 ...

  4. SQL SERVER中的扩展属性

    以前在SQL SERVER建表时,总看到扩展属性,但一直未使用过.今天研究下: 增加扩展属性: 语法: sp_addextendedproperty [ @name = ] { 'property_n ...

  5. SQL Server中的扩展事件学习系列

    SQL Server 扩展事件(Extented Events)从入门到进阶(1)——从SQL Trace到Extented Events SQL Server 扩展事件(Extented Event ...

  6. SQL Server -查看数据库扩展属性

    1.fn_listextendedproperty 函数可以基于对象类型显示单个数据库对象或数据库中所有对象的扩展属性.例如,可以返回表或表中所有列的扩展属性. A.下面的示例显示了数据库本身设置的所 ...

  7. SQL Server 2014新特性探秘(2)-SSD Buffer Pool Extension

    简介     SQL Server 2014中另一个非常好的功能是,可以将SSD虚拟成内存的一部分,来供SQL Server数据页缓冲区使用.通过使用SSD来扩展Buffer-Pool,可以使得大量随 ...

  8. SSD Buffer Pool Extension

    SSD Buffer Pool Extension 简介 SQL Server 2014中另一个非常好的功能是,可以将SSD虚拟成内存的一部分,来供SQL Server数据页缓冲区使用.通过使用SSD ...

  9. 浅谈SQL Server 对于内存的管理

    简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) ...

随机推荐

  1. [POJ 2115} C Looooops 题解(扩展欧几里德)

    题目描述 对于C的for(i=A ; i!=B ;i +=C)循环语句,给出A,B,C和k(k表示变量是在k进制下的无符号整数),判断循环次数,不能终止输出"FOREVER". 输 ...

  2. URLWRITE视图重写技术

    UrlRewrite就是地址重写,用户得到的全部都是经过处理后的URL地址,类似于Apache的mod_rewrite.将我们的动态网页地址转化为静态的地址,如html.shtml,还可以隐藏网页的真 ...

  3. 集成python双版本详解

    最近要准备学习Python,由于版本上的差异,不知道要学哪个,现在好多东西都是基于python2基础的,但是python2在2020年左右就可能停止了,所以干脆决定两个都装上吧!   首先上官网上下载 ...

  4. 手把手教你从基础学习JQuery

    JQuery JQuery 语法 1.jQuery("选择器").action();通过选择器调用事件函数 但jQuery中,jQuery可以用$代替,即$("选择器&q ...

  5. Java8 Lambda/Stream使用说明

    一.Stream流1. 流的基本概念 1.1 什么是流?流是Java8引入的全新概念,它用来处理集合中的数据,暂且可以把它理解为一种高级集合.众所周知,集合操作非常麻烦,若要对集合进行筛选.投影,需要 ...

  6. 使用Iterator的方式也可以顺利删除和遍历

    使用Iterator的方式也可以顺利删除和遍历 eg: public void iteratorRemove() { List<Student> students = this.getSt ...

  7. 巧用五招提升Discuz!X运行速度

    Discuz!X使用的是数据库应用程序,所以,当数据库的大小.帖子的数目.会员的数目,这些因素都会影响到程序的检索速度,尤其是当论坛的影响力大了,这个问题就更为突出了,虽然,康盛对Discuz进行了更 ...

  8. react-router 踩坑记

    react-router踩坑分享 背景 辛苦历程 JavaScript动态修改 第一次尝试 第二次尝试 第三次尝试 第四次尝试 总结步骤 其他方案 原理 History 常见的3种History Br ...

  9. setTimeout与setInterval参数之String

    今天无意中给某网友解答了一些setTimeout的问题,发现一个有趣的东西. 以前我总认为setTimeout的第一个参数只能function,后面发现string也能执行.那问题来了,String做 ...

  10. ReactiveSwift源码解析(八) SignalProducer的代码的基本实现

    在前面几篇博客中我们详细的聊了ReactiveSwift中的Bag.Event.Observer以及Signal的使用方式和代码实现.那么在接下来的这几篇博客中,我们就依附于之前博客的基础上来聊一聊S ...