Existe-t-il un moyen de connaître les progrès de DBCC SHRINKFILE
déclaration?
Voici comment je le dirigeais
dbcc shrinkfile ('main_data', 250000)
J'exécute la déclaration ci-dessus sur SQL Server 2005 et 2008.
[UPDATE] Voici la requête que j'ai exécutée pour vérifier la progression et le texte en cours d'exécution.
select T.text, R.Status, R.Command, DatabaseName = db_name(R.database_id)
, R.cpu_time, R.total_elapsed_time, R.percent_complete
from sys.dm_exec_requests R
cross apply sys.dm_exec_sql_text(R.sql_handle) T
Avez-vous vérifié percent_complete dans sys.dm_exec_requests?
La réponse d'Aaron est juste, mais je voudrais vous mettre en garde contre l'exécution de la réduction du fichier de données car cela provoque d'horribles problèmes de performances. J'étais propriétaire du code de réduction, donc je sais de quoi je parle. Consultez ce billet de blog que j'ai écrit hier qui vous montre ce que je veux dire et vous conseille comment effectuer une réduction sans réellement effectuer une réduction: Pourquoi vous ne devriez pas réduire vos fichiers de données
J'espère que cela t'aides!
PS Une dernière chose pour vérifier si cela prend du temps et si le pourcentage_complet n'augmente pas - recherchez le blocage. Shrink attendra infiniment les verrous dont il a besoin.
La requête ci-dessous vous montrera le résultat comme ceci: track dbcc shrink status
-------------------------------
--Track DBCC shrink status
-------------------------------
select
a.session_id
, command
, b.text
, percent_complete
, done_in_minutes = a.estimated_completion_time / 1000 / 60
, min_in_progress = DATEDIFF(MI, a.start_time, DATEADD(ms, a.estimated_completion_time, GETDATE() ))
, a.start_time
, estimated_completion_time = DATEADD(ms, a.estimated_completion_time, GETDATE() )
from sys.dm_exec_requests a
CROSS APPLY sys.dm_exec_sql_text(a.sql_handle) b
where command like '%dbcc%'
SELECT
d.name,
percent_complete,
session_id,
start_time,
status,
command,
estimated_completion_time,
cpu_time,
total_elapsed_time
FROM
sys.dm_exec_requests E left join
sys.databases D on e.database_id = d.database_id
WHERE
command in ('DbccFilesCompact','DbccSpaceReclaim')
Ajouter ma propre version pour toute personne intéressée, cela convertit les colonnes de temps en millisecondes en minutes et secondes plus lisibles.
select
[status],
start_time,
convert(varchar,(total_elapsed_time/(1000))/60) + 'M ' + convert(varchar,(total_elapsed_time/(1000))%60) + 'S' AS [Elapsed],
convert(varchar,(estimated_completion_time/(1000))/60) + 'M ' + convert(varchar,(estimated_completion_time/(1000))%60) + 'S' as [ETA],
command,
[sql_handle],
database_id,
connection_id,
blocking_session_id,
percent_complete
from sys.dm_exec_requests
where estimated_completion_time > 1
order by total_elapsed_time desc