Jak sprawdzić postęp DBCC SHRINKFILE?

31

Czy istnieje sposób na sprawdzenie postępu DBCC SHRINKFILEwypowiedzi?

Oto jak go uruchomiłem

plik skurczowy dbcc ('main_data', 250000)

Korzystam z powyższej instrukcji zarówno w SQL Server 2005, jak i 2008.

[AKTUALIZACJA] Oto zapytanie, które uruchomiłem, aby sprawdzić postęp i tekst, który jest uruchamiany.

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
źródło

Odpowiedzi:

33

Czy sprawdziłeś wartość procentową w sys.dm_exec_requests?

Aaron Alton
źródło
Obecnie sprawdzam, jak czytać dane zwrócone z tego DMV.
dance2die
14

Odpowiedź Aarona jest natychmiastowa, ale chciałbym ostrzec cię przed uruchomieniem zmniejszania się pliku danych, ponieważ powoduje to straszne problemy z wydajnością. Kiedyś byłem właścicielem kodu skurczowego, więc wiem o czym mówię. Zapoznaj się z tym postem na blogu, który napisałem wczoraj, który pokazuje, co mam na myśli, i doradza, jak dokonać zmniejszenia bez faktycznego zmniejszenia: Dlaczego nie powinieneś zmniejszać plików danych

Mam nadzieję że to pomoże!

PS Jeszcze jedna rzecz, aby sprawdzić, czy zajmuje to dużo czasu, a procent_kompletności nie rośnie - poszukaj blokowania. Shrink będzie się nieskończenie czekał na zamki, których potrzebuje.

Paul Randal
źródło
4
„Byłem właścicielem kodu zmniejszającego, więc wiem o czym mówię”. miły!
splattne
1
Zmniejszenie pliku danych 600G trwało wieczność ... Przeczytam go i rozważę użycie defragmentacji indeksu. Dzięki Paul!
dance2die
1
pamiętaj, że znalazłem tę odpowiedź, ponieważ szukałem postępu w DBCC SHRINKFILE (MyFile, EMPTYFILE) ... Przenoszę dane między dyskami, dodając plik do grupy plików na nowym dysku, opróżniając oryginał i upuszczając go.
Sam Saffron,
@Paul, obserwuję, że zmniejszenie pliku do rozmiaru docelowego zajmuje trochę czasu, ale kończy się (widzę, że patrzy na rozmiar pliku) - ale chociaż wydaje się, że zakończy się powodzeniem, proces migania nadal trwa i trwa wiecznie. To samo z mniejszymi (niektóre MB lub większymi (1 GB) wielkościami shink). sys.dm_exec_requests stale pokazuje niekończącą się aktywność, zmieniając blokady zasobów, a jednocześnie procent_konkurencji zatrzymuje się na poziomie około 32,8%. W tym momencie ANULUJĘ proces i oficjalnie świętuję sukces - wiedząc, że COŚ wciąż idzie ... jakiś pomysł, co jest nie tak? 2008r2
Magier
Link do postu na blogu jest zepsuty, wydaje się, że jest teraz aktualny: 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
źródło
2
Pomocne może być podanie w odpowiedzi opisu tego, co robi Twój kod
BE77Y,
+1 za doskonałe zapytanie, ale -1 za powtórzenie tego, co OP powiedział sześć lat po fakcie. Jeśli twoje zapytanie jest pod pewnymi względami lepsze niż jego, opisz je, w przeciwnym razie to tylko zmarnowane miejsce.
5

Poniższe zapytanie pokaże wynik w następujący sposób: śledź stan zmniejszania 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
źródło
3

Dodanie mojej własnej wersji dla każdego zainteresowanego powoduje konwersję kolumn czasu milisekundowego na bardziej czytelne minuty i sekundy.

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
użytkownik5947282
źródło
-1

Lub możesz po prostu uruchomić exec sp_who3.

darotweiler
źródło
2
To wymagałoby lepszego wyjaśnienia.
Sven