2009-11-05 2 views
0

Я пытался дефрагментировать индексы в SQL Server 2005 и ничего не работает. Я создал несколько планов обслуживания с помощью мастера, но работа всегда терпит неудачу. Я запустил скрипт с этого сайта, который первоначально от Microsoft:Дефрагментация индексов SQL

http://blog.sqlauthority.com/2008/03/04/sql-server-2005-a-simple-way-to-defragment-all-indexes-in-a-database-that-is-fragmented-above-a-declared-threshold/

Даже если я иду к конкретной таблицы в обозревателе объектов и выберите папку Индексы и выберите Rebuild All фрагментация% никогда не меняется, даже несмотря на то, что он сообщает об успешном завершении.

Не должен ли восстановленный индекс иметь 0% фрагментацию? Если да, то почему этот sql не будет работать:

ALTER INDEX [IndexName] ON [dbo].[TableName] 
REBUILD WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = Off, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, SORT_IN_TEMPDB = OFF, ONLINE = OFF) 

Это sql, сгенерированный выбранным индексом перестройки.

ответ

0

Если в таблице не так много строк или данные не потребляют страницу данных (8k), вы заметите фрагментацию индексов даже после восстановления.

0

Возможно, это связано с очень маленькой базой данных, как предложено в другом ответе, проблема более , вероятно, связана с FILLFACTOR.

Оператор ALTER INDEX показано не явно упомянуть FILLFACTOR, и, следовательно, восстановленный делаются на основе текущего значения FILLFACTOR, оставляя фрагментации, которая должна приближать этот фактор. (Это редко бывает точное совпадение, потому что данная запись индекса не может быть разделена между двумя узлами, поэтому каждый узел может оставить больше или меньше места, чем требуется для заполнения, в некоторых случаях это потребует дробного числа байтов. ., но давайте не будем отклоняться от реальной проблемы ...)

Вы можете узнать текущее значение FILLFACTOR для данного индекса, глядя в таблицу sys.indexes, с запросом к подобным SELECT * FROM таблице sys.indexes гДЕ object_id в (SELECT object_id FROM sys.objects гДЕ имя = 'myTableName')

в качестве альтернативы, если вы запустите модифицированную версию ALTER INDEX отрезала показано, где ... FILLFACTOR = 100 ... добавлен в опции «С», я подозреваю, что сообщаемая фрагментация будет соответствовать вашему ожиданию.

Для большей ясности параметр PAD_INDEX дает указание SQL оставить некоторое пространство в промежуточных узлах индекса, поэтому они не будут подвергаться какой-либо «фрагментации», но узлы листа будут.

Это говорит ... Это может быть хорошей идеей, чтобы оставить определенное количество FILLFACTOR, чтобы задержать в начале фрагментации, как новые данные вставляются в таблицу.

Смежные вопросы