Возможно ли запустить две команды DBCC INDEXDEFRAG одновременно, каждая на другой таблице?

9

В настоящее время я запускаю скрипт, который выполняет DBCC INDEXDEFRAG для каждой таблицы в базе данных SQL Server 2005, по одной таблице за раз. Использование DBCC DBREINDEX вместо INDEXDEFRAG не вариант из-за ограниченного пространства и требований по времени безотказной работы.

Я заметил, что для дефрагментации определенных таблиц требуется много времени. Например, если я изучу динамическое административное представление «sys.dm_exec_requests», то увижу, что следующий INDEXDEFRAG в настоящее время обрабатывает кластеризованный индекс таблицы, у которой table_id равен 829610394:

DBCC INDEXDEFRAG (0, 829610394, 1)

Я знаю, что пройдет много времени, прежде чем процесс дефрагментации завершится. Если оставить в стороне тот факт, что выполняемый в настоящее время сценарий в конечном итоге дефрагментирует все таблицы, есть ли у меня какая-либо опасность, если я буду вручную запускать другой DBCC INDEXDEFRAG для кластеризованного индекса другой таблицы во время выполнения текущей команды? Будут ли обе таблицы одновременно дефрагментированы, если я это сделаю?

RelentlessMike
источник

Ответы:

15

Да, вы можете сделать это для нескольких таблиц. Вы не можете сделать это для нескольких индексов в одной таблице - я изобрел новый подресурс блокировки индекса, чтобы предотвратить это. Такое же поведение в ALTER INDEX ... РЕОРГАНИЗИРОВАТЬ, что я заменил его в 2005 году.

Спасибо

Пол С. Рэндал
источник
2
Вы не можете получить более точный ответ, чем тот, кто его написал! Не забывайте о нагрузке ввода-вывода, связанной с одновременным повторным сборкой или перезапуском, и обязательно используйте ALTER INDEX, а не команду DBCC.
AndrewSQL
Согласен, я не знаю, как можно было бы получить более точный ответ на этот конкретный вопрос, чем прямо от Пола Рэндала. Спасибо, Пол.
RelentlessMike
6

Обратите внимание, что DBCC INDEXDEFRAG и DBREINDEX устарели и заменены ALTER INDEX:

Важный

Эта функция будет удалена в следующей версии Microsoft SQL Server. Не используйте эту функцию в новых разработках и изменяйте приложения, которые в настоящее время используют эту функцию, как можно скорее. Вместо этого используйте ALTER INDEX. - http://msdn.microsoft.com/en-us/library/ms177571(v=SQL.90).aspx

Что касается запуска двух одновременно, это зависит от вашего формата файла. Если они все находятся на одном и том же диске (дисках), вы, скорее всего, замедлите их, поскольку они будут сражаться друг с другом за ввод-вывод. Вы бы лучше только REORG или REBUILD, когда это необходимо. Проверьте сценарий Мишель Аффорд здесь для автоматического решения: http://sqlfool.com/2010/04/index-defrag-script-v4-0/

Эрик Хамфри - Лотсхелп
источник
Спасибо, Эрик. В этом конкретном случае база данных распределена по нескольким файлам данных, по разным разделам и поверху IBM DS8300 SAN. Так что я думаю, что со мной все будет в порядке, насколько возможно I / O.
RelentlessMike