Connaître le temps estimé pour une opération longue (DBCC, Backup, Restore, etc...)

Qui n'a pas attendu devant son écran après avoir lancé une commande (DBCC, Backup, Restore ou rollback volumineux), sans avoir idée du temps que cela va prendre ?

En fait, une information existe bien dans la DMV sys.dm_exec_requests. Voyons comment l'utiliser...

La DMV sys.dm_exec_requests possède plusieurs colonnes intéressantes pour nous répondre :

  • percent_complete
  • total_elapsed_time
  • estimated_completion_time

Ces informations vont pouvoir nous indiquer (de manière très approximative) où nous en sommes et combien de temps il reste pour exécuter certains types de commandes de longue durée :

  •     ALTER INDEX REORGANIZE
  •     Option AUTO_SHRINK avec ALTER DATABASE
  •     BACKUP DATABASE
  •     DBCC CHECKDB
  •     DBCC CHECKFILEGROUP
  •     DBCC CHECKTABLE
  •     DBCC INDEXDEFRAG
  •     DBCC SHRINKDATABASE
  •     DBCC SHRINKFILE
  •     RECOVERY
  •     RESTORE DATABASE,
  •     ROLLBACK
  •     TDE ENCRYPTION

La requête suivante va nous permettre d'obtenir les informations sur les tâches longues en cours :

SELECT
session_id, status
, command
, DB_NAME(database_id) AS DBName
, start_time AS [Start Time]
, estimated_completion_time / 3600000 AS [Estimated Completion Time (Hours)]
, total_elapsed_time / 60000 AS [Elapsed Time (Minutes)]
, CAST(percent_complete AS DECIMAL(5,2)) AS [Percent Complete]
FROM sys.dm_exec_requests
WHERE command = 'DbccFilesCompact' OR command = 'BACKUP DATABASE' OR command = 'RESTORE DATABASE' OR command = 'DbccSpaceReclaim'
OR percent_complete > 0

Malheureusement, cette information est très approximative et il peut souvent arriver qu'une tâche (un DBCC SHRINKFILE par exemple) reste figée des heures sur un pourcentage...