Как проверить прогресс DBCC SHRINKFILE?

31

Есть ли способ узнать, как продвигается DBCC SHRINKFILEутверждение?

Вот как я его запустил

dbcc shrinkfile ('main_data', 250000)

Я бегу выше заявление на SQL Server 2005 и 2008.

[ОБНОВЛЕНИЕ] Вот запрос, который я выполнил, чтобы проверить ход и текст, который выполняется.

select  T.text, R.Status, R.Command, DatabaseName = db_name(R.database_id)
        , R.cpu_time, R.total_elapsed_time, R.percent_complete
from    sys.dm_exec_requests R
        cross apply sys.dm_exec_sql_text(R.sql_handle) T
dance2die
источник

Ответы:

33

Вы проверили процентов_компонента в sys.dm_exec_requests?

Аарон Альтон
источник
В настоящее время проверяется, как читать данные, возвращенные из этого DMV.
dance2die
14

Ответ Аарона точен, но я бы хотел предостеречь вас от сокращения файлов данных, так как это вызывает ужасные проблемы с производительностью. Раньше у меня был сокращенный код, поэтому я знаю, о чем говорю. Оформите этот пост в блоге, который я написал вчера, который показывает вам, что я имею в виду, и советует, как выполнить сжатие без фактического сокращения: почему не следует сокращать файлы данных

Надеюсь это поможет!

PS Еще одна вещь, чтобы проверить, занимает ли это много времени и процент_компонента не увеличивается - ищите блокировку. Термоусадка будет бесконечной - ждите замков, в которых она нуждается.

Пол Рэндал
источник
4
«Раньше у меня был сокращенный код, поэтому я знаю, о чем говорю». хороший!
splattne
1
Сжатие файла данных 600G заняло целую вечность ... Я прочитаю его и рассмотрю возможность использования дефрагментации индекса Спасибо, Пол!
dance2die
1
имейте в виду, что я нашел этот ответ, потому что я искал прогресс в DBCC SHRINKFILE (MyFile, EMPTYFILE) ... Я перемещаю данные между дисками, добавляя файл в файловую группу на новом диске, освобождая оригинал и удаляя его.
Сэм Шафран
@Paul, я наблюдаю, что сжатие файла до целевого размера занимает некоторое время, но завершается (я вижу, что он смотрит на размер файла) - но, несмотря на то, что СЛЕДУЕТ завершить успешно, процесс shinking все еще продолжается и продолжается вечно. То же самое с меньшими (некоторые МБ или больше (1 ГБ) объемы памяти). sys.dm_exec_requests непрерывно показывает бесконечную активность, изменяя блокировки ресурсов, и в то же время процент_полнота составляет около 32,8%. На этом этапе я отменяю процесс и торжественно отмечаю успех - зная, что ЧТО-то еще происходит ... есть идеи, что случилось? 2008R2
Magier
Ссылка на сообщение в блоге не работает, теперь она действительна: sqlskills.com/blogs/paul/…
Джонатан Гилберт,
5
SELECT 
    d.name,
    percent_complete, 
    session_id,
    start_time, 
    status, 
    command, 
    estimated_completion_time, 
    cpu_time, 
    total_elapsed_time
FROM 
    sys.dm_exec_requests E left join
    sys.databases D on e.database_id = d.database_id
WHERE
    command in ('DbccFilesCompact','DbccSpaceReclaim')
Франсиско Фигейредо
источник
2
Может быть полезно включить описание того, что ваш код делает в вашем ответе
BE77Y
+1 за отличный запрос, но -1 за повторение того, что сказал ОП через шесть лет после свершившегося факта. Если ваш запрос в некотором отношении лучше его, опишите его, иначе это просто пустое место.
5

Приведенный ниже запрос покажет вам такой результат: отслеживать состояние сокращения dbcc

-------------------------------
--Track DBCC shrink status
-------------------------------
select
a.session_id
, command
, b.text
, percent_complete
, done_in_minutes = a.estimated_completion_time / 1000 / 60
, min_in_progress = DATEDIFF(MI, a.start_time, DATEADD(ms, a.estimated_completion_time, GETDATE() ))
, a.start_time
, estimated_completion_time = DATEADD(ms, a.estimated_completion_time, GETDATE() )
from sys.dm_exec_requests a
CROSS APPLY sys.dm_exec_sql_text(a.sql_handle) b
where command like '%dbcc%'
Марк Варнас
источник
3

Добавление моей собственной версии для всех, кто интересуется, преобразует столбцы миллисекундного времени в более читаемые минуты и секунды.

select 
[status],
start_time,
convert(varchar,(total_elapsed_time/(1000))/60) + 'M ' + convert(varchar,(total_elapsed_time/(1000))%60) + 'S' AS [Elapsed],
convert(varchar,(estimated_completion_time/(1000))/60) + 'M ' + convert(varchar,(estimated_completion_time/(1000))%60) + 'S' as [ETA],
command,
[sql_handle],
database_id,
connection_id,
blocking_session_id,
percent_complete
from  sys.dm_exec_requests
where estimated_completion_time > 1
order by total_elapsed_time desc
user5947282
источник
-1

Или вы можете просто запустить exec sp_who3.

darotweiler
источник
2
Это потребует лучшего объяснения.
Свен
-1

sp_whoisactive - есть столбец "процент_компонента"

Аксель Рохтсалу
источник
1
Это не дает ответа на вопрос. Как только у вас будет достаточно репутации, вы сможете комментировать любой пост ; вместо этого предоставьте ответы, которые не требуют разъяснений от автора . - Из обзора
bjoster