Sql-Server

並行執行 sys.dm_db_index_physical_stats

  • January 29, 2020

我正在嘗試獲取一些超過 500 GB 的表的碎片資訊,並且我正在...DETAILED使用sys.dm_db_index_physical_stats. 我在我們的 pre-Prod 伺服器上的生產數據庫的恢復副本上執行此操作,因此我不在乎損害伺服器上的任何性能。

我執行了它,它看起來像是在串列執行並且它需要永遠。有沒有辦法dm_db_index_physical_stats()並行執行?還是有其他設置干擾它?

我猜在 SQL Server 2014DBCC TRACEON (8649)OPTION(USE HINT('ENABLE_PARALLEL_PLAN_PREFERENCE'))不可用。

DBCC SETCPUWEIGHT(1000);也從 Paul White 的部落格中嘗試。該部落格提到了並行抑制器,其中之一是系統表。算不算dm_db_index_physical_stats()系統表?

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:系統表訪問,查詢將無法使用並行性

列表會隨著版本的變化而變化,但例如這些事情使整個計劃在 SQL Server 2012 上連續:

  • 系統表訪問(例如從 sys.tables 讀取)

由於原因**#2** ,TVF 呼叫也將是串列的:Multi statement TVF

這些查詢功能是需要在

  • 多語句 T-SQL 表值函式

來源

引用自:https://dba.stackexchange.com/questions/258395