blog.Mainzer Datenfabrik

Wie verfolge ich den Fortschritt des Befehls CREATE INDEX?

cover image of blog article 'Wie verfolge ich den Fortschritt des Befehls CREATE INDEX?'

Wie können Sie den Fortschritt überprüfen beim Erstellen eines Indexes?

  • !! Sie müssen SET STATISTICS PROFILE ON hinzufügen. oder SET STATISTICS XML ON; In dem Abfrage-Batch, der den CREATE INDEX ausführt (und vor der CREATE INDEX-Anweisung steht, falls dies nicht offensichtlich war), werden in dieser DMV für diese SPID / session_id keine Zeilen angezeigt !!
  • Der IN-Operator wird verwendet, um die Indexeinfügezeile herauszufiltern, die, falls enthalten, die TotalRows-Werte erhöht, wodurch die Berechnungen verzerrt werden, da in dieser Zeile keine verarbeiteten Zeilen angezeigt werden.
  • Die hier angezeigte Zeilenzahl (dh TotalRows) ist doppelt so hoch wie die Zeilenzahl der Tabelle, da zwei Schritte ausgeführt werden, von denen jeder für alle Zeilen ausgeführt wird: der erste ist ein “Table Scan” oder “Clustered Index Scan” und der zweite ist die “Sortierung”. Sie sehen “Table Scan”, wenn Sie einen Clustered Index oder einen NonClustered Index auf einem Heap erstellen. Sie sehen “Clustered Index Scan”, wenn Sie einen NonClustered Index für einen Clustered Index erstellen.
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;