web-dev-qa-db-ja.com

sys.dm_db_index_physical_statsを並行して実行する

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()はシステムテーブルと見なされますか?

3
jesijesi
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呼び出しを実行プランで見つけることができます:

enter image description here

また、それが複数ステートメントのテーブル値関数であることもわかります。

enter image description here

したがって、クエリは理由により並列処理を使用できません#1:システムテーブルアクセス

リストはバージョンごとに異なりますが、たとえば次のようにすると、SQL Server 2012でプラン全体がシリアルになります。

  • ...

  • システムテーブルアクセス(sys.tablesからの読み取りなど)

TVFコールも理由によりシリアルになります#2:マルチステートメントTVF

これらのクエリ機能は、シリアルゾーンを必要とする例です

  • ...

  • マルチステートメントT-SQLテーブル値関数

ソース

5
Randi Vertongen