¿Cómo puedo verificar el progreso / estado cuando envío una reorganización / reconstrucción de índice alter?
¿Cómo puedo verificar el progreso / estado cuando envío una reorganización / reconstrucción de índice alter?
Respuestas:
Es realmente difícil decir cuánto tiempo llevará su reconstrucción, ya que el SQL en sí mismo no lo sabe de antemano y no puede darle una estimación.
Puede usar la siguiente consulta para usar dm_exec_requests dmv para ver cuánto tiempo ha estado funcionando su reconstrucción de índice y para verificar que SQL realmente no tiene una estimación:
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')
Sin embargo, cuando se trata de una estimación real del tiempo requerido, puede leer esta bonita publicación de blog de sqlmunkee, que resume esto diciendo "..depende":
Y dado que no todos estamos en el mismo hardware, usando el mismo software o mirando los mismos datos, la respuesta tiene que ser ... depende
Frustrante, pero cierto, tristemente.
Logré encontrar esta publicación de blog con un script mágico que supuestamente hace la tarea, no puedo verificarlo porque parece que esto no funciona para SQL Server 2014 que estoy ejecutando, bloques de consulta esperando un bloqueo compartido. Tal vez alguien lo encuentre útil, así que lo dejaré aquí.
;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
Encontré la respuesta aceptada arriba buena, pero me falta algo crucial: estado del comando (por ejemplo, ¿está bloqueado el comando?)
Esta simple selección muestra el estado frontal y central:
SELECT percent_complete, *
FROM sys.dm_exec_requests
WHERE session_id = <session id of alter index>