Verificar o progresso de alterar o índice reorganizar / reconstruir

17

Como posso verificar o progresso / status quando envio uma alteração de reorganização / reconstrução?

nojetlag
fonte
1
Por progresso, você quer dizer quantas linhas de índices ele verificou e quanto resta? Eu não acho que você pode fazer isso. Sua melhor aposta é a de monitor está usando sys.dm_exec_requests DMV
shanky

Respostas:

16

É realmente difícil dizer quanto tempo sua reconstrução levará, pois o próprio SQL realmente não sabe com antecedência e não pode fornecer uma estimativa.

Você pode usar a consulta a seguir para usar o dm_exec_requests dmv para visualizar por quanto tempo a reconstrução do índice está ocorrendo e para verificar se o SQL realmente não tem uma estimativa:

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')

No entanto, quando se trata de uma estimativa real do tempo necessário, você pode ler este belo post no sqlmunkee, que resume isso dizendo ".. depende".

E como não estamos todos no mesmo hardware, usando o mesmo software ou olhando para os mesmos dados, a resposta tem que ser ... depende

Frustrante, mas verdadeiro, infelizmente.

Reaces
fonte
2
Obrigado pelo bom script, tive que ajustar a cláusula where para 'DBCC', mas recebi algumas informações de volta, dizendo que a porcentagem concluída é 6,42 e o ETA Min é de cerca de 707 (que é para uma partição). Vou ficar de olho nisso até que ponto isso vai acontecer. Irá verificar o post também.
nojetlag
isso funciona para reconstruções ONLINE também?
Simon_Weaver
1
@Simon_Weaver Deve fazer sim.
Reage
Isso funciona apenas para REORGANIZAR. Não funciona para REBUILD. Consulte a coluna "percent_complete" no URL a seguir para obter uma lista completa de onde ele funciona. A coluna extended_completion_time se enquadra na mesma categoria, mas não está documentada como tal porque é "Somente interno". docs.microsoft.com/en-us/sql/relational-databases/…
Jeff Moden
4

Eu consegui encontrar esta postagem no blog com um script mágico que supostamente executa a tarefa, não é possível verificar porque isso parece não funcionar para o SQL Server 2014 que estou executando, blocos de consulta aguardando um bloqueio compartilhado. Talvez alguém ache isso útil, então vou deixar aqui.

;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
evictednoise
fonte
1

Achei a resposta aceita acima boa, mas falta algo crucial: status do comando (por exemplo, o comando está bloqueado)

Essa seleção simples mostra o status frontal e central:

SELECT percent_complete, *
FROM sys.dm_exec_requests
WHERE session_id = <session id of alter index>
Jonesome Restabelecer Monica
fonte