在今天的文章里,我想谈下SQL Server 2014里非常酷的提升:现在你终于可以根据需要的IOPS来压制查询!资源调控器(Resource Governor)自SQL Server 2008起引入,但提供的功能还是有所限制:你只能限制CPU时间(这个已经很棒了),还有你能限制查询(从每个独立的查询)内存量。

但作为DBA的你,你经常会进行一些数据库维护操作,例如索引重建,DBCC CHECKDB操作等。我们都知道,这些操作会在你的存储里带来大量的IOPS直至峰值。如果在7 * 24在线的数据库来说,这个会影响你的生产力,给业务和销售额带来很大影响。

自SQL Server 2014开始,这个情况就变了,因为你可以通过资源调控器来部署指定的资源池来限制IOPS使用率。当你隔离你的DBA操作到指定的资源池时,你能指定资源池可以使用的最大IOPS(包括最小IOPS)。因此你可以压制下DBA操作需要的IOPS。你的生产工作量就可以更好的使用你的存储。更多信息可以查看微软在线帮助

我想用一个非常简单的例子来展示下这个行为。假设你是DBA,正要进行常规索引重建操作,这个需要通过资源调控器对它们的最大IOPS使用率进行控制。第1步我们为DBA操作创建专用的资源池和工作负荷组。

 -- Create a new Resource Pool for the DBAs.
-- We use a very high value for MAX_IOPS_PER_VOLUME so that we are
-- currently running unlimited.
CREATE RESOURCE POOL DbaPool WITH
(
MAX_IOPS_PER_VOLUME = 100000
)
GO -- Create a new Workload Group for the DBAs
CREATE WORKLOAD GROUP DbaGroup
USING DbaPool
GO

从刚才的代码可以看到,CREATE RESOURCE POOL语句现在为你提供MAX_IOPS_PER_VOLUME属性(包括MIN_IOPS_PER_VOLUME)。这里我设置了一个很高的值,因此在第一次执行时IOPS不会受限,这里我们根据需要的IOPS建立了初始基线。下一步我会创建资源调控器需要的分类函数。

 -- Create a new Classifier Function for Resource Governor
CREATE FUNCTION dbo.MyClassifierFunction()
RETURNS SYSNAME WITH SCHEMABINDING
AS
BEGIN
DECLARE @GroupName SYSNAME IF SUSER_NAME() = 'DbaUser'
BEGIN
SET @GroupName = 'DbaGroup'
END
ELSE
BEGIN
SET @GroupName = 'Default'
END RETURN @GroupName;
END
GO

在分类函数里我们根据登录进行评估。如果登录是DbaUser,进入的会话会在DbaGroup工作负荷组里。否则就进入默认的工作负荷组。最后我们在资源调控器注册并配置它,这样我们的设置就生效了。

 -- Register the Classifier Function within Resource Governor
ALTER RESOURCE GOVERNOR WITH
(
CLASSIFIER_FUNCTION = dbo.MyClassifierFunction
)
GO -- Reconfigure Resource Governor
ALTER RESOURCE GOVERNOR RECONFIGURE
GO

现在当你创建名为DbaUser的登录时,你可以用它连接到你的SQL Server。你可以在DMV sys.dm_exec_sessions 看下 group_id列验证下到来的会话是否在正确的工作负荷组里。下一步我在ContoRetailDW数据库的FactOnlineSales表里的DataKey里创建一个非聚集索引。

 -- Create a simple Non-Clustered Index
CREATE NONCLUSTERED INDEX idx_DateKey ON FactOnlineSales(DateKey)
GO

我们从开始就创建了资源池,现在在我们在我们的资源池里并没有限制。因此当我们现在进行刚才创建的非聚集索引的索引重建时,SQL Server会占用大量的IOPS。我们可以通过性能监控里的“SQL Server:Resource Pool Stats:Disk Write IO/Sec”性能计数器来验证刚才创建的资源池。

 ALTER INDEX idx_DateKey ON FactOnlineSales REBUILD
GO

可以看到索引重建花费近100的IOPS。接下来我要做的是限制DbaPool资源池为仅50的IOPS:

 -- Let's change the Resource Pool by lowering the maximum IOPS.
ALTER RESOURCE POOL DbaPool WITH
(
MAX_IOPS_PER_VOLUME = 50
)
GO

现在当你执行索引重建时,在性能监视器里可以清楚看到,在特定的资源池里只有平均50 IOPS。

另外Disk Write IO Throttled/sec性能计数器也会告诉为你资源调控器的IOPS的限制数。

使用以前的资源调控器,查询本身毫无办法,它是否被压制了。这对性能调优也是个非常重要的因素。当启用资源调控器时,没有特定的等待类型出现在SQL Server里。我的测试显示一旦资源调控器启用时,有更多的PAGEIOLATCH_SH/PAGEIOLATCH_EX等待类型,这就对了。下面2个图片显示了对于发生索引重建的会话里具体的等待类型信息——第1个没有资源调控器,第2个有资源调控器压制了IOPS。

从2个图中可以看到,2个运行的测试有巨大的区别,尤其是在PAGEIOLATCH_EXSOS_SCHEDULER_YIELD等待类型。

从我站在IOPS压制来看,对于已有的功能来说,资源调控器是个很好的附加,这让资源调控器更加成熟。大家可以尝试用这个新功能解决IOPS方面的问题。

感谢关注!

参考文章:

https://www.sqlpassion.at/archive/2014/01/14/how-to-throttle-your-storage-with-resource-governor-in-sql-server-2014/

在SQL Server 2014里,如何用资源调控器压制你的存储?的更多相关文章

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

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

  2. SQL Server 2014里的性能提升

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

  3. SQL Server 2014里的缓存池扩展

    在今天的文章里我想谈下SQL Server 2014里引入的缓存池扩展(Buffer Pool Extensions).我们都知道,在SQL Server里,缓存池是主要的内存消耗者.当你从你存储里读 ...

  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资源调控》

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 撰写经历(Experience) 特约稿正文(Content-body) 第一部分:生活中资源 ...

  7. SQL Server 2014 新特性:IO资源调控

    谈谈我的微软特约稿:<SQL Server 2014 新特性:IO资源调控> 2014-07-01 10:19 by 听风吹雨, 570 阅读, 16 评论, 收藏, 收藏 一.本文所涉及 ...

  8. 看完SQL Server 2014 Q/A答疑集锦:想不升级都难!

    看完SQL Server 2014 Q/A答疑集锦:想不升级都难! 转载自:http://mp.weixin.qq.com/s/5rZCgnMKmJqeC7hbe4CZ_g 本期嘉宾为微软技术中心技术 ...

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

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

随机推荐

  1. Restful.Data 开源持久层组件项目最新进展和使用说明

    Restful.Data 经过 博客园 和 CSDN 的宣传,目前参与该项目的人数已达到 114 人(群号:338570336),虽大部分并不参与实际开发,但他们所提出的意见和建议以及在试用过程中发现 ...

  2. (转载)编写高效的jQuery代码

    原文地址:http://www.cnblogs.com/ppforever/p/4084232.html 最近写了很多的js,虽然效果都实现了,但是总感觉自己写的js在性能上还能有很大的提升.本文我计 ...

  3. Asp.net下使用HttpModule模拟Filter,实现权限控制

    在asp.net中,我们为了防止用户直接从Url中访问指定的页面而绕过登录验证,需要给每个页面加上验证,或者是在模板页中加上验证.如果说项目比较大的话,添加验证是一件令人抓狂的事情,本次,我就跟大家分 ...

  4. hadoop研究:mapreduce研究前的准备工作

    继续研究hadoop,有童鞋问我,为啥不接着写hive的文章了,原因主要是时间不够,我对hive的研究基本结束,现在主要是hdfs和mapreduce,能写文章的时间也不多,只有周末才有时间写文章,所 ...

  5. IOS Runtime-初识runtime(一)

    苹果公布了runtime的源码,可以从地址下载:http://www.opensource.apple.com/tarballs/objc4/ object-c程序在启动的时候,需要一个准备时间,这个 ...

  6. 微信授权步骤与详解 -- c#篇

    微信授权步骤与详解 -- c#篇 注:这里不涉及界面操作,只介绍代码操作. 1.基本原理如下: 从图上所知,第一步用户访问我们的网页,第二步我们后台跳转到微信授权页面,第三步用户点击授权,第四步微信重 ...

  7. 如何在win7系统中安装redis

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/92.html?1455871954 如何在win7系统中安装redis​ ...

  8. PHP面向对象07_PDO

    oop007复习 2014-9-4 9:42:28 摘要: 1.pdo的作用 2.pdo的安装 3.pdo连接属性设置 4.pdo对象和PDOStatement对象 5.pdo预处理 6.pdo事务机 ...

  9. 用css来写一些简单的图形

    在写网页的过程中,有时我们需要用到一些简单的图片但是手头又没有合适的,我们其实可以自己来写,下面我就简单的介绍几个例子: 1.上三角 Triangle Up #triangle-up { width: ...

  10. getattribute()与getparameter()的区别

    1.它们取到的值不同.getAttribute取到的是对象(object),而getParameter取到的是String. 2.数据传递路劲不同.request.getParameter方法传递的数 ...