Wanneer is die restore klaar?

Onlangs kostte het mij grote moeite een database backup te kopieren naar een ontwikkel server. Deze backup (een SQLSafe backup van 80GB) kon ik niet over het netwerk kopieren (kreeg insufficient resources na een bepaalde tijd). Uiteindelijk is de backup op naar een andere server gekopieerd. Vanaf de originele ontwikkelserver heb ik toen de restore gestart. Tijdens de restore is het handig op te weten hoever dit proces is en hoelang het nog gaat duren. Vanaf MSSQL 2005 is deze informatie uit de view sys.dm_exec_requests te halen.

In deze view staan een aantal kolommen die deze informatie kunnen weergeven:
percent_complete
Dit geeft aan hoeveel procent het process is gevorderd
estimated_completion_time
Dit is het aantal geschatte milliseconden dat het nog duurt voordat het proces klaar is. Met behulp van de functie DATEADD kan de eindtijd berekend worden: SELECT DATEADD(ms, estimated_completion_time, CURRENT_TIMESTAMP)
Met deze 2 kolommen kunnen een aantal nieuwe gegevens gegenereerd worden:
Tijd die nog nodig is
Dit is de eindtijd minus de huidige tijd
Looptijd tot nu toe
dit is de huidige tijd minus de begintijd
Benodigde tijd
Dit is de eindtijd minus de begintijd
Als je voor bovengenoemde gegevens de DATEDIFF functie gebruikt, kun jezelf bepalen in welke eenheid dit wordt weergegeven.
Voorbeeld van een script wat processen weergeeft met een geschatte eindtijd:

with CTE
as (
select session_id
, UPPER(command) as [operation]
, cast(t.text as XML) as sql_text
, wait_type
, percent_complete
, start_time
, dateadd(ms, estimated_completion_time, getdate()) as end_time
from  sys.dm_exec_requests a
CROSS  APPLY sys.dm_exec_sql_text(a.sql_handle) AS t
where  percent_complete > 0
)
select session_id
, [operation]
, sql_text
, wait_type
, percent_complete
, start_time
, end_time
, datediff(second, getdate(), end_time) as sec_remaining
, datediff(second, start_time, getdate()) sec_running
, datediff(second, start_time, end_time) as sec_needed
from  cte;