如何检查DBCC SHRINKFILE的进度?


31

有没有办法找出DBCC SHRINKFILE陈述的进度?

这是我的运行方式

dbccrinkfile('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

Answers:



14

Aaron的答案是正确的,但是我想提醒您不要运行数据文件缩小,因为它会导致可怕的性能问题。我曾经拥有收缩代码,所以我知道我在说什么。查看我昨天写的这篇博客文章,向您展示我的意思,并建议如何在不进行实际收缩的情况下实现收缩:为什么不应该收缩数据文件

希望这可以帮助!

PS还要检查一下是否花费很长时间并且percent_complete没有增加-寻找阻塞。收缩将无限等待其所需的锁。


4
“我曾经拥有收缩代码,所以我知道我在说什么。” 真好!
splattne

1
缩小600G数据文件花了很多时间……我将仔细阅读并考虑使用索引碎片整理。谢谢保罗!
dance2die

1
请记住,我找到了这个答案,原因是我在DBCC SHRINKFILE(MyFile,EMPTYFILE)上寻找进度...通过在新驱动器上的文件组中添加文件,清空原始文件并将其删除,我正在驱动器之间移动数据。
山姆·萨弗隆

@Paul,我观察到将文件缩小到目标大小需要一段时间,但可以完成(我看它是在看文件大小),但是尽管成功完成了SEEMS,但闪烁过程仍然继续并且永远运行。较小(某些MB或较大(1 GB)的刷新量)相同。sys.dm_exec_requests持续显示无休止的活动,更改资源锁,同时percent_completion停滞在32.8%左右。在这一点上,我取消了该过程并正式庆祝成功-知道事情还在继续……知道发生了什么事吗?2008r2
Magier

:链接到博客文章被打破,这似乎现在是有效sqlskills.com/blogs/paul/...
乔纳森·吉尔伯特

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

2
在答案中包含对代码作用的描述可能会有所帮助
BE77Y 2015年

+1是一个出色的查询,但-1是重复OP在事实发生六年后所说的内容。如果您的查询在某些方面比他的要好,请描述一下,否则只是浪费空间。

5

下面的查询将显示以下结果: 跟踪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%'

3

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.