Làm cách nào tôi có thể kiểm tra tiến trình / trạng thái khi tôi gửi một chỉ mục thay đổi sắp xếp lại / xây dựng lại?
Làm cách nào tôi có thể kiểm tra tiến trình / trạng thái khi tôi gửi một chỉ mục thay đổi sắp xếp lại / xây dựng lại?
Câu trả lời:
Thật sự rất khó để nói việc xây dựng lại của bạn sẽ mất bao lâu, vì bản thân SQL không thực sự biết trước và không thể đưa ra ước tính cho bạn.
Bạn có thể sử dụng truy vấn sau để sử dụng dmv_exec numquests dmv để xem thời gian xây dựng lại chỉ mục của bạn đã diễn ra trong bao lâu và để xác minh rằng SQL không thực sự có ước tính:
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')
Tuy nhiên, khi nói đến một ước tính thực sự về thời gian cần thiết, bạn có thể đọc bài đăng blog tốt đẹp này từ sqlmunkee, trong đó tóm tắt điều này bằng cách nói "..it phụ thuộc.":
Và vì chúng ta không phải là tất cả trên cùng một phần cứng, sử dụng cùng một phần mềm hoặc xem xét cùng một dữ liệu, nên câu trả lời phải là ..
Thất vọng, nhưng sự thật, đáng buồn.
Tôi đã quản lý để tìm bài đăng trên blog này với một tập lệnh ảo thuật được cho là thực hiện nhiệm vụ, không thể kiểm tra vì có vẻ như nó không hoạt động cho SQL Server 2014 mà tôi đang chạy, các khối truy vấn đang chờ Khóa chung. Có lẽ ai đó sẽ thấy nó hữu ích mặc dù vậy tôi sẽ chỉ để nó ở đây.
;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
Tôi thấy câu trả lời được chấp nhận ở trên tốt, nhưng thiếu một điều cốt yếu: trạng thái lệnh (ví dụ: lệnh bị chặn)
Chọn đơn giản này hiển thị trạng thái phía trước và trung tâm:
SELECT percent_complete, *
FROM sys.dm_exec_requests
WHERE session_id = <session id of alter index>