Sprawdź postęp reorganizacji / przebudowy indeksu zmian

17

Jak mogę sprawdzić postęp / status po przesłaniu reorganizacji / przebudowy indeksu zmian?

nojetlag
źródło
1
Przez postęp rozumiesz, ile wierszy indeksów sprawdził i ile pozostało? Nie sądzę, że możesz to zrobić. Najlepszym rozwiązaniem jest monitorowanie za pomocą DMV sys.dm_exec_requests
Shanky

Odpowiedzi:

16

Naprawdę trudno jest powiedzieć, ile czasu zajmie przebudowa, ponieważ sam SQL tak naprawdę nie wie z góry i nie może dać oszacowania.

Możesz użyć następującego zapytania, aby użyć dm_exec_requests dmv, aby zobaczyć, jak długo trwa przebudowa indeksu i sprawdzić, czy SQL tak naprawdę nie ma oszacowania:

SELECT r.session_id,r.command,CONVERT(NUMERIC(6,2),r.percent_complete)
AS [Percent Complete],CONVERT(VARCHAR(20),DATEADD(ms,r.estimated_completion_time,GetDate()),20) AS [ETA Completion Time],
CONVERT(NUMERIC(10,2),r.total_elapsed_time/1000.0/60.0) AS [Elapsed Min],
CONVERT(NUMERIC(10,2),r.estimated_completion_time/1000.0/60.0) AS [ETA Min],
CONVERT(NUMERIC(10,2),r.estimated_completion_time/1000.0/60.0/60.0) AS [ETA Hours],
CONVERT(VARCHAR(1000),(SELECT SUBSTRING(text,r.statement_start_offset/2,
CASE WHEN r.statement_end_offset = -1 THEN 1000 ELSE (r.statement_end_offset-r.statement_start_offset)/2 END)
FROM sys.dm_exec_sql_text(sql_handle)))
FROM sys.dm_exec_requests r WHERE command IN ('Alter Index')

Jednak jeśli chodzi o rzeczywiste oszacowanie wymaganego czasu, możesz przeczytać ten fajny post na blogu od sqlmunkee, który podsumowuje to mówiąc „..to zależy”.:

A ponieważ nie wszyscy jesteśmy na tym samym sprzęcie, używamy tego samego oprogramowania lub oglądamy te same dane, odpowiedź musi być…

Frustrujące, ale prawdziwe, niestety.

Reaces
źródło
2
Dzięki za ładny skrypt, musiałem dostosować klauzulę where do „DBCC”, ale potem otrzymałem trochę informacji, mówiąc, że procent ukończenia wynosi 6,42, a ETA Min to około 707 (co dotyczy jednej partycji). Będę miał na oku, jak daleko to będzie. Sprawdzę również post.
nojetlag
czy to działa również w przypadku odbudów ONLINE?
Simon_Weaver
1
@Simon_Weaver Powinien zrobić tak.
Reaces
Działa to tylko dla REORGANIZE. Nie działa dla REBUILD. Zobacz kolumnę „percent_complete” pod następującym adresem URL, aby uzyskać pełną listę miejsc, w których to działa. Kolumna szacowany_kończenie_czasu należy do tej samej kategorii, ale nie jest udokumentowana jako taka, ponieważ jest „Tylko wewnętrzna”. docs.microsoft.com/en-us/sql/relational-databases/…
Jeff Moden
4

Udało mi się znaleźć ten post na blogu ze skryptem magicznym, który rzekomo wykonuje to zadanie, nie mogę sprawdzić, ponieważ wydaje się, że to nie działa dla programu SQL Server 2014, który uruchamiam, blokuje zapytania oczekujące na udostępnioną blokadę. Może ktoś uzna to za przydatne, więc zostawię to tutaj.

;WITH cte AS
(
SELECT
object_id,
index_id,
partition_number,
rows,
ROW_NUMBER() OVER(PARTITION BY object_id, index_id, partition_number ORDER BY partition_id) as rn
FROM sys.partitions
)
SELECT
   object_name(cur.object_id) as TableName,
   cur.index_id,
   cur.partition_number,
   PrecentDone =
      CASE
         WHEN pre.rows = 0 THEN 0
      ELSE
         ((cur.rows * 100.0) / pre.rows)
      END,
   pre.rows - cur.rows as MissingRows
FROM cte as cur
INNER JOIN cte as pre on (cur.object_id = pre.object_id) AND (cur.index_id = pre.index_id) AND (cur.partition_number = pre.partition_number) AND (cur.rn = pre.rn +1)
ORDER BY 4
eksmisja
źródło
1

Uważam, że zaakceptowana odpowiedź jest powyżej dobrej, ale brakuje mi istotnej rzeczy: statusu polecenia (np. Polecenie jest zablokowane)

Ten prosty wybór pokazuje status z przodu i na środku:

SELECT percent_complete, *
FROM sys.dm_exec_requests
WHERE session_id = <session id of alter index>
Jonesome przywraca Monikę
źródło