Kiểm tra tiến độ thay đổi chỉ mục tổ chức lại / xây dựng lại


17

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?


1
Theo tiến trình, bạn có nghĩa là nó đã kiểm tra bao nhiêu hàng và bao nhiêu? Tôi không nghĩ bạn có thể làm điều đó. Đặt cược tốt nhất của bạn là theo dõi đang sử dụng DMV sys.dm_exec_Vquests
Shanky

Câu trả lời:


16

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.


2
Cảm ơn vì kịch bản hay, tôi đã phải điều chỉnh mệnh đề where thành 'DBCC' nhưng sau đó tôi đã lấy lại được một số thông tin, nói rằng phần trăm hoàn thành là 6,42 và ETA Min là khoảng 707 (dành cho một phân vùng). Tôi sẽ để mắt đến nó về việc này sẽ đi được bao xa. Sẽ kiểm tra bài là tốt.
nojetlag

cái này có hoạt động để xây dựng lại ONLINE không?
Simon_Weaver

1
@Simon_Weaver Nên làm có.
Hồi sinh

Điều này chỉ hoạt động cho REORGANIZE. Nó không hoạt động cho REBUILD. Vui lòng xem cột "Perc_complete" tại URL sau để biết danh sách đầy đủ về nơi nó hoạt động. Cột ước_completion_time rơi vào cùng một danh mục nhưng không được ghi lại như vậy vì đó là "Chỉ nội bộ". docs.microsoft.com/en-us/sql/relational-database/ Kẻ
Jeff Moden

4

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

1

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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.