Come posso controllare l'avanzamento / lo stato quando invio un indice alter riorganizza / ricostruisci?
Come posso controllare l'avanzamento / lo stato quando invio un indice alter riorganizza / ricostruisci?
Risposte:
È 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.
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
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>