Controlla l'avanzamento della modifica dell'indice riorganizza / ricostruisci


17

Come posso controllare l'avanzamento / lo stato quando invio un indice alter riorganizza / ricostruisci?


1
Per progresso intendi quante righe di indici ha controllato e quanto rimane? Non penso che tu possa farlo. La tua scommessa migliore è monitorare usando DMV sys.dm_exec_requests
Shanky,

Risposte:


16

È davvero difficile dire quanto tempo richiederà la ricostruzione, dato che SQL stesso non lo sa in anticipo e non può darti una stima.

È possibile utilizzare la query seguente per utilizzare il dmv dm_exec_requests per visualizzare da quanto tempo dura la ricostruzione dell'indice e per verificare che SQL non abbia realmente una stima:

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

Tuttavia, quando si tratta di una vera stima del tempo richiesto, è possibile leggere questo post sul blog di sqlmunkee, che riassume questo dicendo ".. dipende.":

E poiché non siamo tutti sullo stesso hardware, utilizzando lo stesso software o guardando gli stessi dati, la risposta deve essere ... dipende

Frustrante, ma vero, purtroppo.


2
Grazie per il bel copione, ho dovuto adattare la clausola where a 'DBCC', ma poi ho ottenuto alcune informazioni, dicendo che la percentuale di completamento è 6.42 e che il minimo ETA è circa 707 (che è per una partizione). Lo terrò d'occhio su quanto lontano sarà. Controllerà anche il post.
nojetlag,

funziona anche per le ricostruzioni ONLINE?
Simon_Weaver

1
@Simon_Weaver Dovrebbe fare sì.
Reagisce

Questo funziona solo per REORGANIZE. Non funziona per REBUILD. Vedere la colonna "percent_complete" al seguente URL per un elenco completo di dove funziona. La colonna stimata_completion_time rientra nella stessa categoria ma non è documentata come tale perché è "Solo interna". docs.microsoft.com/en-us/sql/relational-database/…
Jeff Moden

4

Sono riuscito a trovare questo post sul blog con uno script magick che presumibilmente svolge il compito, non può controllare perché questo sembra non funzionare per SQL Server 2014 che sto eseguendo, blocchi di query in attesa di un blocco condiviso. Forse qualcuno lo troverà utile, quindi lo lascerò qui.

;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

Ho trovato la risposta accettata sopra buona, ma manca una cosa cruciale: stato del comando (ad es. Il comando è bloccato)

Questa semplice selezione mostra lo stato anteriore e centrale:

SELECT percent_complete, *
FROM sys.dm_exec_requests
WHERE session_id = <session id of alter index>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.