DBCC SHRINKFILEの進捗を確認する方法は?


31

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

回答:



14

Aaronの答えはすぐにわかりますが、ひどいパフォーマンスの問題を引き起こすので、データファイルの縮小を実行しないように注意してください。私は以前シュリンクコードを所有していたので、私が話していることを知っています。私が昨日書いたこのブログ投稿をチェックしてください。私が意味することを示し、実際にシュリンクを行わずにシュリンクを行う方法をアドバイスします。データファイルを圧縮しない理由

お役に立てれば!

PS時間がかかり、percent_completeが増加していないかどうかを確認するもう1つのこと-ブロックを探します。シュリンクは、必要なロックを無限に待ちます。


4
「私は以前シュリンクコードを所有していたので、私が話していることを知っています。」いいね!
飛び散る

1
600Gデータファイルの圧縮には永遠に時間がかかりました...これを読み直し、インデックスデフラグの使用を検討します。ポールありがとう!
dance2die 2009年

1
DBCC SHRINKFILE(MyFile、EMPTYFILE)の進捗状況を探していたため、この答えが見つかったことに留意してください...新しいドライブのファイルグループにファイルを追加し、元のファイルを空にしてドロップすることで、ドライブ間でデータを移動しています。
サムサフラン

@ポール、私はファイルを目標サイズに縮小するのに時間がかかるが、完了していることを観察しています(ファイルサイズを見るとわかります)-しかし、SEEMSが正常に完了するとはいえ、輝きのプロセスはまだ続き、永遠に実行されます。小さい(数MBまたは大きい(1 GB)量の光沢ボリューム)でも同じです。sys.dm_exec_requestsは継続的に無限のアクティビティを示し、リソースロックを変更すると同時に、percent_completionが約32,8%で止まっています。この時点で、プロセスをキャンセルし、成功を公式に祝います。SOMETHINGがまだ進行中であることを知って...何が間違っているのでしょうか。2008r2
マジエ

ブログ記事へのリンクが有効であるために、この表示され壊れている: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

優れたクエリの場合は+1ですが、事後6年でOPが言ったことを繰り返す場合は-1です。クエリが何らかの点で彼よりも優れている場合は、それを説明してください。それ以外の場合は、無駄なスペースです。

5

以下のクエリでは、次のような結果が表示されます 。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%'

3

興味のある人のために自分のバージョンを追加すると、millsecondの時間列がより読みやすい分と秒に変換されます。

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.