Surveiller les opérations longues

Lorsque nous créons un index sur une table volumineuse, l'opération risque d'être longue et par défaut nous n'avons aucune information sur son avancement avant qu'elle ne se termine.

Même chose pour une opération de shrink de fichiers (DBCC SHRINKFILE), une sauvegarde ou une restauration

Mais il existe des solutions...

Index et requêtes longues

Pour voir ce qui se passe pendant l'indexation, nous pouvons utiliser la vue de management dynamique sys.dm_exec_query_profiles, qui existe depuis SQL Server 2014.

Pour que cette vue soit alimentée au fil de l'eau, il faut activer l'option de session STATISTIC PROFILE avant de lancer sa construction d'index :
 

SET STATISTICS PROFILE ON

-- Create now index
CREATE INDEX MyBigIndex ON MyVeryBigTable ...

Il nous sera alors possible de surveiller l'avancement avec la requête suivante :

SELECT session_id,
       request_id,
       physical_operator_name,
       node_id,
       thread_id,
       row_count,
       estimate_row_count
FROM sys.dm_exec_query_profiles
ORDER BY node_id DESC,
         thread_id;

Le résultat donne ceci pendant la création d'index (qui a un parallélisme limité à MAXDOP = 2) :

A noter que c'est aussi utilisable pour des requêtes longues...

Shrink, backup, restore

Pour suivre l'évolution d'un shrinkfile, d'un backup ou d'un restore, la méthode est un peu différente : il existe des colonnes dans la vue sys.dm_exec_requests qui peuvent nous donner une information (bien que ce soit une estimation plus ou moins exacte). La requête suivante peut être utilisée :

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;