在 Azure SQL 数据库中配置最大并行度 (MAXDOP)

适用于:Azure SQL 数据库

本文介绍了 Azure SQL 数据库中的最大并行度 (MAXDOP) 配置设置。

注意

此内容重点介绍了 Azure SQL 数据库。 Azure SQL 数据库基于 Microsoft SQL Server 数据库引擎的最新稳定版本,所以许多内容是相似的,除了故障排除和配置选项有所不同。 有关 SQL Server 和 Azure SQL 托管实例中的 MAXDOP 的详细信息,请参阅 “配置最大并行度服务器配置选项”。

MAXDOP 控制数据库引擎中的查询内并行度。 MAXDOP 值较高通常会使每个查询的并行线程数更多,查询执行速度更快。

在 Azure SQL 数据库中,对于每个新的单一数据库和弹性池数据库,默认的 MAXDOP 设置均为 8。 此默认设置可防止利用不必要的资源,同时仍允许数据库引擎使用并行线程更快地执行查询。 通常不需要在 Azure SQL 数据库工作负荷中进一步配置 MAXDOP,尽管它可能会作为高级性能优化练习提供好处。

注意

2020 年 9 月,基于 Azure SQL 数据库服务多年的遥测数据,MAXDOP 8 被选为新数据库的默认值,作为适合各种客户工作负载的最佳值。 此默认值有助于防止并行度过高导致的性能问题。 在此之前,新数据库的默认设置为 MAXDOP 0。 对于在 2020 年 9 月之前创建的现有数据库,未自动更改 MAXDOP。

通常情况下,如果数据库引擎选择并行执行查询,则执行时间将更短。 但并行度过高可能会消耗额外的处理器资源,且不会提高查询性能。 从规模上看,并行度过高可能会对同一数据库引擎实例上执行的所有查询的查询性能产生负面影响。 传统上,在 SQL Server 工作负载中,设置并行度上限是一项常见的性能优化操作。

下表描述了在执行具有不同 MAXDOP 值的查询时,数据库引擎的行为:

MAXDOP 行为
= 1 数据库引擎使用单个串行线程来执行查询。 不使用并行线程。
> 1 数据库引擎将并行线程使用的附加计划程序数设置为 MAXDOP 值或逻辑处理器总数,以较小者为准。
= 0 数据库引擎将并行线程使用的附加计划程序数设置为逻辑处理器总数或 64,以较小者为准。

注意

每个查询使用至少一个计划程序和该计划程序上的一个工作线程执行。

以并行方式执行的查询使用附加计划程序和附加并行线程。 由于多个并行线程可能在同一计划程序上执行,因此用于执行查询的线程总数可以高于指定的 MAXDOP 值或逻辑处理器总数。 有关详细信息,请参阅计划并行任务

注意事项

  • 在 Azure SQL 数据库中,可以更改默认的 MAXDOP 值:

    • 在查询级别,使用 MAXDOP 查询提示
    • 在数据库级别,请使用 MAXDOP 数据库范围的配置
  • 有一些长期适用于 Azure SQL 数据库的 SQL Server MAXDOP 注意事项和建议

  • 索引操作(如创建或重新生成索引、或删除聚集索引)可能会大量占用资源。 可以在 CREATE INDEXALTER INDEX 语句中指定 MAXDOP 索引选项,以替代数据库索引操作的 MAXDOP 值。 MAXDOP 值在执行时应用于语句,但不存储在索引元数据中。 有关详细信息,请参阅 配置并行索引操作

  • 除了查询和索引作外,MAXDOP 的数据库范围配置选项还控制可以使用并行执行的其他语句的并行度,例如 DBCC CHECKTABLEDBCC CHECKDB以及 DBCC CHECKFILEGROUP

建议

更改数据库的 MAXDOP 会对查询性能和资源利用率产生重大影响,正面和负面的影响都有。 但并没有一个适合所有工作负载的最佳 MAXDOP 值。 MAXDOP 的设置建议是比较精细化的,具体取决于诸多因素。

某些峰值并发工作负荷在使用不同的 MAXDOP 时,可能运行得更好。 正确配置的 MAXDOP 应降低性能和可用性事件的风险,在某些情况下,可以通过避免不必要的资源利用率来降低成本,从而缩减到较低的服务目标。

并行度过高

较高的 MAXDOP 通常可缩短 CPU 密集型查询的持续时间。 但并行度过高会使其他查询得不到 CPU 和工作线程资源,从而使其他并发工作负载性能降低。 在极端情况下,并行度过高可能会占用所有数据库或弹性池资源,导致查询超时、错误和应用程序中断。

提示

建议客户避免将 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 数据库读取扩展异地复制超大规模服务层级次要副本。 默认情况下,所有次要副本都继承主副本的 MAXDOP 配置。

权限

必须以服务器管理员、具有数据库角色 ALTER DATABASE SCOPED CONFIGURATION 的成员或已获得 db_owner 权限的用户的身份执行 ALTER ANY DATABASE SCOPED CONFIGURATION 语句。

示例

当为新的单个数据库选择SAMPLE选项时,这些示例使用最新的AdventureWorksLT示例数据库。

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 数据库。 例如,主副本和辅助副本被设置为不同的默认 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 数据库、SQL Server Management Studio(SSMS)Azure Data StudioAzure 门户查询编辑器来执行 T-SQL 查询。

  1. 打开一个新的查询窗口。

  2. 连接到要更改 MAXDOP 的数据库。 你无法更改 master 数据库中数据库范围的配置。

  3. 将以下示例复制并粘贴到查询窗口中,然后选择“执行”。

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_secondarysys.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);

后续步骤