Yanıtlar:
SQL'in gerçekten önceden bilmediği ve size bir tahmin veremediği için yeniden oluşturma işleminizin ne kadar süreceğini söylemek gerçekten zor.
Dm_exec_requests dmv'yi kullanarak dizin yeniden oluşturma işleminizin ne kadar süredir devam ettiğini görmek ve SQL'in gerçekten bir tahmini olmadığını doğrulamak için aşağıdaki sorguyu kullanabilirsiniz:
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')
Ancak gerekli gerçek bir tahmin söz konusu olduğunda sqlmunkee'den bu güzel blog gönderisini okuyabilirsiniz, bunu "..it bağlıdır" diyerek özetler:
Ve hepimiz aynı donanımda olmadığımız, aynı yazılımı kullandığımız veya aynı verilere baktığımız için, cevap… ..
Sinir bozucu, ama gerçek, ne yazık ki.
Bu blog gönderisini , görevi yürüttüğü iddia edilen bir sihirbaz komut dosyası ile bulmayı başardım , çünkü bu çalıştığım SQL Server 2014 için çalışmıyor gibi görünüyor, bir Paylaşılan Kilit bekleyen sorgu blokları. Belki birisi bunu yararlı bulacaktır, bu yüzden burada bırakacağım.
;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
Kabul edilen cevabı yukarıda buldum, ama önemli bir şey eksik: komut durumu (örneğin komut engellendi)
Bu basit seçim, ön ve ortadaki durumu gösterir:
SELECT percent_complete, *
FROM sys.dm_exec_requests
WHERE session_id = <session id of alter index>