检查变更索引重组/重建的进度


17

提交变更索引重新组织/重建时,如何检查进度/状态?


1
通过进度,您是指它检查了多少行索引以及剩余多少行?我不认为你可以做到。最好的选择是监视是否正在使用DMV sys.dm_exec_requests
Shanky

Answers:


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上的一篇不错的博客文章,该文章通过说“ ..it取决于”来进行总结:

而且由于我们并非都使用相同的硬件,使用相同的软件或查看相同的数据,因此答案必须是……..这取决于

令人沮丧,但事实如此,令人遗憾。


2
感谢漂亮的脚本,我不得不将where子句调整为'DBCC',但随后我得到了一些信息,说完成百分比为6.42,而ETA Min约为707(用于一个分区)。我将密切关注这一过程的进展。还将检查该职位。
nojetlag

这对ONLINE重建也有效吗?
Simon_Weaver

1
@Simon_Weaver应该做。
收起

这仅适用于REORGANIZE。它不适用于REBUILD。请查看以下网址的“ percent_complete”列,以获取其工作位置的完整列表。estimate_completion_time列属于同一类别,但未作相应记录,因为它是“仅限内部使用”。docs.microsoft.com/en-us/sql/relational-databases/…–
杰夫·

4

我设法找到了一个带有magick脚本的博客文章,据称该脚本完成了该任务,无法检查,因为这似乎不适用于我正在运行的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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.