Проверить ход изменения индекса реорганизации / перестройки

17

Как я могу проверить прогресс / статус, когда я отправляю изменение индекса реорганизации / перестройки?

nojetlag
источник
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, который резюмирует это, говоря: «..не зависит»:

И поскольку мы не все на одном оборудовании, используем одно и то же программное обеспечение или рассматриваем одни и те же данные, ответ должен быть ... ... это зависит

Расстраиваю, но правда, к сожалению.

Reaces
источник
2
Спасибо за хороший сценарий, мне пришлось изменить условие where на «DBCC», но затем я получил некоторую информацию, сказав, что процент выполнения равен 6,42, а значение ETA Min составляет около 707 (что для одного раздела). Я буду следить за тем, как далеко это будет. Буду также проверять почту.
Nojetlag
это работает и для онлайн-сборок?
Simon_Weaver
1
@Simon_Weaver Должен сделать да.
Reaces
Это работает только для REORGANIZE. Это не работает для REBUILD. Пожалуйста, смотрите столбец "процент_компонента" по следующему URL для полного списка, где это работает. Столбец оценочный_компонент_ время относится к той же категории, но не документируется как таковой, поскольку он «Только для внутреннего использования». docs.microsoft.com/en-us/sql/relational-databases/…
Джефф Моден
4

Мне удалось найти этот пост с помощью магического скрипта, который якобы выполняет задачу, не может проверить, потому что, кажется, это не работает для SQL Server 2014, который я запускаю, блоков запросов, ожидающих Shared Lock. Может быть, кто-то найдет это полезным, хотя я просто оставлю это здесь.

;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
evictednoise
источник
1

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

Этот простой выбор показывает статус спереди и по центру:

SELECT percent_complete, *
FROM sys.dm_exec_requests
WHERE session_id = <session id of alter index>
Jonesome Восстановить Монику
источник