如何检查 DBCC SHRINKFILE 的进度?

dan*_*die 47 shrink sql-server sql-server-2005 sql-server-2008

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

这是我运行它的方式

dbcc 收缩文件('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
Run Code Online (Sandbox Code Playgroud)

Aar*_*ton 43

您是否检查过 sys.dm_exec_requests 中的 percent_complete?


Pau*_*dal 18

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

希望这可以帮助!

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

  • “我曾经拥有收缩代码,所以我知道我在说什么。” 好的! (5认同)

小智 12

下面的查询将显示如下结果: 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%'
Run Code Online (Sandbox Code Playgroud)


小智 7

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

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
Run Code Online (Sandbox Code Playgroud)


小智 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')
Run Code Online (Sandbox Code Playgroud)

  • 在答案中包含对代码功能的描述可能会有所帮助 (2认同)