適用於:Azure SQL 資料庫
Fabric 中的 SQL 資料庫
本文說明 Azure SQL Database 和 Fabric 中 SQL 資料庫的 最大平行度 (MAXDOP) 配置設定。
Note
此內容重點介紹 Azure SQL Database 和位於 Fabric 的 SQL 資料庫。 Azure SQL 資料庫是以最新穩定版本的 Microsoft SQL Server 資料庫引擎為基礎,因此多數內容相似,但是疑難排解和設定選項可能有所不同。 如需 SQL Server 和 Azure SQL 受控實例中 MAXDOP 的詳細資訊,請參閱 設定平行處理原則的最大程度伺服器組態選項。
MAXDOP 會控制資料庫引擎中的內部查詢平行處理。 較高的 MAXDOP 值通常會導致每個查詢有更多平行執行緒,並加快查詢執行的速度。
在 Azure SQL Database 和 Fabric 平台的 SQL 資料庫中,每個新的單一資料庫和彈性集區資料庫的預設 MAXDOP 設定為 8。 此預設值可防止不必要的資源使用率,同時仍允許資料庫引擎使用平行執行緒以更快執行查詢。 通常不需要在 Azure SQL Database 工作負載中進一步設定 MAXDOP,不過它可能會提供進階效能微調練習的優點。
Note
在 2020 年 9 月,根據 Azure SQL 資料庫服務多年的遙測,MAXDOP 8 被設為新資料庫的預設值,作為最適合各種客戶工作負載的最佳設定。 此預設有助於防止因為過度的平行處理而發生效能問題。 在此之前,新資料庫的預設設定是 MAXDOP 0。 在 2020 年 9 月之前建立的現有資料庫不會自動變更 MAXDOP。
一般情況下,如果資料庫引擎選擇使用平行處理原則來執行查詢,執行速度會較快。 但過度的平行處理原則可能會耗用額外的處理器資源,且查詢效能並不會改善。 當規模擴大時,過度的平行處理可能會對所有在相同資料庫引擎實例上執行的查詢效能帶來負面影響。 傳統上,設定平行處理原則的上限是 SQL Server 工作負載中常見的效能微調練習。
下表說明使用不同 MAXDOP 值執行查詢時的資料庫引擎行為:
| MAXDOP | Behavior |
|---|---|
= 1 |
資料庫引擎會使用單一序列執行緒來執行查詢。 不會使用平行執行緒。 |
> 1 |
資料庫引擎會將平行執行緒所使用的其他排程器數目設定為 MAXDOP 值,或是邏輯核心的總數目,以較小者為準。 |
= 0 |
資料庫引擎會將平行執行緒所使用的其他排程器數目設定為邏輯核心的總數目或 64,以較小者為準。 |
Note
每個查詢都會以至少一個排程器執行,並在該排程器上執行一個工作執行緒。
以平行處理原則執行的查詢會使用其他排程器和額外的平行執行緒。 由於多個平行線程可能會在相同的排程器上執行,因此用來執行查詢的線程總數可以高於指定的 MAXDOP值或邏輯處理器總數。 如需詳細資訊,請參閱排程平行工作。
Considerations
在 Azure SQL Database 和 Fabric 中的 SQL 資料庫中,您可以變更預設的 MAXDOP 值:
一貫的 SQL Server MAXDOP 考慮和建議適用於 Azure SQL Database 和 Fabric 中的 SQL 資料庫。
建立或重建索引的索引作業,或者卸除叢集索引的索引作業,都需要大量資源。 您可以在
CREATE INDEX或ALTER INDEX陳述式中指定 MAXDOP 索引選項,以覆寫進行索引作業時的資料庫 MAXDOP 值。 MAXDOP 值會在執行時套用至陳述式,且不會儲存在索引中繼資料內。 如需詳細資訊,請參閱 設定平行索引作業。除了查詢和索引作業之外,MAXDOP 的資料庫範圍組態選項也會控制其他可使用平行執行的語句平行處理原則,例如
DBCC CHECKTABLE、DBCC CHECKDB和DBCC CHECKFILEGROUP。
Recommendations
變更資料庫的 MAXDOP 可能會對查詢效能和資源使用率造成正面和負面的重大影響。 不過,並沒有適合所有工作負載的單一 MAXDOP 值。 設定 MAXDOP 的建議有細微差異,並取決於許多因素。
某些尖峰並行工作負載在使用不同的 MAXDOP 時,可能會運作得比其他工作負載更好。 正確設定的 MAXDOP 應降低效能和可用性事件的風險,在某些情況下,可以避免不必要的資源使用率來降低成本,進而縮減為較低的服務目標。
過度平行
較高的 MAXDOP 通常會減少需要大量 CPU 的查詢持續時間。 然而,過多的平行運算可能會耗盡其他查詢的 CPU 和工作執行緒資源,進一步導致其他同時工作負載效能惡化。 在極端情況下,過度的平行處理原則可能會耗用所有資料庫或彈性集區資源,因而造成查詢逾時、錯誤和應用程式中斷。
Tip
我們建議客戶避免將 MAXDOP 設定為 0,即使目前看似沒有造成問題。
當同時處理的要求數量超過服務目標所提供的 CPU 和工作執行緒資源所能支援時,過度的平行處理會引發最嚴重的問題。 為了降低因資料庫擴展或未來硬體組態提供相同資料庫服務目標時可能出現的潛在問題風險,應避免使用 MAXDOP 0。
修改 MAXDOP
如果您判斷與預設值不同的 MAXDOP 設定最適合您的工作負載,您可以使用 ALTER DATABASE SCOPED CONFIGURATION T-SQL 語句。 如需範例,請參閱下面的使用 Transact-SQL 的範例一節。 若要針對您所建立的每個新資料庫,將 MAXDOP 變更為非預設值,請將此步驟新增至您的資料庫部署程序。
如果非預設的 MAXDOP 僅對工作負載中的部分查詢有益,您可以在查詢層級加入 OPTION (MAXDOP) 提示來覆寫 MAXDOP。 如需範例,請參閱 使用 Transact-SQL 的範例。
使用負載測試來徹底測試您的 MAXDOP 設定變更,包括實際的同時查詢負載。
如果有不同的 MAXDOP 設定適用於您的讀寫和唯讀工作負載,則可以獨立設定主要和次要複本的 MAXDOP。 這適用於 Azure SQL Database 讀取向外延展、 地理複寫 和 超大規模資料庫服務層級 的次要複本。 依預設,所有次要複本都會繼承主要複本的 MAXDOP 設定。
Permissions
ALTER DATABASE SCOPED CONFIGURATION 陳述式必須以伺服器管理員、資料庫角色 db_owner 的成員,或已被授與 ALTER ANY DATABASE SCOPED CONFIGURATION 權限的使用者身分執行。
Examples
當選擇AdventureWorksLT選項以建立新的單一資料庫時,這些範例會使用最新的SAMPLE範例資料庫。
PowerShell
MAXDOP 資料庫範圍設定
此範例示範如何使用 ALTER DATABASE SCOPED CONFIGURATION 陳述式將 MAXDOP 設定設為 2。 此設定會立即套用至新的查詢。 PowerShell Cmdlet Invoke-SqlCmd 會執行要設定的 T-SQL 查詢,並傳回 MAXDOP 資料庫範圍設定。
$dbName = "sample"
$serverName = <server name here>
$serveradminLogin = <login here>
$serveradminPassword = <password here>
$desiredMAXDOP = 8
$params = @{
'database' = $dbName
'serverInstance' = $serverName
'username' = $serveradminLogin
'password' = $serveradminPassword
'outputSqlErrors' = $true
'query' = 'ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = ' + $desiredMAXDOP + ';
SELECT [value] FROM sys.database_scoped_configurations WHERE [name] = ''MAXDOP'';'
}
Invoke-SqlCmd @params
此範例適用於已啟用讀取縮放複本、異地複寫和 Azure SQL 資料庫超大規模次要複本的 Azure SQL 資料庫。 例如,主要複本的預設 MAXDOP 與次要複本不同,以因應讀寫和只讀工作負載之間可能存在的差異。
$dbName = "sample"
$serverName = <server name here>
$serveradminLogin = <login here>
$serveradminPassword = <password here>
$desiredMAXDOP_primary = 8
$desiredMAXDOP_secondary_readonly = 1
$params = @{
'database' = $dbName
'serverInstance' = $serverName
'username' = $serveradminLogin
'password' = $serveradminPassword
'outputSqlErrors' = $true
'query' = 'ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = ' + $desiredMAXDOP_primary + ';
ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET MAXDOP = ' + $desiredMAXDOP_secondary_readonly + ';
SELECT [value], value_for_secondary FROM sys.database_scoped_configurations WHERE [name] = ''MAXDOP'';'
}
Invoke-SqlCmd @params
Transact-SQL
你可以使用 Azure SQL 資料庫的 Azure 入口查詢編輯器、SQL Server Management Studio (SSMS)、Visual Studio Code 的 MSSQL 擴充功能,或 Fabric 入口網站的 SQL 查詢編輯器來執行 T-SQL 查詢。
開啟新的查詢視窗。
連線至您想要變更 MAXDOP 的資料庫。 您無法變更
master資料庫中的資料庫範圍設定。複製下列範例並將其貼到查詢視窗中,然後選取 [執行]。
MAXDOP 資料庫範圍設定
此範例說明如何使用 sys.database_scoped_configurations 系統目錄檢視,判斷目前資料庫的 MAXDOP 資料庫範圍設定。
SELECT [value] FROM sys.database_scoped_configurations WHERE [name] = 'MAXDOP';
此範例示範如何使用 ALTER DATABASE SCOPED CONFIGURATION 陳述式將 MAXDOP 設定設為 8。 此設定會立即生效。
ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 8;
此範例適用於已啟用讀取縮放複本、異地複寫和超大規模次要複本的 Azure SQL 資料庫。 例如,主要複本會設定為與次要複本不同的 MAXDOP,預期讀寫和只讀工作負載之間可能會有差異。 所有語句都會在主要副本上執行。
value_for_secondary 的 sys.database_scoped_configurations 資料行包含次要複本的設定。
ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 8;
ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET MAXDOP = 1;
SELECT [value], value_for_secondary FROM sys.database_scoped_configurations WHERE [name] = 'MAXDOP';
MAXDOP 查詢提示
此範例示範如何使用查詢提示來執行查詢,以強制 max degree of parallelism 設為 2。
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM SalesLT.SalesOrderDetail
WHERE UnitPrice < 5
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (MAXDOP 2);
GO
MAXDOP 索引選項
此範例示範如何使用索引選項來重建索引,以強制 max degree of parallelism 設為 12。
ALTER INDEX ALL ON SalesLT.SalesOrderDetail
REBUILD WITH
( MAXDOP = 12
, SORT_IN_TEMPDB = ON
, ONLINE = ON);