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 INDEX
tuyê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 IN
nhà điều hành được sử dụng để lọc ra các Index Insert
hàng đó, nếu có, sẽ làm tăng TotalRows
giá 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_count
trườ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
physical_operator_name
được đặt thànhN'Index Scan'
, thay vìN'Table Scan'
hoặcN'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.