SQL Server: CREATE INDEX komutunun ilerleyişi nasıl takip edilir?


36

SQL Server 2014, Std Ed

Dm_exec_requests deki yüzde_bilgisayarının CREATE INDEX için işe yaramadığını ve pratikte yüzde 0 bitten 0'da yapıştığını okudum.

Şu anda en azından bana hareketi gösteren (endeks oluşturma engellenmedi) aşağıdaki yöntemi kullanıyorum. Fakat eğer süreç boyunca% 10 ya da% 99 ise sıfır fikrim var.

Burada açıklanan yöntemi denedim: https://dba.stackexchange.com/a/102545/6229, ancak net bir şekilde yanlış bir tamamlama süresi gösteriyor (temelde 10 dakika içinde olduğum 60+ dakikalık bir süreç için 'şimdi' gösteriyor) )

Bir ipucunu nasıl alabilirim?

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

Yanıtlar:


56

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 !!

  • INOperatör dışarı filtreye kullanılırsa Index Insert, katılırsa, artacak satırda TotalRowso 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_countalan 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

Bir öbek üzerinde kümelenmemiş bir dizin oluşturursanız ve yeni dizin varolan bir dizinle aynı anahtara sahipse, sorgu , yerine veya yerine physical_operator_nameset 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'
Brian

Şimdi sadece bu ALTER INDEX ALL üzerinde çalışacak olursa dbo.table REBUILD ..... <g>
Jonesome, Monica

1
BTW, bu da sayfa sıkıştırma uygulama ilerlemesini izlemek için iyi çalışıyor. sys.dm_exec_query_profiles oldukça iyi.
Todd Kleinhans

2
@JonesomeReinstateMonica Sorguyu biraz güncelledim. Görünen o ki, yeniden yapılanma operasyonlarını hem yoluyla ALTER INDEX ALLhem de (kısmen) ele geçirmiş gibi görünüyor ALTER TABLE .. REBUILD. Gözden geçirin :-).
Solomon Rutzky

1
Merhaba @RoniVered Ben sadece biraz Clustered Index rebuilds yakalar böylece cevapta sorgu güncellendi. Ben komutların her iki tür (gerçi değil DBCC, sadece düşündüm) test ettik ve SQL Server 2019, 2017, 2016 tarihinde ve 2014 O :-) bunların tümünde aynı iş gibi görünüyor
Solomon Rutzky
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.