并行运行 sys.dm_db_index_physical_stats

jes*_*esi 3 performance index sql-server sql-server-2014

我试图让它们超过500 GB几张桌子碎片信息中,我使用...DETAILED的选项sys.dm_db_index_physical_stats。我在我们的预生产服务器上的生产数据库的还原副本上执行此操作,因此我不关心损害服务器上的任何性能。

我运行了它,看起来它正在串行运行,并且需要永远。有没有办法dm_db_index_physical_stats()并行运行?或者是否有任何其他设置干扰它?

我想DBCC TRACEON (8649)并且OPTION(USE HINT('ENABLE_PARALLEL_PLAN_PREFERENCE'))在 SQL Server 2014 中不可用。

还试图DBCC SETCPUWEIGHT(1000);从保罗·怀特的博客在这里。该博客提到了并行抑制器,其中之一是系统表。被dm_db_index_physical_stats()认为是系统表吗?

Ran*_*gen 5

sys.dm_db_index_physical_stats 
Run Code Online (Sandbox Code Playgroud)

是系统表值函数。

在内部,这将执行对内部INDEXANALYSIS系统数据源的 openrowset 调用。

create function [sys].[dm_db_index_physical_stats]
(
    @DatabaseId         SMALLINT        = 0,
    @ObjectId           INT             = 0,
    @IndexId            INT             = -1,
    @PartitionNumber    INT             = 0,
    @Mode               nvarchar(20)    = NULL
)
returns table
as
    return select *
        from OpenRowset
        (   TABLE
            INDEXANALYSIS,
            @DatabaseId,
            @ObjectId,
            @IndexId,
            @PartitionNumber,
            @Mode
        )
GO
Run Code Online (Sandbox Code Playgroud)

有关这些内部数据源的更多信息,请访问此处

您可以INDEXANALYSIS在执行计划中找到相同的TVF 调用:

在此处输入图片说明

你也可以看到它是一个多语句表值函数。

在此处输入图片说明

因此,由于原因#1:系统表访问,查询将无法使用并行性

该列表随版本而变化,但例如这些事情使整个计划在 SQL Server 2012 上连续:

  • ...

  • 系统表访问(例如从 sys.tables 读取)

由于原因#2,TVF 调用也将是串行的:多语句 TVF

这些查询功能是需要序列区的示例

  • ...

  • 多语句 T-SQL 表值函数

来源