it-swarm.com.de

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

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

18
nojetlag

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

Mit der folgenden Abfrage können Sie dm_exec_requests dmv verwenden, um anzuzeigen, wie lange Ihre Indexwiederherstellung durchgeführt wurde, und um zu überprüfen, ob SQL keine Schätzung hat:

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 von sqlmunkee lesen, der dies mit den Worten "..es hängt davon ab" zusammenfasst:

Und da wir nicht alle auf derselben Hardware sind, dieselbe Software verwenden oder dieselben Daten betrachten, muss die Antwort lauten ... es kommt darauf an

Frustrierend, aber wahr, traurig.

17
Reaces

Ich habe es geschafft, diesen Blog-Beitrag mit einem magischen Skript zu finden, das angeblich die Aufgabe erledigt, kann es nicht überprüfen, da dies für SQL Server 2014, das ich ausführe, anscheinend nicht funktioniert. Abfrageblöcke warten auf eine gemeinsame Sperre . 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
4
evictednoise

Ich fand die akzeptierte Antwort oben gut, aber es fehlte 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>