共用方式為


資源管理員分類器函式

適用於:SQL ServerAzure SQL 受控執行個體

資源管理員分類程式可以使用分類器函式,將傳入會話指派給工作負載群組。 分類器函式包含自訂邏輯,用於將會話分類到工作負載群組中。

如需設定和監視範例,以及了解資源管理員最佳做法,請參閱 教學課程:資源管理員組態範例和最佳做法

分類

使用資源調控器時,每個新的會話都會被自動歸類入工作負載群組中。 分類器是您所建立的純量用戶定義函式。 其中包含您想要的邏輯,將傳入會話指派給工作負載組。 分類器傳回的純量值是指派給傳入會話的工作負載群組名稱。

如果啟用資源管理員,並在資源管理員組態中指定分類器函式,則函式輸出會決定用於新會話的工作負載群組。 否則,所有用戶會話都會分類為 default 工作負載群組。

注意

internal 工作負載群組僅用於內部系統要求。 您無法變更用來將要求指派至 internal 工作負載群組的準則,而且您無法將要求明確分類至 internal 工作負載群組。

您必須完成下列步驟,才能開始使用分類器函式:

  1. 使用 CREATE FUNCTION,在 master 資料庫中建立函式。 函式必須使用架構系結。
  2. 使用 ALTER RESOURCE GOVERNOR 並搭配 CLASSIFIER_FUNCTION 參數,參考資源管理器配置中的函式。
  3. 使用 ALTER RESOURCE GOVERNOR RECONFIGURE讓新的組態生效。

重要

如果分類器函式未在用戶端所設定的連線逾時期間內完成,用戶端連線嘗試可能會逾時。 請務必建立分類器函式,以在發生連線逾時之前完成執行。

讓分類器函式保持簡單。 避免使用複雜或耗時的邏輯。 可能的話,請避免分類器中的數據存取。

分類器函式具有下列特性和行為:

  • 函式定義於伺服器範圍中(master 資料庫中)。
  • 函式是使用架構系結來定義。 如需詳細資訊,請參閱 SCHEMABINDING
  • 函式會針對每個新的工作階段進行評估,即使已啟用連線池化也一樣。
  • 函式會傳回會話的工作負載群組內容。 會話在其整個期間,會被分配到分類器所返回的工作負載群組。
  • 如果函式傳回 NULLdefault或不存在的工作負載群組名稱,會話就會獲得 default 工作負載群組內容。 如果函式因任何原因失敗,會話也會被賦予 default 的上下文。
  • 使用 ALTER RESOURCE GOVERNOR (WITH CLASSIFIER_FUNCTION = ...) 語句新增或移除分類函數之後,變更只有在執行 ALTER RESOURCE GOVERNOR RECONFIGURE 語句之後才會生效。
  • 一次只能將一個函式指定為分類器。
  • 除非使用將函式名稱設定為 NULL 或另一個函式名稱的 ALTER RESOURCE GOVERNOR (WITH CLASSIFIER_FUNCTION = ...) 語句移除分類器狀態,否則無法修改或刪除分類器函式。
  • 如果沒有分類器函式,所有會話都會分類為 default 群組。
  • 分類器函式輸出中指定的工作負載群組超出架構系結限制的範圍。 例如,您無法卸除分類器函式中所參考的數據表,但即使分類器傳回該群組的名稱,您還是可以卸除工作負載群組。

啟用 DAC

為了進行疑難解答和診斷,建議您主動啟用並熟悉專用系統管理員連線(DAC)。 DAC 不受資源管理員分類限制。 您可以使用 DAC 來監視分類器函式並進行疑難解答,即使您的資源管理員設定故障,也使得其他連線無法使用。 如需詳細資訊,請參閱 資料庫管理員的診斷連線

如果 DAC 無法用來進行疑難排解,您可以用單一使用者模式啟動伺服器。 雖然單一使用者模式連線不受分類限制,但它不允許您在資源管控器運行時診斷其分類。

使用 DAC 或以單一使用者模式連線之後,您可以 修改資源管理員組態 移除故障分類器函式,或 停用資源管理員

登入過程

在資源管控的情境中,會話的登入過程包含下列步驟:

  1. 登入驗證。
  2. 登入觸發 執行。 只有在實例中有登入觸發程式時才會發生。
  3. 分類。

分類開始時,資源管理員會執行分類器函式,並使用函式傳回的純量值,將要求傳送至相符的工作負載群組。

您可以使用 sys.dm_exec_sessionssys.dm_exec_requests 系統檢視來監視登入觸發程式和分類器函式的執行。

例子

資源管理員分類器函式可以使用各種不同的自定義邏輯。 如需更多範例和逐步解說,請參閱 教學課程:資源管理員組態範例和最佳做法

A。 主機名

此函式會使用 HOST_NAME() 內建系統函式,將特定主機名中的會話分類為名為 Reports的工作負載群組。 所有其他會話都會繼續分類為 default 工作負載群組。

CREATE FUNCTION dbo.rg_classifier()
RETURNS sysname
WITH SCHEMABINDING
AS
BEGIN
    DECLARE @grp_name sysname = 'default';

    IF (HOST_NAME() IN ('reportserver1','reportserver2'))
        SET @grp_name = 'Reports';
    
    RETURN @grp_name;
END;
GO

B. 使用者名

此函式會使用 SUSER_SNAME() 內建系統函式,將特定使用者名稱或服務帳戶名稱中的會話分類為名為 Reports的工作負載群組。 所有其他會話都會繼續分類為 default 工作負載群組。

CREATE FUNCTION dbo.rg_classifier()
RETURNS sysname
WITH SCHEMABINDING
AS
BEGIN
    DECLARE @grp_name sysname = 'default';

    IF (SUSER_SNAME() IN ('Reporting', 'domain/svc_reporting'))
        SET @grp_name = 'Reports';
    
    RETURN @grp_name;
END;
GO

C. 應用程式名稱

此函式會使用 APP_NAME() 內建系統函式,將特定應用程式名稱中的會話分類為名為 Adhoc的工作負載群組。 所有其他會話都會繼續分類為 default 工作負載群組。

重要

應用程式或使用者可以提供任何應用程式名稱做為連接字串的一部分。 用戶可以透過各種不同的應用程式進行連線。

CREATE FUNCTION dbo.rg_classifier()
RETURNS sysname
WITH SCHEMABINDING
AS
BEGIN
    DECLARE @grp_name sysname = 'default';

    IF (APP_NAME() IN ('Microsoft SQL Server Management Studio - Query','azdata'))
        SET @grp_name = 'Adhoc';
    
    RETURN @grp_name;
END;
GO