AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 139191
Accepted
Jonesome Reinstate Monica
Jonesome Reinstate Monica
Asked: 2016-05-22 23:25:52 +0800 CST2016-05-22 23:25:52 +0800 CST 2016-05-22 23:25:52 +0800 CST

SQL Server: Como acompanhar o progresso do comando CREATE INDEX?

  • 772

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
sql-server index
  • 4 4 respostas
  • 61100 Views

4 respostas

  • Voted
  1. Best Answer
    Solomon Rutzky
    2016-05-23T22:08:28+08:002016-05-23T22:08:28+08:00

    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;ou SET STATISTICS XML ON;no lote de consulta que está fazendo o CREATE INDEX(e colocado antes da CREATE INDEXinstrução, se isso não for óbvio), senão nenhuma linha aparecerá neste DMV para esse SPID / session_id !!

    • O INoperador é usado para filtrar a Index Insertlinha que, se incluída, aumentará os TotalRowsvalores, 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) o row_countcampo 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:

      • Criando:
        • Índices não clusterizados em um heap
        • um índice agrupado (não existem índices não agrupados)
        • Índices não agrupados no índice/tabela agrupados
        • um índice clusterizado quando já existem índices não clusterizados
        • Índices não clusterizados exclusivos no índice/tabela clusterizados
      • Reconstruindo (tabela com índice clusterizado e um índice não clusterizado; testado no SQL Server 2014, 2016, 2017 e 2019) por meio de:
        • 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;
    DECLARE @SPID INT = 51;
    
    ;WITH agg AS
    (
         SELECT SUM(qp.[row_count]) AS [RowsProcessed],
                SUM(qp.[estimate_row_count]) AS [TotalRows],
                MAX(qp.last_active_time) - MIN(qp.first_active_time) AS [ElapsedMS],
                MAX(IIF(qp.[close_time] = 0 AND qp.[first_row_time] > 0,
                        [physical_operator_name],
                        N'<Transition>')) AS [CurrentStep]
         FROM sys.dm_exec_query_profiles qp
         WHERE qp.[physical_operator_name] IN (N'Table Scan', N'Clustered Index Scan',
                                               N'Index Scan',  N'Sort')
         AND   qp.[session_id] = @SPID
    ), comp AS
    (
         SELECT *,
                ([TotalRows] - [RowsProcessed]) AS [RowsLeft],
                ([ElapsedMS] / 1000.0) AS [ElapsedSeconds]
         FROM   agg
    )
    SELECT [CurrentStep],
           [TotalRows],
           [RowsProcessed],
           [RowsLeft],
           CONVERT(DECIMAL(5, 2),
                   (([RowsProcessed] * 1.0) / [TotalRows]) * 100) AS [PercentComplete],
           [ElapsedSeconds],
           (([ElapsedSeconds] / [RowsProcessed]) * [RowsLeft]) AS [EstimatedSecondsLeft],
           DATEADD(SECOND,
                   (([ElapsedSeconds] / [RowsProcessed]) * [RowsLeft]),
                   GETDATE()) AS [EstimatedCompletionTime]
    FROM   comp;
    

    Saída de amostra:

                            Rows                 Percent   Elapsed  Estimated    Estimated
    CurrentStep  TotalRows  Processed  RowsLeft  Complete  Seconds  SecondsLeft  CompletionTime
    -----------  ---------  ---------  --------  --------  -------  -----------  --------------
    Clustered    11248640   4786937    6461703   42.56     4.89400  6.606223     2016-05-23
    Index Scan                                                                   14:32:40.547
    
    • 95
  2. Bruce Pratt
    2020-09-04T12:20:48+08:002020-09-04T12:20:48+08:00

    Acho que podemos remover a variável @SPID com uma referência a sys.dm_exec_requests:

    ;WITH agg AS
    (
         SELECT SUM(qp.[row_count]) AS [RowsProcessed],
                SUM(qp.[estimate_row_count]) AS [TotalRows],
                MAX(qp.last_active_time) - MIN(qp.first_active_time) AS [ElapsedMS],
                MAX(IIF(qp.[close_time] = 0 AND qp.[first_row_time] > 0,
                        [physical_operator_name],
                        N'<Transition>')) AS [CurrentStep]
         FROM sys.dm_exec_query_profiles qp
         WHERE qp.[physical_operator_name] IN (N'Table Scan', N'Clustered Index Scan',
                                               N'Index Scan',  N'Sort')
         AND   qp.[session_id] IN (SELECT session_id from sys.dm_exec_requests where command IN ( 'CREATE INDEX','ALTER INDEX','ALTER TABLE') )
    ), comp AS
    (
         SELECT *,
                ([TotalRows] - [RowsProcessed]) AS [RowsLeft],
                ([ElapsedMS] / 1000.0) AS [ElapsedSeconds]
         FROM   agg
    )
    SELECT [CurrentStep],
           [TotalRows],
           [RowsProcessed],
           [RowsLeft],
           CONVERT(DECIMAL(5, 2),
                   (([RowsProcessed] * 1.0) / [TotalRows]) * 100) AS [PercentComplete],
           [ElapsedSeconds],
           (([ElapsedSeconds] / [RowsProcessed]) * [RowsLeft]) AS [EstimatedSecondsLeft],
           DATEADD(SECOND,
                   (([ElapsedSeconds] / [RowsProcessed]) * [RowsLeft]),
                   GETDATE()) AS [EstimatedCompletionTime]
    FROM   comp;
    
    • 12
  3. Pam Lahoud
    2020-02-20T13:42:56+08:002020-02-20T13:42:56+08:00

    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 .

    • 8
  4. Glenn Sontheimer
    2022-01-25T08:37:47+08:002022-01-25T08:37:47+08:00

    Para expandir Bruce Pratt: Vamos agrupar por session_id para que possamos ver o progresso de vários comandos Create Index executados em paralelo.

    ;WITH agg AS
    (
         SELECT qp.session_id, SUM(qp.[row_count]) AS [RowsProcessed],
                SUM(qp.[estimate_row_count]) AS [TotalRows],
                MAX(qp.last_active_time) - MIN(qp.first_active_time) AS [ElapsedMS],
                MAX(IIF(qp.[close_time] = 0 AND qp.[first_row_time] > 0,
                        [physical_operator_name],
                        N'<Transition>')) AS [CurrentStep]
         FROM sys.dm_exec_query_profiles qp
         WHERE qp.[physical_operator_name] IN (N'Table Scan', N'Clustered Index Scan',
                                               N'Index Scan',  N'Sort')
         AND   qp.[session_id] IN (SELECT session_id from sys.dm_exec_requests where command IN ( 'CREATE INDEX','ALTER INDEX','ALTER TABLE') )
         group by qp.session_id
    ), comp AS
    (
         SELECT *,
                ([TotalRows] - [RowsProcessed]) AS [RowsLeft],
                ([ElapsedMS] / 1000.0) AS [ElapsedSeconds]
         FROM   agg
    )
    SELECT session_id,
            [CurrentStep],
           [TotalRows],
           [RowsProcessed],
           [RowsLeft],
           CONVERT(DECIMAL(5, 2),
                   (([RowsProcessed] * 1.0) / [TotalRows]) * 100) AS [PercentComplete],
           [ElapsedSeconds],
           (([ElapsedSeconds] / [RowsProcessed]) * [RowsLeft]) AS [EstimatedSecondsLeft],
           DATEADD(SECOND,
                   (([ElapsedSeconds] / [RowsProcessed]) * [RowsLeft]),
                   GETDATE()) AS [EstimatedCompletionTime]
    FROM   comp;
    
    • 0

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quanto "Padding" coloco em meus índices?

  • Como determinar se um Índice é necessário ou necessário

  • O que significa "índice" em RDBMSs? [fechado]

  • Como criar um índice condicional no MySQL?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve