Bence aşağıdaki sorgu en azından seni oldukça yakınlaştıracak. SQL Server 2014'te tanıtılan bir DMV'den faydalanır : sys.dm_exec_query_profiles (ve bu ilgili DBA.StackExchange Yanıtı: SELECT INTO deyiminin ilerlemesi :-) ile bana geldiği için Martin Smith'e teşekkür ederiz .
Lütfen aklınızda bulundurun:
!! Sen eklemesi gerekir SET STATISTICS PROFILE ON;
veya SET STATISTICS XML ON;
sorgu toplu o yapıyor CREATE INDEX
(ve yerleştirilen önceCREATE INDEX
/ else hiçbir satır SPID için bu DMV görünecektir, bariz değilse, deyimi) session_id
!!
IN
Operatör dışarı filtreye kullanılırsa Index Insert
, katılırsa, artacak satırda TotalRows
o satır işlenen herhangi bir satır gösterir asla beri hesaplamaları kaymalara değerleri.
Burada görüntülenen satır sayısı (yani TotalRows
), her biri tüm satırlarda çalışan iki adımlı işlem nedeniyle tablonun satır sayısını iki katına çıkarır: ilki bir "Tablo Taraması" veya "Kümelenmiş Dizin Taraması" dır, ikincisi ise tür". Kümelenmiş Bir Dizin oluştururken veya Bir Yığın üzerinde Kümelenmemiş Bir Dizin oluştururken "Tablo Taraması" nı göreceksiniz. Kümelenmiş Bir Dizinde Kümelenmemiş Bir Dizin oluştururken "Kümelenmiş Dizin Taraması" göreceksiniz.
Bu sorgu Filtrelenmiş Dizinler oluştururken işe yaramaz gibi görünüyor. Bazı nedenlerden dolayı, Filtrelenmiş Dizinler a) "Sıralama" adımına sahip değildir ve b) row_count
alan hiçbir zaman 0'dan artmaz.
Daha önce test edildi, ama benim testleri artık Filtreli Endeksleri göstermektedir Değil emin ne vardır bu sorgu tarafından yakalanan. Tatlı. Sadece satır sayımlarının kapalı olabileceğine dikkat edin (bir gün bunu düzeltebilir miyim göreceğim).
Üzerinde kümelenmemiş dizinleri olan bir öbek üzerinde kümelenmiş bir dizin oluştururken, kümelenmemiş dizinlerin yeniden oluşturulması gerekir (kümelenmiş dizin anahtarları için RID - RowID - kümelenmiş dizini değiştirmek için) ve her kümelenmemiş dizin yeniden oluşturma ayrı bir işlem olması ve bu nedenle Kümelenmiş Dizinin oluşturulması sırasında bu sorgu tarafından döndürülen istatistiklere yansıtılmaması.
Bu sorgu şu şekilde test edildi:
- oluşturma:
- Bir Yığın Üzerindeki Topaklanmayan Dizinler
- Kümelenmiş Dizin
- Kümelenmiş Dizinde / Tabloda Toplanmamış
- Kümelenmemiş Dizinler zaten mevcut olduğunda kümelenmiş bir dizin
- Kümelenmiş Dizin / Tablodaki Benzersiz Topaklanmamış Dizinler
- Yeniden oluşturma (Kümelenmiş Dizin ve bir Kümelenmemiş Dizin içeren tablo; SQL Server 2014, 2016, 2017 ve 2019'da test edilmiştir):
ALTER TABLE [schema_name].[table_name] REBUILD;
( Bu yöntemi kullanırken yalnızca Kümelenmiş Dizini gösterir )
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;
Örnek çıktı:
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
set olan bir işleci kullanır . Ayrıca, bir grup RID araması yapacağı için çok yavaş olacaktır.N'Index Scan'
N'Table Scan'
N'Clustered Index Scan'