Перевірте хід зміни / відновлення індексу змін


17

Як я можу перевірити хід / стан, коли я надсилаю індекс змінити реорганізувати / відновити?


1
Під прогресом ви маєте на увазі, скільки рядків індексів він перевірив і скільки залишилося? Я не думаю, що ти можеш це зробити. Ваша найкраща ставка - контролювати використання DMV sys.dm_exec_requests
Shanky,

Відповіді:


16

Справді важко сказати, скільки часу триватиме ваша перебудова, оскільки сам SQL насправді не знає заздалегідь і не може дати тобі оцінку.

Ви можете використовувати наступний запит, щоб використовувати dm_exec_requests dmv, щоб переглянути, як довго триває відновлення індексу, і перевірити, чи SQL насправді не має оцінки:

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')

Однак, коли мова заходить про реальну оцінку часу, ви можете прочитати цю приємну публікацію в блозі від sqlmunkee, яка узагальнює це, кажучи ".. це залежить".

А оскільки ми не всі на одному і тому ж обладнання, використовуючи одне і те саме програмне забезпечення або дивлячись на ті самі дані, відповідь має бути ... .. це залежить

Розчарування, але правда, сумно.


2
Дякую за хороший сценарій, мені довелося скоригувати пункт де "DBCC", але потім я отримав деяку інформацію, сказавши, що відсоток завершений становить 6,42, а ETA Min становить близько 707 (що стосується одного розділу). Я буду стежити за цим, як далеко від цього буде. Буде перевірена також публікація.
nojetlag

це також працює для відновлення ONLINE?
Simon_Weaver

1
@Simon_Weaver Якщо так зробити
Реалізується

Це працює лише для REORGANIZE. Це не працює для REBUILD. Перегляньте стовпець "відсоток_комплект" за вказаною нижче URL-адресою, щоб отримати повний список, де це працює. Стовпець оцінюваного_комплектування_длягає до тієї ж категорії, але не є документально зафіксованим, тому що це "Тільки внутрішній". docs.microsoft.com/en-us/sql/relational-databases/…
Jeff Moden

4

Мені вдалося знайти цю публікацію в блозі із чарівним сценарієм, який нібито виконує завдання, не можу перевірити, оскільки це, здається, не працює для SQL Server 2014, який я запущую, блоки запитів, що очікують на Спільний блокування. Можливо, комусь це стане корисним, хоча я просто залишу його тут.

;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

1

Я визнав прийняту відповідь вище гарною, але пропустив важливе: стан команди (наприклад, команда заблокована)

Цей простий вибір показує стан спереду та в центрі:

SELECT percent_complete, *
FROM sys.dm_exec_requests
WHERE session_id = <session id of alter index>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.