如何检查DBCC SHRINKFILE的进度?

有没有办法找出DBCC SHRINKFILE语句的进度?

这是我如何运行它

dbcc shrinkfile('main_data',250000)

我在SQL Server 2005和2008上运行上述语句。

[更新]这里是我运行查询进度和正在运行的文本的查询。

 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 

你有没有在sys.dm_exec_requests中检查percent_complete?

Aaron的答案是现货,但我想告诫你不要运行数据文件缩小,因为它会导致可怕的性能问题。 我曾经拥有收缩代码,所以我知道我在说什么。 结帐这个博客文章,我昨天写了,告诉你我的意思,并build议如何实现收缩,而不是实际收缩: 为什么你不应该收缩你的数据文件

希望这可以帮助!

PS还有一件事要检查是否需要很长时间,并且percent_complete没有增加 – 寻找阻塞。 收缩将无限 – 等待它需要的锁。

 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') 

为任何感兴趣的人添加我自己的版本,这将毫秒时间列转换为更可读的分秒。

 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 

下面的查询将显示如下结果: 跟踪dbcc收缩状态

 ------------------------------- --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%'