Azure Synapse Analytics 中專用 SQL 集區的工作負載分類

本文說明將工作負載群組和重要性指派給 Azure Synapse 中具有專用 SQL 集區的傳入要求的工作負載分類程序。

分類

工作負載管理分類可透過指派資源類別重要性,將工作負載原則套用至各次要求。

雖然有許多方式可將資料倉儲工作負載分類,但是最簡單且最常見的分類是載入和查詢。 您可以使用 insert、update 和 delete 陳述式來載入資料。 您可以使用 select 來查詢資料。 資料倉儲解決方案通常會有負載活動的工作負載原則,例如指派更多資源的資源類別。 不同的工作負載原則可以套用至查詢,例如相較于載入活動的較低重要性。

您也可以進行子分類和查詢您的工作負載。 子類別可讓您更充分掌控您的工作負載。 例如,查詢工作負載可以包含 cube 重新整理、儀表板查詢或特定查詢。 您可以使用不同的資源類別或重要性設定來分類每個查詢工作負載。 子類別也有益於載入。 大型的轉換可以指派給較大的資源類別。 較高的重要性可以用來確保重要的銷售資料是在氣象資料或社交資料之前的載入器。

並非所有的陳述式都會分類,因為其不需要資源或需要重要性來影響執行。 DBCC 命令、BEGIN、COMMIT 和 ROLLBACK TRANSACTION 陳述式不需分類。

分類程序

現今用於專用 SQL 集區的分類是藉由將使用者指派給已使用 sp_addrolemember 指派給其對應資源類別的角色。 為要求賦與超出登入資源類別的能力,會受到此功能的限制。 現在透過 CREATE WORKLOAD CLASSIFIER 語法提供更豐富的分類方法。 使用此語法,專用 SQL 集區使用者可以透過 workload_group 參數指派重要性和要指派給要求的系統資源量。

分類加權

做為分類程序的一部分,您可以用加權來判斷指派的工作負載群組。 加權如下所示:

分類器參數 Weight
MEMBERNAME:USER 64
MEMBERNAME:ROLE 32
WLM_LABEL 16
WLM_CONTEXT 8
START_TIME/END_TIME 4

必須有 membername 參數。 但是,如果指定的成員名稱是資料庫使用者,而不是資料庫角色,則使用者的加權會較高,因此會選擇該分類器。

如果使用者是多個角色的成員,且被指派了不同的資源類別或在多個分類器中相符,該使用者將獲得最高的資源類別指派。 此行為與現有的資源類別指派行為一致。

注意

在 Azure Synapse 工作區中的專用 SQL 集區與獨立專用 SQL 集區 (先前稱為 SQL DW) 之間,分類受控識別 (MI) 行為會有所不同。 雖然獨立專用 SQL 集區 MI 會維護指派的身分識別,但對於 Azure Synapse 工作區,MI 會以 dbo 身分執行。 這無法變更。 根據預設,dbo 角色會分類為 smallrc。 建立 dbo 角色的分類器可讓您將要求指派給 smallrc 以外的工作負載群組。 如果單單是 dbo 對分類而言太過籠統,而且影響更廣泛,請考慮搭配 dbo 角色分類使用標籤、工作階段或時間型分類。

系統分類器

工作負載分類具有系統工作負載分類器。 系統分類器會將現有的資源類別角色成員資格與具有一般重要性的資源類別資源配置對應。 無法卸除系統分類器。 若要檢視系統分類器,您可以執行下列查詢:

SELECT * FROM sys.workload_management_workload_classifiers where classifier_id <= 12

使用分類器混合資源類別指派

代表您建立的系統分類器提供移轉至工作負載分類的簡單路徑。 當您開始建立具有重要性的新分類器時,使用具有分類優先順序的資源類別角色對應可能會導致分類錯誤。

試想以下情況:

  • 現有的資料倉儲具有指派給 largerc 資源類別角色的資料庫使用者 DBAUser。 資源類別指派是使用 sp_addrolemember 完成。
  • 資料倉儲現在已使用工作負載管理更新。
  • 為測試新的分類語法,資料庫角色 DBARole (DBAUser 為其成員) 具有已為其建立的分類器,並將它們對應到 mediumrc 和高重要性。
  • 當 DBAUser 登入並執行查詢時,會將查詢指派給 largerc。 因為使用者會優先於角色成員資格。

若要簡化分類誤判的疑難排解,建議您在建立工作負載分類器時,將資源類別角色對應移除。 下列程式碼會傳回現有的資源類別角色成員資格。 針對每個從對應資源類別傳回的成員名稱,執行 sp_droprolemember

SELECT  r.name AS [Resource Class]
,       m.name AS membername
FROM    sys.database_role_members rm
JOIN    sys.database_principals AS r ON rm.role_principal_id = r.principal_id
JOIN    sys.database_principals AS m ON rm.member_principal_id = m.principal_id
WHERE   r.name IN ('mediumrc','largerc','xlargerc','staticrc10','staticrc20','staticrc30','staticrc40','staticrc50','staticrc60','staticrc70','staticrc80');
--for each row returned run in the previous query
EXEC sp_droprolemember '[Resource Class]', membername;

下一步