web-dev-qa-db-ja.com

テーブルに主キーのクラスター化インデックスを削除したときの進行状況を追跡することはできますか?

削除する必要がある大きな主キーのクラスター化インデックスがあります。これを削除すると、非クラスター化インデックス(かなり大きい)でインデックスの再構築もトリガーされると思います。これらのプロセスの進行状況を確認する方法はありますか?

2
J.D.

Enterprise Editionまたは同等のものを使用している場合は、主キーONLINEを削除できます。

ALTER TABLE Production.TransactionHistory
DROP CONSTRAINT PK_TransactionHistory_TransactionID
WITH (ONLINE = ON);

これにより、プロファイラーイベントクラス 進行状況レポート:オンラインインデックス操作 または拡張イベントを使用して進行状況を監視できます。

progress_report_online_index_operation

オンラインインデックスのビルドプロセス中に発生し、ビルド操作の進行状況を示します。オンラインインデックス作成操作の各段階でイベントが生成されます。このイベントを使用して、オンラインインデックスのビルドを監視します。

次のイベントフィールドが提供されます。

progress_report_online_index_operation event fields

3
Paul White 9

SQL Server 2014以降では、クエリプロファイルを使用して CREATE INDEX ステートメントの進行状況を追跡できます。これを使用して、DROP INDEXプロセスに関する進行状況情報を取得することもできます。

具体的には、以下のクエリは、クラスター化インデックスを削除したときに非クラスター化インデックスの更新の進行状況を表示します。HEAPをスキャンする必要があるため、クラスター化インデックスのRIDポインターはクラスター化インデックスの更新後に更新できます。落とした。

SELECT node_id,
    physical_operator_name,
    SUM(row_count) row_count, 
    SUM(estimate_row_count) AS estimate_row_count,
    CAST(SUM(row_count)*100 AS float)/SUM(estimate_row_count)  as estimate_percent_complete
FROM sys.dm_exec_query_profiles   
WHERE session_id=62 --update to session id of session dropping the index
GROUP BY node_id,physical_operator_name
ORDER BY node_id desc;

複数の非クラスター化インデックスがある場合は、「estimate_percent_complete」列が100%複数回ヒットすることに注意してください。また、クエリプロファイルはこのプロセスの情報を返さないため、クラスター化インデックスが削除されている間、スクリプトは最初に行を返しません。

2
HandyD

SQL Server 2016以降では、以下を使用して、処理中の要求の進行状況を追跡できます。

sys.dm_exec_query_statistics_xml

処理中のリクエストのクエリ実行プランを返します。このDMVを使用して、一時的な統計を含むプラン表示XMLを取得します。

構文

sys.dm_exec_query_statistics_xml(session_id)  

議論

session_id検索するバッチを実行するセッションIDです。 session_idsmallintです。 session_idは、次の動的管理オブジェクトから取得できます。

プロファイリングインフラストラクチャの1つを有効にする必要があることに注意してください。

備考

このシステム関数は、SQL Server 2016(13.x)SP1以降で使用できます。参照 KB 3190871

このシステム関数は、標準および軽量クエリ実行統計プロファイリングインフラストラクチャの両方で機能します。詳細については、「 クエリプロファイリングインフラストラクチャ 」を参照してください。

2
Paul White 9