手机
当前位置:查字典教程网 >编程开发 >mssql数据库 >如何在SQL Server 2014中用资源调控器压制你的存储?
如何在SQL Server 2014中用资源调控器压制你的存储?
摘要:在今天的文章里,我想谈下SQLServer2014里非常酷的提升:现在你终于可以根据需要的IOPS来压制查询!资源调控器(ResourceG...

在今天的文章里,我想谈下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

如何在SQL Server 2014中用资源调控器压制你的存储?1

可以看到索引重建花费近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。

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

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

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

如何在SQL Server 2014中用资源调控器压制你的存储?3

如何在SQL Server 2014中用资源调控器压制你的存储?4

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

从我站在IOPS压制来看,对于已有的功能来说,资源调控器是个很好的附加,这让资源调控器更加成熟。

大家可以尝试用这个新功能解决IOPS方面的问题。

以上所述就是本文的全部内容,希望对大家的学习有所帮助。

【如何在SQL Server 2014中用资源调控器压制你的存储?】相关文章:

图文详解SQL Server 2008R2使用教程

在SQLServer 2005中编写存储过程

SQL Server中统计每个表行数的快速方法

如何解决SQL Server2008不允许保存修改的问题

SQL Server2005 中的数据类型总结

如何将SQL Server表驻留内存和检测

如何在SQL Server 2005数据库中导入SQL Server 2008的数据

SQL Server 2000中修改数据库COLLATE的实例

SQL Server 2005 中使用 Try Catch 处理异常

SQL Server 2005中更改sa的用户名的方法

精品推荐
分类导航