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()
认为是系统表吗?
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 表值函数