
Wie können Sie den Fortschritt überprüfen beim Erstellen eines Indexes?
- !! Sie müssen
SET STATISTICS PROFILE ON
hinzufügen. oderSET STATISTICS XML ON;
In dem Abfrage-Batch, der denCREATE INDEX
ausführt (und vor derCREATE 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;