Überprüfen Sie den Fortschritt der Reorganisation / Neuerstellung des Änderungsindex


17

Wie kann ich den Fortschritt / Status überprüfen, wenn ich einen Änderungsindex reorganisiere / neu aufbaue?


1
Mit Fortschritt ist gemeint, wie viele Indexzeilen geprüft wurden und wie viel noch übrig ist. Ich glaube nicht, dass du es schaffst. Ihre beste Wette auf Monitor verwendet DMV sys.dm_exec_requests
Shanky

Antworten:


16

Es ist wirklich schwer zu sagen, wie lange Ihre Neuerstellung dauern wird, da SQL selbst es im Voraus nicht genau weiß und Ihnen keine Schätzung geben kann.

Mit der folgenden Abfrage können Sie die dm_exec_requests-dmv verwenden, um anzuzeigen, wie lange die Indexwiederherstellung gedauert hat, und um zu überprüfen, ob in SQL tatsächlich keine Schätzung vorhanden ist:

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

Wenn es jedoch um eine echte Schätzung des Zeitaufwands geht, können Sie diesen schönen Blog-Beitrag lesen von sqlmunkee lesen, der dies mit den Worten "..es hängt davon ab" zusammenfasst:

Und da wir nicht alle auf derselben Hardware, mit derselben Software oder mit denselben Daten arbeiten, muss die Antwort lauten: Das hängt davon ab

Frustrierend, aber wahr, traurig.


2
Vielen Dank für das nette Skript, ich musste die where-Klausel an 'DBCC' anpassen, bekam dann aber einige Informationen zurück, die besagten, dass der Prozentsatz 6,42 beträgt und die ETA-Min bei 707 liegt (was für eine Partition gilt). Ich werde ein Auge darauf haben, wie weit dies noch gehen wird. Überprüft auch den Beitrag.
Nojetlag

Funktioniert dies auch für ONLINE-Neuerstellungen?
Simon_Weaver

1
@ Simon_Weaver Sollte ja tun.
Reagiert

Dies funktioniert nur bei REORGANIZE. Es funktioniert nicht für REBUILD. In der Spalte "percent_complete" unter der folgenden URL finden Sie eine vollständige Liste der Funktionsweisen. Die Spalte "Estimated_completion_time" fällt in dieselbe Kategorie, ist jedoch nicht als solche dokumentiert, da es sich um "Internal Only" handelt. docs.microsoft.com/en-us/sql/relational-databases/…
Jeff Moden

4

Ich habe es geschafft, diesen Blog-Beitrag mit einem Magick-Skript zu finden, das angeblich die Aufgabe erledigt. Ich kann es nicht überprüfen, da dies für den von mir ausgeführten SQL Server 2014 anscheinend nicht funktioniert. Fragen Sie Blöcke ab, die auf eine gemeinsame Sperre warten. Vielleicht findet es jemand nützlich, also lasse ich es einfach hier.

;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

1

Ich fand die akzeptierte Antwort oben gut, aber es fehlt eine entscheidende Sache: Befehlsstatus (z. B. ist der Befehl blockiert)

Diese einfache Auswahl zeigt den Status vorne und in der Mitte:

SELECT percent_complete, *
FROM sys.dm_exec_requests
WHERE session_id = <session id of alter index>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.