Comprobar el progreso de alterar índice reorganizar / reconstruir

17

¿Cómo puedo verificar el progreso / estado cuando envío una reorganización / reconstrucción de índice alter?

nojetlag
fuente
1
Por progreso, ¿quiere decir cuántas filas de índices ha verificado y cuánto queda? No creo que puedas hacerlo. Su mejor opción es monitorear usando DMV sys.dm_exec_requests
Shanky

Respuestas:

16

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.

Reaces
fuente
2
Gracias por la buena secuencia de comandos, tuve que ajustar la cláusula where a 'DBCC' pero luego obtuve información, diciendo que el porcentaje completado es 6.42 y el ETA Min es de alrededor de 707 (que es para una partición). Lo vigilaré sobre cuán lejos estará esto. Verificará la publicación también.
nojetlag
¿Funciona esto también para reconstrucciones en línea?
Simon_Weaver
1
@Simon_Weaver debería hacer sí.
Recurre
Esto solo funciona para REORGANIZAR. No funciona para RECONSTRUIR. Consulte la columna "percent_complete" en la siguiente URL para obtener una lista completa de dónde funciona. La columna tiempo estimado de finalización cae en la misma categoría pero no está documentada como tal porque es "Solo interno". docs.microsoft.com/en-us/sql/relational-databases/…
Jeff Moden
4

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
ruido desahuciado
fuente
1

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>
Jonesome restablecer monica
fuente