配置并行索引操作

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Microsoft Fabric 中的 SQL 数据库

本文定义最大并行度,并介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中修改此设置。

在运行 SQL Server Enterprise 或更高版本的多处理器系统上,索引语句可能使用多个处理器(CPU)来执行与索引语句关联的扫描、排序和索引作,就像其他查询一样。 用于运行单个索引语句的 CPU 数由最大并行度服务器配置选项、当前工作负荷以及索引统计信息决定。

max degree of parallelism 选项决定了执行并行计划时使用的最大处理器数。 如果 SQL Server 数据库引擎检测到系统正忙,则在语句执行开始之前将自动降低索引操作并行度。 如果非分区索引的第一个键列包含有限数量的非重复值,或者每个非重复值的出现频率变化较大,数据库引擎也可能会降低并行度。 有关详细信息,请参阅查询处理体系结构指南

Note

并行索引作在每个 SQL Server 版本中都不可用。 有关详细信息,请参阅 SQL Server 2022 的版本及其支持的功能

局限性

  • 查询优化器使用的处理器数量通常能够提供最佳的性能。 但是,有些操作(如创建、重新生成或删除很大的索引)占用大量资源,在索引操作期间会造成没有足够的资源供其他应用程序和数据库操作使用。

    出现此问题时,您可以通过限制用于索引操作的处理器数,手动配置用于运行索引语句的最大处理器数。

  • 指数选项 MAXDOP 仅替代指定该选项的查询的最大并行度配置选项。 下表列出了可以使用最大并行度配置选项和 MAXDOP 索引选项指定的有效整数值。

    Value Description
    0 指定服务器根据当前系统工作负荷确定所使用的 CPU 数目。 这是默认值,还是推荐设置。
    1 取消生成并行计划。 操作是串行执行的。
    2-64 将处理器的数量限制为指定的值。 根据当前工作负荷,可以使用更少的处理器。 如果指定的值大于可用的 CPU 数量,将使用实际可用的 CPU 数量。
  • 并行索引执行和 MAXDOP 索引选项适用于以下 Transact-SQL 语句:

  • MAXDOP不能在ALTER INDEX (...) REORGANIZE语句中指定索引选项。

  • 如果查询优化器将并行度应用于生成操作,则需要排序的已分区索引操作的内存需求可能会很大。 并行度越高,内存需求就越大。 有关详细信息,请参阅已分区表和已分区索引

Permissions

要求具有对表或视图的 ALTER 权限。

使用 SQL Server Management Studio

在索引上设置最大并行度

  1. 在对象资源管理器中,选择加号以展开包含您要为其索引设置最大并行度的表所在的数据库。

  2. 展开 “表” 文件夹。

  3. 选择加号以展开要设置索引最大并行度的表。

  4. 展开 “索引” 文件夹。

  5. 右键单击要为其设置最大并行度的索引,然后选择“属性”

  6. “选择页”下,选择 “选项”

  7. 选择 “最大并行度”,然后输入 1 和 64 之间的某个值。

  8. 选择“确定”

使用 Transact-SQL

对现有索引设置最大并行度

  1. “对象资源管理器” 中,连接到 数据库引擎的实例。

  2. 在标准栏上,选择“新建查询” 。

  3. 将以下示例复制并粘贴到查询窗口中,然后选择 执行。 此代码更改 IX_ProductVendor_VendorID 表上的 Purchasing.ProductVendor 索引,这样,如果服务器具有 8 个或更多处理器,数据库引擎会将索引作的执行限制为 8 个或更少的处理器。

    USE AdventureWorks2022;
    GO
    
    ALTER INDEX IX_ProductVendor_VendorID
        ON Purchasing.ProductVendor REBUILD WITH(MAXDOP = 8);
    GO
    

有关详细信息,请参阅 ALTER INDEX

创建新索引时指定最大并行度

  1. “对象资源管理器” 中,连接到 数据库引擎的实例。

  2. 在标准栏上,选择“新建查询” 。

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

    USE AdventureWorks2022;
    GO
    
    CREATE INDEX IX_ProductVendor_NewVendorID
        ON Purchasing.ProductVendor(BusinessEntityID) WITH (MAXDOP = 8);
    GO