在今天的文章里我想谈下SQL Server 2014里引入的缓存池扩展(Buffer Pool Extensions)。我们都知道,在SQL Server里,缓存池是主要的内存消耗者。当你从你存储里读取数据时,数据会在缓存池里缓存。SQL Server在计划缓存里缓存执行计划,也是缓存池的一部分。你拥有的物理内存越多,你的缓存池就会越大(通过【最大服务器内存】设置配置)。

很多SQL Server用户会碰到数据库服务器里物理内存受限的问题:所有内存槽都被占用了,因此你如何想给物理服务器增加额外的内存?当然,你可以迁移到更大的服务器,但那是另外一回事……这个特定问题的解决方案是SQL Server 2014里引入的缓存池扩展。在缓存池扩展的帮助下,SQL Server在内存层级里引入了另外一层。我们来看下面的图片:

如你所见,在顶部是缓存池本身,它是非常快的(根据响应时间(latency times)),在底部你会看到我们的传统存储,它是比较慢的。缓存池扩展刚好落户在2者之间——传统缓存池和我们存储之间。缓存池苦熬占本身是包含一个简单文件(所谓的扩展文件(Extension File)),它应该存储在非常快的存储上——例如SSD硬盘。扩展文件大体上和Windows系统的页文件一样。不用在你的数据库服务器增加额外的物理内存,你只要配置在SSD硬盘上配置扩展——就可以了!

在我讨论配置并启用缓存池扩展前,我想简单谈下缓存池扩展的架构和背后的设计。SQL Server传统的缓存池总是在干净页和脏页间区分的。干净页就是内存里的内容和存储里的内容一样的页。脏页是在内存里改变的页,但还没有写回到存储。大约每分钟所谓的检查点(CHECKPOINT)过程会把脏页写回到存储,意味着脏页变成了干净页。

如果SQL Server的缓存池陷入内存压力,缓存池扩展本身就会被使用。内存压力指的是SQL Server需要比当前可用更多的内存。在那个情况下,缓存会从缓存池驱逐页,那些页是最近刚使用过的。SQL Server这里使用的是近期最少使用算法(Least Recently Used Policy (LRU))。如果现在你配置了扩展文件,SQL Server会把这些页写到扩展文件,而不是把它们直接写入我们缓慢的存储。如果页是脏的,这些页也会并发写入物理存储(通过异步I/O操作)。因此当你使用缓存池扩展时,你不会丢失任何数据。到一定时间点你的扩展文件也会完全存满。在那个情况下SQL Server又会从扩展文件驱逐老页(也是通过LRU算法),最后把它们写入传统存储。扩展文件充当缓存池和存储本身之间的额外一层。

现在我们来看下在SQL Server 2014里如何配置缓存池扩展。SQL Server这里提供你ALTER SERVER CONFIGURATION SET BUFFER POOL EXTENSION命令。我们来详细看下如何使用它:

 USE master
GO EXEC sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO
 ALTER SERVER CONFIGURATION
SET BUFFER POOL EXTENSION ON
(
FILENAME = 'd:\ExtensionFile.BPE',
SIZE = 1 GB
)
GO

这里你会碰到的第1个限制是扩展文件必须和缓存池本身一样的大小,如果你指定了比它小的文件大小,你会从SQL Server收到如下的错误信息:

Msg 868, Level 16, State 1, Line 1
Buffer pool extension size must be larger than the current memory allocation threshold 1596 MB. Buffer pool extension is not enabled.

下一个你肯定会碰到的限制是,在SQL Server运行期间,你不能修改扩展文件的大小。例如,当你想修改扩展文件到更大的大小,你需要停用缓存池扩展,然后再次启用。在此操作期间,你的性能会下降,因为你刚刚停用了SQL Server一个重要的缓存层!

当你计划为你的生产环境部署缓存池扩展时,你一定要意识到这点!!!

另外你不能缩小扩展文件的大小,文件必须要比先前的大。不然你还会收到如下的错误信息:

Msg 868, Level 16, State 1, Line 3
Buffer pool extension size must be larger than the current memory allocation threshold 4096 MB. Buffer pool extension is not enabled.

缓存池扩展的整个配置也可以通过DMV sys.dm_os_buffer_pool_extension_configuration来查询到。

什么时候你应该使用缓存池扩展?微软建议在你的服务器工作负荷是少读多写(write-heavy)时,例如OLTP工作负荷。当你处理DWH/BI相关的工作复核时,你不应该考虑缓存池扩展——这里启用扩展文件没任何意义。并且当我们讨论扩展文件时,你应该为它配置好非常快的SSD!传统旋转硬盘(机械硬盘)就算了吧!

参考文章:

https://www.sqlpassion.at/archive/2014/03/11/buffer-pool-extensions-in-sql-server-2014/

SQL Server 2014里的缓存池扩展的更多相关文章

  1. SQL Server 2014里的性能提升

    在这篇文章里我想小结下SQL Server 2014引入各种惊艳性能提升!! 缓存池扩展(Buffer Pool Extensions) 缓存池扩展的想法非常简单:把页文件存储在非常快的存储上,例如S ...

  2. 在SQL Server 2014里,如何用资源调控器压制你的存储?

    在今天的文章里,我想谈下SQL Server 2014里非常酷的提升:现在你终于可以根据需要的IOPS来压制查询!资源调控器(Resource Governor)自SQL Server 2008起引入 ...

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

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

  4. SQL Server 2014里的针对基数估计的新设计(New Design for Cardinality Estimation)

    对于SQL Server数据库来说,性能一直是一个绕不开的话题.而当我们去分析和研究性能问题时,执行计划又是一个我们一直关注的重点之一. 我们知道,在进行编译时,SQL Server会根据当前的数据库 ...

  5. 在SQL Server 2014里可更新的列存储索引 (Updateable Column Store Indexes)

    传统的关系数据库服务引擎往往并不是对超大量数据进行分析计算的最佳平台,为此,SQL Server中开发了分析服务引擎去对大笔数据进行分析计算.当然,对于数据的存放平台SQL Server数据库引擎而言 ...

  6. SQL Server 2014里的IO资源调控器

    在本文中,我们将来看看SQL Server 2014在资源调控器方面增加了哪些新的功能.资源调控器(Resource Governor)是从SQL Server 2008开始出现的一项功能.它是用于管 ...

  7. SQL Server 2014,改善的临时表缓存

    在一些先决条件下,SQL Server可以缓存临时表(cache Temp Tables).缓存临时表意味着当你创建反复创建同个临时表时,SQL Server就可以重用它们.这会从整体上大幅度提高你的 ...

  8. 第16/24周 SQL Server 2014中的基数计算

    大家好,欢迎回到性能调优培训.上个星期我们讨论在SQL Server里基数计算过程里的一些问题.今天我们继续详细谈下,SQL Server 2014里引入的新基数计算. 新基数计算 SQL Serve ...

  9. SQL Server 2014如何提升非在线的在线操作

    在今天的文章里,我想谈下在线索引重建操作( Online Index Rebuild operations),它们在SQL Server 2014里有怎样的提升.我们都知道,自SQL Server 2 ...

随机推荐

  1. Hibernate自动创建表

    只要在hibernate.cfg.xml添加这句话,就可以自动生成数据表 <property name="hibernate.hbm2ddl.auto">update& ...

  2. ASP.NET 开发必备知识点(2):那些年追过的ASP.NET权限管理

    一.前言 在前一篇文章已经为大家介绍了OWIN和Katana,有了对他们的了解之后,才能更好地去学习Asp.net Identity,因为Asp.net Identity的实现集成了Owin.其实在A ...

  3. Wix 安装部署教程(七) 获取管理员权限

    应用程序运行的时候,难免会读写文件,产生新的数据.但Program Files下的文件是不能随便更改,Win7下如果没有权限,将会被拒绝.我现在有两种方式,一种是将数据路径移到Program Data ...

  4. 【情人节来一发】网站添加QQ客服功能

    今年的元宵节遇到情人节,挺不自量力的,呵呵,开篇给各位讲个段子,早上一美女同学在空间发说说道:“开工大吉 起床啦,卖元宵,卖玫瑰,卖避孕套啦-有木有一起去发财的小伙伴?Let’s go…”,对于此种长 ...

  5. JavaScript字符转Unicode,顺便说句:GitHub的Oh no页面很亮

    遇到个输不出来的字符怎么办,因为输不出来的字符一般又是不常见大多数时候连名字也喊不出来的,所以想问百度谷歌大大也不大可能.如果是小白用户肯定会去把输入法软盘打开切换到其他键盘一个一个找.即使有搜狗输入 ...

  6. 简单JavaScript模版引擎优化

    在上篇博客最简单的JavaScript模板引擎 说了一下一个最简单的JavaScript模版引擎的原理与实现,作出了一个简陋的版本,今天优化一下,使之能够胜任日常拼接html工作,先把上次写的模版函数 ...

  7. 【重要更新】Senparc.Weixin SDK v4.4 升级说明

    本次更新同时影响以下所有Senparc.Weixin相关版本的dll: Senparc.Weixin.dll 升级到 v4.4.2(重要) Senparc.Weixin.MP.dll 升级到 v13. ...

  8. C#入门基础三

    封装:简化用户接口,隐藏实现细节. get{return 属性值:} set{属性值 = value:} 继承:子类继承父类所有非私有成员.继承具有传递性,单根性. 隐式继承:用引号(:)实现. 显示 ...

  9. 一道js面试题看变量的作用域

    [问题]分别求下面程序的输出结果: 1. <script type="text/javascript"> var a = 10; sayHi(); function s ...

  10. Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection

    网易公开课,第10,11课 notes,http://cs229.stanford.edu/notes/cs229-notes5.pdf   Model Selection 首先需要解决的问题是,模型 ...