変更インデックスの再編成/再構築の進行状況を確認する


17

変更インデックスの再編成/再構築を送信するときに、進行状況/ステータスを確認するにはどうすればよいですか?


1
進行状況とは、チェックしたインデックスの行数と残りの量を意味しますか?できるとは思わない。あなたの最善の策は、モニターにあるDMVのsys.dm_exec_requests使用している
Shanky

回答:


16

SQL自体は事前にはわからず、見積もりを提供できないため、再構築にかかる時間を言うのは非常に困難です。

次のクエリを使用してdm_exec_requests dmvを使用して、インデックスの再構築が行われている時間を表示し、SQLに実際の推定値がないことを確認できます。

SELECT r.session_id,r.command,CONVERT(NUMERIC(6,2),r.percent_complete)
AS [Percent Complete],CONVERT(VARCHAR(20),DATEADD(ms,r.estimated_completion_time,GetDate()),20) AS [ETA Completion Time],
CONVERT(NUMERIC(10,2),r.total_elapsed_time/1000.0/60.0) AS [Elapsed Min],
CONVERT(NUMERIC(10,2),r.estimated_completion_time/1000.0/60.0) AS [ETA Min],
CONVERT(NUMERIC(10,2),r.estimated_completion_time/1000.0/60.0/60.0) AS [ETA Hours],
CONVERT(VARCHAR(1000),(SELECT SUBSTRING(text,r.statement_start_offset/2,
CASE WHEN r.statement_end_offset = -1 THEN 1000 ELSE (r.statement_end_offset-r.statement_start_offset)/2 END)
FROM sys.dm_exec_sql_text(sql_handle)))
FROM sys.dm_exec_requests r WHERE command IN ('Alter Index')

ただし、必要な時間の実際の見積もりになると、sqlmunkeeからこの素敵なブログ投稿を読むことができます。

そして、私たち全員が同じハードウェア上にいるわけではなく、同じソフトウェアを使用しているわけでも、同じデータを見ているわけでもないので、答えは…でなければなりません。

欲求不満ですが、残念ながら本当です。


2
すばらしいスクリプトのおかげで、where句を「DBCC」に調整する必要がありましたが、完了率は6.42で、ETA最小は約707(1つのパーティションの場合)であるという情報が返ってきました。私はこれがどれだけ遠くなるかを見守っていきます。投稿も確認します。
nojetlag

これはオンライン再構築でも機能しますか?
Simon_Weaver

1
@Simon_Weaverはい。
Reaces

これは、REORGANIZEでのみ機能します。REBUILDでは機能しません。動作する場所の完全なリストについては、次のURLの「percent_complete」列を参照してください。expected_completion_time列は同じカテゴリに分類されますが、「内部のみ」であるため、そのようには文書化されていません。docs.microsoft.com/en-us/sql/relational-databases/...
ジェフMODEN

4

このブログ記事は、タスクを実行すると言われているマジックスクリプトで見つけることができました。これは、実行中のSQL Server 2014、共有ブロックを待機しているクエリブロックでは機能しないようです。誰かが便利だと思うかもしれないので、ここに置いておきます。

;WITH cte AS
(
SELECT
object_id,
index_id,
partition_number,
rows,
ROW_NUMBER() OVER(PARTITION BY object_id, index_id, partition_number ORDER BY partition_id) as rn
FROM sys.partitions
)
SELECT
   object_name(cur.object_id) as TableName,
   cur.index_id,
   cur.partition_number,
   PrecentDone =
      CASE
         WHEN pre.rows = 0 THEN 0
      ELSE
         ((cur.rows * 100.0) / pre.rows)
      END,
   pre.rows - cur.rows as MissingRows
FROM cte as cur
INNER JOIN cte as pre on (cur.object_id = pre.object_id) AND (cur.index_id = pre.index_id) AND (cur.partition_number = pre.partition_number) AND (cur.rn = pre.rn +1)
ORDER BY 4

1

上記の受け入れられた答えは良かったが、重要なことを見逃していた:コマンドステータス(たとえば、コマンドがブロックされている)

この単純な選択は、ステータスの前面と中央を示します。

SELECT percent_complete, *
FROM sys.dm_exec_requests
WHERE session_id = <session id of alter index>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.