SQL Server 2014, Ed Padrão
Eu li que percent_complete em dm_exec_requests não funciona para CREATE INDEX e, na prática, percent_complete fica em 0. Então isso não ajuda.
Atualmente uso o método abaixo, que pelo menos me mostra movimento (que a criação do índice não está bloqueada). Mas não faço ideia se estou %10 no processo ou %99.
Eu tentei o método descrito aqui: https://dba.stackexchange.com/a/102545/6229 , mas ele mostra um tempo de conclusão claramente errado (basicamente mostra 'agora' para um processo de mais de 60 minutos em que estou 10 minutos )
Como posso obter uma pista?
SELECT percent_complete, estimated_completion_time, reads, writes, logical_reads, text_size, *
FROM
sys.dm_exec_requests AS r
WHERE
r.session_id <> @@SPID
AND r.session_id = 58
Eu acho que a consulta a seguir, pelo menos, chegará bem perto. Ele faz uso de um DMV que foi introduzido no SQL Server 2014: sys.dm_exec_query_profiles (e obrigado a Martin Smith por me apresentar por meio deste DBA.StackExchange relacionado Resposta: Progresso da instrução SELECT INTO :-).
Observe:
!! Você precisará adicionar
SET STATISTICS PROFILE ON;
ouSET STATISTICS XML ON;
no lote de consulta que está fazendo oCREATE INDEX
(e colocado antes daCREATE INDEX
instrução, se isso não for óbvio), senão nenhuma linha aparecerá neste DMV para esse SPID /session_id
!!O
IN
operador é usado para filtrar aIndex Insert
linha que, se incluída, aumentará osTotalRows
valores, o que distorcerá os cálculos, pois essa linha nunca mostra nenhuma linha processada.A contagem de linhas exibida aqui (ou seja,
TotalRows
) é o dobro da contagem de linhas da tabela devido à operação ter duas etapas, cada uma operando em todas as linhas: a primeira é uma "Varredura de tabela" ou "Varredura de índice agrupado" e a segunda é o tipo". Você verá "Table Scan" ao criar um índice clusterizado ou criar um índice não clusterizado em um heap. Você verá "Verificação de índice clusterizado" ao criar um índice não clusterizado em um índice clusterizado.Esta consulta parece não funcionar ao criar índices filtrados. Por algum motivo, os Índices Filtrados a) não possuem a etapa "Classificar" e b) orow_count
campo nunca aumenta de 0.Não tenho certeza do que eu estava testando antes, mas meus testes agora indicam que os índices filtrados são capturados por essa consulta. Doce. Embora apenas tome cuidado com a contagem de linhas pode estar desativada (vou ver se consigo consertar isso algum dia).
Ao criar um índice clusterizado em um heap que já possui índices não clusterizados, os índices não clusterizados precisam ser reconstruídos (para trocar o RID -- RowID -- pela(s) chave(s) de índice clusterizado), e cada reconstrução de índice não clusterizado será ser uma operação separada e, portanto, não refletida nas estatísticas retornadas por essa consulta durante a criação do Índice Agrupado.
Esta consulta foi testada em relação a:
ALTER TABLE [schema_name].[table_name] REBUILD;
( somente o Clustered Index aparece ao usar este método )ALTER INDEX ALL ON [schema_name].[table_name] REBUILD;
ALTER INDEX [index_name] ON [schema_name].[table_name] REBUILD;
Saída de amostra:
Acho que podemos remover a variável @SPID com uma referência a sys.dm_exec_requests:
Como este tópico parece ainda estar ativo, achei que valeria a pena observar que o uso das novas operações de índice retomáveis no SQL Server 2019 e no Azure SQL DB (no modo de compatibilidade 150) fornece essa funcionalidade. A exibição de catálogo sys.index_resumable_operations tem uma coluna percent_complete que indica o andamento.
Além de poder monitorar a criação e a reconstrução do índice, as operações de índice retomáveis também ajudam dividindo a operação em pequenos pedaços que são confirmados à medida que a operação avança. Isso ajuda a manter o log de transações pequeno e também pode ajudar com coisas como Grupos de Disponibilidade, pois a operação pode ser replicada para qualquer servidor secundário. Com as operações de índice retomáveis, você pode retomar a criação ou reconstrução do índice no novo servidor primário após um failover sem perder o progresso e, como as transações são confirmadas ao longo do caminho, você não terá o problema de fazer backup de sincronização durante operações de índice longas .
Para expandir Bruce Pratt: Vamos agrupar por session_id para que possamos ver o progresso de vários comandos Create Index executados em paralelo.