Bagaimana cara memeriksa perkembangan DBCC SHRINKFILE?

31

Apakah ada cara untuk mengetahui perkembangan DBCC SHRINKFILEpernyataan?

Beginilah cara saya menjalankannya

dbcc shrinkfile ('main_data', 250000)

Saya menjalankan pernyataan di atas pada SQL Server 2005 dan 2008.

[PEMBARUAN] Ini adalah kueri yang saya jalankan untuk memeriksa progres dan teks yang sedang dijalankan.

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
dance2die
sumber

Jawaban:

33

Sudahkah Anda memeriksa persen_lengkap di sys.dm_exec_requests?

Aaron Alton
sumber
Saat ini memeriksa cara membaca data yang dikembalikan dari DMV itu.
dance2die
14

Jawaban Harun sangat tepat, tetapi saya ingin mengingatkan Anda agar tidak menjalankan menyusutkan file data karena menyebabkan masalah kinerja yang mengerikan. Saya dulu memiliki kode menyusut, jadi saya tahu apa yang saya bicarakan. Lihat postingan blog ini yang saya tulis kemarin yang menunjukkan kepada Anda apa yang saya maksud dan menyarankan cara melakukan menyusut tanpa benar-benar melakukan menyusut: Mengapa Anda tidak boleh menyusutkan file data Anda

Semoga ini membantu!

PS Satu hal lagi untuk memeriksa apakah perlu waktu lama dan persen_lengkap tidak bertambah - cari pemblokiran. Kecilkan akan tak terbatas-tunggu kunci yang dibutuhkan.

Paul Randal
sumber
4
"Dulu aku memiliki kode menyusut, jadi aku tahu apa yang aku bicarakan." bagus!
splattne
1
Butuh selamanya untuk menyusutkan file data 600G ... Saya akan membacanya dan mempertimbangkan untuk menggunakan indeks defrag. Terima kasih paul!
dance2die
1
perlu diingat saya menemukan jawaban ini karena saya mencari kemajuan di DBCC SHRINKFILE (MyFile, EMPTYFILE) ... Saya memindahkan data antar drive dengan menambahkan file ke filegroup pada drive baru, mengosongkan yang asli dan menjatuhkannya.
Sam Saffron
@ Paul, saya amati bahwa menyusutkan file ke ukuran target membutuhkan waktu tetapi selesai (saya melihatnya melihat ukuran file) -tapi meskipun TAMPAKNYA harus diselesaikan dengan sukses, proses shinking masih berlanjut dan berjalan selamanya. Sama dengan volume shink yang lebih kecil (beberapa MB atau lebih besar (1 GB)). sys.dm_exec_requests terus-menerus menunjukkan aktivitas tanpa akhir, mengubah kunci sumber daya sementara pada saat yang sama persen_kesempurnaan menghabiskan sekitar 32,8%. Pada titik ini saya MEMBATALKAN proses dan secara resmi merayakan keberhasilan - mengetahui bahwa SESUATU masih berjalan ... ada ide apa yang salah? 2008r2
Magier
Tautan ke posting blog rusak, ini tampaknya valid sekarang: sqlskills.com/blogs/paul/…
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')
Francisco Figueiredo
sumber
2
Mungkin bermanfaat untuk menyertakan deskripsi tentang apa yang kode Anda lakukan dalam jawaban Anda
BE77Y
+1 untuk kueri yang sangat baik, tetapi -1 untuk mengulangi apa yang OP katakan enam tahun setelah fakta. Jika pertanyaan Anda lebih baik daripada pertanyaannya, tolong jelaskan, jika tidak, itu hanya ruang kosong.
5

Kueri di bawah ini akan menampilkan hasil seperti ini: lacak status menyusut 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%'
Mark Varnas
sumber
3

Menambahkan versi saya sendiri untuk siapa pun yang tertarik, ini mengubah kolom waktu millsecond menjadi menit dan detik yang lebih mudah dibaca.

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
pengguna5947282
sumber
-1

Atau Anda bisa menjalankan exec sp_who3.

darotweiler
sumber
2
Ini akan membutuhkan penjelasan yang lebih baik.
Sven