Bagaimana saya bisa mengecek progres / status ketika saya mengirim indeks perubahan, mengatur ulang / membangun kembali?
Bagaimana saya bisa mengecek progres / status ketika saya mengirim indeks perubahan, mengatur ulang / membangun kembali?
Jawaban:
Sangat sulit untuk mengatakan berapa lama pembangunan kembali Anda, karena SQL itu sendiri tidak benar-benar tahu sebelumnya dan tidak bisa memberi Anda perkiraan.
Anda dapat menggunakan kueri berikut untuk menggunakan dm_exec_requests dmv untuk melihat berapa lama indeks yang Anda buat kembali berjalan, dan untuk memverifikasi bahwa SQL tidak benar-benar memiliki perkiraan:
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')
Namun ketika datang ke perkiraan nyata pada waktu yang diperlukan Anda dapat membaca posting blog yang bagus ini dari sqlmunkee, yang merangkum ini dengan mengatakan "..itu tergantung.":
Dan karena kita tidak semua pada perangkat keras yang sama, menggunakan perangkat lunak yang sama, atau melihat data yang sama, jawabannya harus ..... tergantung
Frustasi, tetapi benar, sedih.
Saya berhasil menemukan posting blog ini dengan skrip magick yang diduga melakukan tugas, tidak dapat memeriksa karena ini tampaknya tidak berfungsi untuk SQL Server 2014 yang saya jalankan, blok permintaan menunggu Kunci Bersama. Mungkin seseorang akan menganggapnya berguna, jadi saya akan meninggalkannya di sini.
;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
Saya menemukan jawaban yang diterima di atas baik, tetapi melewatkan satu hal penting: status perintah (mis. Adalah perintah diblokir)
Pilihan sederhana ini menunjukkan status bagian depan dan tengah:
SELECT percent_complete, *
FROM sys.dm_exec_requests
WHERE session_id = <session id of alter index>