Làm cách nào để kiểm tra tiến độ của DBCC SHRINKFILE?


31

Có cách nào để tìm hiểu tiến trình của DBCC SHRINKFILEtuyên bố?

Đây là cách tôi đang chạy nó

dbcc cofile ('main_data', 250000)

Tôi đang chạy câu lệnh trên trên cả SQL Server 2005 và 2008.

[CẬP NHẬT] Đây là truy vấn tôi đã chạy để kiểm tra tiến trình và văn bản đang được chạy.

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

Câu trả lời:


33

Bạn đã kiểm tra phần trăm_complete trong sys.dm_exec numquests chưa?


Hiện đang kiểm tra cách đọc dữ liệu được trả về từ DMV đó.
dance2die

14

Câu trả lời của Aaron là đúng chỗ, nhưng tôi muốn cảnh báo bạn về việc chạy tập tin dữ liệu bị thu hẹp vì nó gây ra các vấn đề hiệu suất khủng khiếp. Tôi đã từng sở hữu mã thu nhỏ, vì vậy tôi biết những gì tôi đang nói về. Kiểm tra bài đăng trên blog này tôi đã viết ngày hôm qua cho bạn thấy ý nghĩa của tôi và tư vấn cách thực hiện thu nhỏ mà không thực sự thu nhỏ: Tại sao bạn không nên thu nhỏ tệp dữ liệu của mình

Hi vọng điêu nay co ich!

PS Một điều nữa để kiểm tra xem có mất nhiều thời gian không và phần trăm_complete không tăng - hãy tìm cách chặn. Shrink sẽ vô hạn - chờ khóa mà nó cần.


4
"Tôi đã từng sở hữu mã thu nhỏ, vì vậy tôi biết những gì tôi đang nói về." tốt đẹp!
splattne

1
Mất rất nhiều thời gian để thu nhỏ tệp dữ liệu 600G ... Tôi sẽ đọc nó và xem xét sử dụng phân mảnh chỉ mục. Cảm ơn Paul!
dance2die

1
Hãy nhớ rằng tôi đã tìm thấy câu trả lời này vì tôi đang tìm kiếm tiến trình trên DBCC SHRINKFILE (MyFile, EMPTYFILE) ... Tôi đang di chuyển dữ liệu giữa các ổ đĩa bằng cách thêm một tệp vào filegroup trên ổ đĩa mới, làm trống bản gốc và thả nó.
Sam Saffron

Tài khoản Tương tự với khối lượng shink nhỏ hơn (một số MB hoặc lớn hơn (1 GB)). sys.dm_exec numquests liên tục hiển thị hoạt động vô tận, thay đổi các khóa tài nguyên trong khi đồng thời Perc_completion thu hút khoảng 32,8%. Tại thời điểm này, tôi hủy bỏ quá trình và chính thức ăn mừng thành công - biết rằng SOMETHING vẫn đang diễn ra ... có ý kiến ​​gì không? 2008r2
Magier

Liên kết đến bài đăng trên blog bị hỏng, điều này dường như có hiệu lực ngay bây giờ: sqlskills.com/bloss/paul/ Khăn
Jonathan Gilbert

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
Có thể hữu ích khi bao gồm một mô tả về những gì mã của bạn làm trong câu trả lời của bạn
BE77Y

+1 cho một truy vấn xuất sắc, nhưng -1 để lặp lại những gì OP đã nói sáu năm sau thực tế. Nếu một số câu hỏi của bạn tốt hơn truy vấn của anh ấy, vui lòng mô tả nó, nếu không, nó chỉ lãng phí không gian.

5

Truy vấn bên dưới sẽ hiển thị cho bạn kết quả như thế này: theo dõi trạng thái thu nhỏ 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

Thêm phiên bản của riêng tôi cho bất kỳ ai quan tâm, điều này sẽ chuyển đổi các cột thời gian millsecond thành phút và giây dễ đọc hơn.

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

-1

Hoặc bạn chỉ có thể chạy exec sp_who3.


2
Điều này sẽ cần một lời giải thích tốt hơn.
Sven

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.