SQL Server: Làm thế nào để theo dõi tiến trình của lệnh CREATE INDEX?


36

Máy chủ SQL 2014, Std Ed

Tôi đã đọc phần trăm_complete trong dm_exec numquests không hoạt động cho CREATE INDEX và trong thực tế, Perc_complete dính ở mức 0. Vì vậy, điều đó không có ích.

Tôi hiện đang sử dụng phương pháp bên dưới, ít nhất cho tôi thấy chuyển động (rằng việc tạo chỉ mục không bị chặn). Nhưng tôi không biết nếu tôi là% 10 trong suốt quá trình hoặc% 99.

Tôi đã thử phương pháp được mô tả ở đây: https://dba.stackexchange.com/a/102545/6229 nhưng nó cho thấy thời gian hoàn thành est sai rõ ràng (về cơ bản nó hiển thị 'bây giờ' cho quá trình hơn 60 phút mà tôi mất 10 phút )

Làm thế nào tôi có thể có được một manh mối?

SELECT percent_complete, estimated_completion_time, reads, writes, logical_reads, text_size, *
FROM
sys.dm_exec_requests AS r
WHERE
r.session_id <> @@SPID
AND r.session_id = 58

Câu trả lời:


55

Tôi nghĩ rằng các truy vấn sau đây ít nhất sẽ giúp bạn khá gần gũi. Nó sử dụng DMV đã được giới thiệu trong SQL Server 2014: sys.dm_exec_query_profiles (và cảm ơn Martin Smith đã giới thiệu nó với tôi thông qua câu lệnh DBA.StackExchange liên quan này: Tiến trình của câu lệnh SELECT INTO :-).

Xin lưu ý:

  • !! Bạn sẽ cần phải thêm SET STATISTICS PROFILE ON;hoặc SET STATISTICS XML ON;trong các đợt truy vấn được làm CREATE INDEX(và đặt trước các CREATE INDEXtuyên bố, nếu đó không phải là rõ ràng), nếu không không có hàng sẽ hiển thị trong DMV này cho rằng SPID / session_id !!

  • Các INnhà điều hành được sử dụng để lọc ra các Index Inserthàng đó, nếu có, sẽ làm tăng TotalRowsgiá trị, mà sẽ nghiêng tính toán kể từ khi hàng đó chưa bao giờ thấy bất kỳ hàng xử lý.

  • Số lượng hàng được hiển thị ở đây (tức là TotalRows) gấp đôi số hàng của bảng do thao tác thực hiện hai bước, mỗi bước hoạt động trên tất cả các hàng: đầu tiên là "Quét bảng" hoặc "Quét chỉ mục cụm" và thứ hai là sắp xếp". Bạn sẽ thấy "Quét bảng" khi tạo Chỉ mục cụm hoặc tạo Chỉ mục không xóa trên Heap. Bạn sẽ thấy "Quét chỉ mục theo cụm" khi tạo Chỉ mục không làm mờ trên Chỉ mục được nhóm.

  • Truy vấn này dường như không hoạt động khi tạo Chỉ mục được lọc. Vì một số lý do, Chỉ mục được lọc a) không có bước "Sắp xếp" và b) row_counttrường không bao giờ tăng từ 0.
    Không chắc chắn những gì tôi đã kiểm tra trước đây, nhưng các thử nghiệm của tôi hiện chỉ ra rằng các Chỉ mục được Lọc được truy vấn này. Ngọt. Mặc dù chỉ cần cẩn thận rằng số hàng có thể bị tắt (tôi sẽ xem liệu tôi có thể sửa nó vào một ngày nào đó không).

  • Khi tạo một Chỉ mục được nhóm trên một Heap đã có các Chỉ mục không bị xóa trên đó, các Chỉ mục không làm mờ cần phải được xây dựng lại (để trao đổi RID - RowID - cho (các) Chỉ mục được tạo cụm là một hoạt động riêng biệt và do đó không được phản ánh trong các số liệu thống kê được truy vấn này trả về trong quá trình tạo Chỉ mục cụm.

  • Truy vấn này đã được kiểm tra đối với:

    • Tạo:
      • Các chỉ mục không bị che khuất trên một đống
      • Chỉ mục cụm (không tồn tại Chỉ mục không bị xóa)
      • Các chỉ mục không bị che khuất trên Chỉ mục / Bảng được nhóm
      • một chỉ mục được nhóm khi các chỉ mục không làm mờ đã tồn tại
      • Các chỉ mục NonClustered duy nhất trên Bảng / Chỉ mục được nhóm
    • Xây dựng lại (bảng với Chỉ mục được nhóm và một Chỉ mục không làm mờ; được thử nghiệm trên SQL Server 2014, 2016, 2017 và 2019) thông qua:
      • ALTER TABLE [schema_name].[table_name] REBUILD;( chỉ Clustered Index hiển thị khi sử dụng phương thức này )
      • ALTER INDEX ALL ON [schema_name].[table_name] REBUILD;
      • ALTER INDEX [index_name] ON [schema_name].[table_name] REBUILD;
DECLARE @SPID INT = 51;

;WITH agg AS
(
     SELECT SUM(qp.[row_count]) AS [RowsProcessed],
            SUM(qp.[estimate_row_count]) AS [TotalRows],
            MAX(qp.last_active_time) - MIN(qp.first_active_time) AS [ElapsedMS],
            MAX(IIF(qp.[close_time] = 0 AND qp.[first_row_time] > 0,
                    [physical_operator_name],
                    N'<Transition>')) AS [CurrentStep]
     FROM sys.dm_exec_query_profiles qp
     WHERE qp.[physical_operator_name] IN (N'Table Scan', N'Clustered Index Scan',
                                           N'Index Scan',  N'Sort')
     AND   qp.[session_id] = @SPID
), comp AS
(
     SELECT *,
            ([TotalRows] - [RowsProcessed]) AS [RowsLeft],
            ([ElapsedMS] / 1000.0) AS [ElapsedSeconds]
     FROM   agg
)
SELECT [CurrentStep],
       [TotalRows],
       [RowsProcessed],
       [RowsLeft],
       CONVERT(DECIMAL(5, 2),
               (([RowsProcessed] * 1.0) / [TotalRows]) * 100) AS [PercentComplete],
       [ElapsedSeconds],
       (([ElapsedSeconds] / [RowsProcessed]) * [RowsLeft]) AS [EstimatedSecondsLeft],
       DATEADD(SECOND,
               (([ElapsedSeconds] / [RowsProcessed]) * [RowsLeft]),
               GETDATE()) AS [EstimatedCompletionTime]
FROM   comp;

Đầu ra mẫu:

                        Rows                 Percent   Elapsed  Estimated    Estimated
CurrentStep  TotalRows  Processed  RowsLeft  Complete  Seconds  SecondsLeft  CompletionTime
-----------  ---------  ---------  --------  --------  -------  -----------  --------------
Clustered    11248640   4786937    6461703   42.56     4.89400  6.606223     2016-05-23
Index Scan                                                                   14:32:40.547

Nếu bạn tạo một chỉ mục không được nhóm trên một heap và chỉ mục mới có cùng khóa với một chỉ mục hiện có, truy vấn sẽ sử dụng một toán tử physical_operator_nameđược đặt thành N'Index Scan', thay vì N'Table Scan'hoặc N'Clustered Index Scan'. Ngoài ra, nó sẽ rất chậm, vì nó sẽ thực hiện một loạt các tra cứu RID.
Brian

Bây giờ nếu chỉ điều đó sẽ hoạt động trên ALTER INDEX ALL ON dbo.table REBUILD ..... <g>
Jonesome phục hồi Monica

1
BTW, điều này cũng hoạt động tốt để theo dõi tiến trình thực hiện nén trang. sys.dm_exec_query_profiles khá tuyệt.
Todd Kleinhans

Cảm ơn Solomon, đó là một truy vấn tuyệt vời. Có điều gì tương tự như theo dõi tiến trình của lệnh ALTER INDEX - REBUILD không?
Roni Vered

1
@JonesomeReinstateMonica Tôi chỉ cập nhật truy vấn một chút. Có vẻ như nó thực sự nắm bắt các hoạt động xây dựng lại, cả thông qua ALTER INDEX ALLvà thậm chí (một phần) ALTER TABLE .. REBUILD. Vui lòng xem lại :-).
Solomon Rutzky
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.