我正在尝试在超过500 GB的几个表上获取碎片信息,并且我使用的是sys.dm_db_index_physical_stats的D1选项。我是在产品前服务器上的生产数据库的还原副本上这样做的,所以我不关心会损害服务器上的任何性能。
我运行了它,它看起来像是在连续运行,而且要花费很长时间。有没有一种并行运行dm_db_index_physical_stats()的方法?或者其他环境是否干扰了它?
我想DBCC TRACEON (8649)和OPTION(USE HINT('ENABLE_PARALLEL_PLAN_PREFERENCE'))在Server 2014中不可用。
也尝试了DBCC SETCPUWEIGHT(1000);从保罗怀特的博客这里。博客提到并行性抑制剂,其中之一是系统表。dm_db_index_physical_stats()被认为是一个系统表吗?
发布于 2020-01-29 09:11:05
sys.dm_db_index_physical_stats 是一个系统表值函数。
在内部,这将执行对内部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关于这些内部数据源的更多信息,这里。
您可以在执行计划中找到相同的INDEXANALYSIS TVF调用:

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

因此,由于原因1:系统表访问,查询将无法使用并行性。
列表在不同版本之间都会发生变化,但是,例如,在Server 2012上的整个计划都是连续的:
由于第二条理由:多语句TVF,TVF调用也将是串行的。
这些查询功能是需要在
https://dba.stackexchange.com/questions/258395
复制相似问题