可以通過多種配置數據庫服務器的方式來提高性能。如索引、統計信息、hints、物理設計和服務器配置等。
當你完成上面那些配置後,還依舊有少量存儲過程、查詢運行得很慢時,由於硬件資源限制,可能已經沒什麼好調整。如一個數據庫服務器支撐著多個應用系統,其中一個是報表系統,而報表系統往往都是非常耗資源的。
在2008之前,對於這種問題,很難作出有效的解決方法。從2008開始,引入了一個資源調控器(ResourceGovernor)來協助解決這類問題。資源調控器(下面簡稱RG),可以管理服務器上CPU和內存資源。不同類型的請求可以被分配到不同的資源。
RG的功能可以分為3個組件:
1、 分類(Classification)
2、 資源池(Resource pool)
3、 工作負荷組(Workload group)
RG的基本功能/體系
分類(Classification):定義一個用戶自定義標量函數作為RG的分類函數,每當請求到達時,分類函數就會執行,區分請求的類型,然後放到特定的工作負荷組(Workload Group)中。
工作負載組(WorkloadGroup):一個邏輯單元,包含了一組資源。屬於特定的資源池(Resource Pool)SQLServer創建了兩個默認的工作負載組,internal和default。
資源池(ResourcePool):包含對請求分配特定工作負載組的資源規則定義,SQLServer同樣創建了兩個資源池internal和default。
通過SQLServerManagement Studio 配置資源調控器:
在開始之前,先來創建一個現實環境,假設AdventureWorks數據庫是生產數據庫,且有數十億的數據。這個庫提供多個應用程序使用。一個應用程序是用於web程序,一個是OLTP。另外一個應用程序是報表系統。當查詢報表的時候,會影響到web程序,為了解決這個問題,可以借助RG來保存web程序的CPU和內存資源。這裡保留web程序獲得最少50%的CPU和內存,報表使用25%。
本文將演示使用SQLServer Management Studio(下稱SSMS)來實現。
准備工作:
本文將創建兩個資源池和工作負載組。用於給web和報表程序之用。獨立的用戶名分類函數區分請求很有幫助,基於用戶名,分類函數將發送請求到特定的工作負載組。
步驟:
1、 打開ssms,確保這個登錄有管理員權限,如果不能,那需要有Alter LOGIN和CONTROL SERVER的權限。
2、 在新建窗口輸入,注意本文使用AdventureWorks2012數據庫:
[sql] view plaincopyprint?
USE master
GO
Create LOGIN [AW_WebAppUser] WITH PASSWORD=N'AW_WebAppUser123' ,DEFAULT_DATABASE=AdventureWorks2012
GO
USE AdventureWorks2012
GO
Create USER [AW_WebAppUser] FOR LOGIN [AW_WebAppUser]
GO
Alter ROLE [db_owner] ADD MEMBER [AW_WebAppUser]
GO
Create LOGIN [AW_ReportAppUser] WITH PASSWORD=N'AW_ReportAppUser123',DEFAULT_DATABASE=AdventureWorks2012
GO
USE AdventureWorks2012
GO
Create USER [AW_ReportAppUser] FOR LOGIN [AW_ReportAppUser]
GO
Alter ROLE [db_owner] ADD MEMBER [AW_ReportAppUser]
GO
USE master
GO
Create LOGIN [AW_WebAppUser] WITH PASSWORD=N'AW_WebAppUser123' ,DEFAULT_DATABASE=AdventureWorks2012
GO
USE AdventureWorks2012
GO
Create USER [AW_WebAppUser] FOR LOGIN [AW_WebAppUser]
GO
Alter ROLE [db_owner] ADD MEMBER [AW_WebAppUser]
GO
Create LOGIN [AW_ReportAppUser] WITH PASSWORD=N'AW_ReportAppUser123',DEFAULT_DATABASE=AdventureWorks2012
GO
USE AdventureWorks2012
GO
Create USER [AW_ReportAppUser] FOR LOGIN [AW_ReportAppUser]
GO
Alter ROLE [db_owner] ADD MEMBER [AW_ReportAppUser]
GO
3、 創建分類函數:
[sql] view plaincopyprint?
USE MASTER
GO
Create FUNCTION dbo.RGClassifier( )
RETURNS SYSNAME
WITH SCHEMABINDING
AS
BEGIN
DECLARE @Workload_GroupName SYSNAME
IF SUSER_NAME() = 'AW_WebAppUser'
SET @Workload_GroupName = 'rg_WebApp'
ELSE
IF SUSER_NAME() = 'AW_ReportAppUser'
SET @Workload_GroupName = 'rg_ReportApp'
ELSE
SET @Workload_GroupName = 'default'
RETURN @Workload_GroupName
END
USE MASTER
GO
Create FUNCTION dbo.RGClassifier( )
RETURNS SYSNAME
WITH SCHEMABINDING
AS
BEGIN
DECLARE @Workload_GroupName SYSNAME
IF SUSER_NAME() = 'AW_WebAppUser'
SET @Workload_GroupName = 'rg_WebApp'
ELSE
IF SUSER_NAME() = 'AW_ReportAppUser'
SET @Workload_GroupName = 'rg_ReportApp'
ELSE
SET @Workload_GroupName = 'default'
RETURN @Workload_GroupName
END
4、 打開ssms,右鍵資源調控器節點,選擇【屬性】,就見到如下:
5、 點擊啟用【啟用資源調控器】:
6、 在分類函數名下拉框中,選擇dbo.RGClassifier():
7、 在資源池網格中,可以找到兩個默認資源池defalut和internal,現在添加一個新的資源池叫做rp_WebApp,並配置為如圖,記住總和不能超過100:
8、 在資源池的工作負荷組:rp_WebApp中,創建一個新的工作負荷組rg_WebApp,並配置CPU時間為300: