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では使用できないと思います。
Paul WhiteのブログのDBCC SETCPUWEIGHT(1000);
も試してみた here 。このブログでは、並列処理の阻害要因について言及しており、その1つがシステムテーブルです。 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からの読み取りなど)
TVFコールも理由によりシリアルになります#2:マルチステートメントTVF
これらのクエリ機能は、シリアルゾーンを必要とする例です
...
マルチステートメントT-SQLテーブル値関数