Sql-Server
並行執行 sys.dm_db_index_physical_stats
我正在嘗試獲取一些超過 500 GB 的表的碎片資訊,並且我正在
...DETAILED
使用sys.dm_db_index_physical_stats
. 我在我們的 pre-Prod 伺服器上的生產數據庫的恢復副本上執行此操作,因此我不在乎損害伺服器上的任何性能。我執行了它,它看起來像是在串列執行並且它需要永遠。有沒有辦法
dm_db_index_physical_stats()
並行執行?還是有其他設置干擾它?我猜在 SQL Server 2014
DBCC 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 表值函式