Поделиться через


DBCC INDEXDEFRAG (Transact-SQL)

Изменения: 14 апреля 2006 г.

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

ms177571.note(ru-ru,SQL.90).gifВажно!
В будущей версии Microsoft SQL Server эта возможность будет удалена. Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется. Используйте вместо этого инструкцию ALTER INDEX.

Значок ссылки на разделСоглашения о синтаксическом обозначении в Transact-SQL

Синтаксис

DBCC INDEXDEFRAG
(
    { database_name | database_id | 0 } 
        , { table_name | table_id | view_name | view_id } 
    [ , { index_name | index_id } [ , { partition_number | 0 } ] ]
)
    [ WITH NO_INFOMSGS ] 

Аргументы

  • database_name | database_id | 0
    База данных, для которой нужно дефрагментировать индекс. Если указано 0, используется текущая база данных. Имена баз данных должны соответствовать правилам идентификаторов.
  • table_name | table_id | view_name | view_id
    Таблица или представление, для которого нужно дефрагментировать индекс. Имена таблиц и представлений должны соответствовать требованиям, предъявляемым к идентификаторам.
  • index_name | index_id
    Имя или идентификатор индекса, который следует дефрагментировать. Если этот аргумент не указан, дефрагментируются все индексы заданной таблицы или представления. Имена индексов должны соответствовать требованиям, предъявляемым к идентификаторам.
  • partition_number | 0
    Номер секции индекса, которую следует дефрагментировать. Если этот аргумент не указан или равен 0, дефрагментируются все секции заданного индекса.
  • WITH NO_INFOMSGS
    Подавляет все информационные сообщения с степенями серьезности от 0 до 10.

Результирующие наборы

Если в инструкции DBCC INDEXDEFRAG указан индекс (но не указан аргумент WITH NO_INFOMSGS), она возвращает следующий результирующий набор (значения могут быть иными):

Pages Scanned Pages Moved Pages Removed
------------- ----------- -------------
359           346         8

(1 row(s) affected)

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Замечания

Инструкция DBCC INDEXDEFRAG дефрагментирует конечный уровень индекса, приводя физический порядок страниц в соответствие логическому порядку конечных узлов слева направо, что повышает эффективность сканирования индекса.

ms177571.note(ru-ru,SQL.90).gifПримечание.
При выполнении инструкции DBCC INDEXDEFRAG дефрагментация индекса осуществляется последовательно. Это означает, что операции над одним индексом выполняются в одном потоке без параллелизма. Операции над несколькими индексами, относящиеся к одной инструкции DBCC INDEXDEFRAG, выполняются над одним индексом за раз.

Кроме того, инструкция DBCC INDEXDEFRAG сжимает страницы индекса с учетом коэффициента заполнения, указанного при создании индекса. Любые пустые страницы при этом удаляются. Дополнительные сведения см. в разделе Коэффициент заполнения.

Если индекс охватывает более одного файла, инструкция DBCC INDEXDEFRAG дефрагментирует по одному файлу за раз. Страницы между файлами не переносятся.

Инструкция DBCC INDEXDEFRAG сообщает процент выполнения дефрагментации каждые пять минут. Дефрагментацию можно остановить в любой момент, при этом вся выполненная работа сохраняется.

В отличие от инструкции DBCC DBREINDEX и операций создания индексов вообще, инструкция DBCC INDEXDEFRAG выполняется в оперативном режиме. Она не удерживает блокировки длительное время. Таким образом, она не блокирует выполнение запросов или обновлений. Так как время дефрагментации зависит от степени фрагментации, сравнительно нефрагментированный индекс иногда можно дефрагментировать быстрее, чем создать новый индекс. На дефрагментацию сильно фрагментированного индекса может уйти гораздо больше времени, чем на его создание заново.

Процесс дефрагментации всегда полностью регистрируется в журнале независимо от модели восстановления баз данных. Дополнительные сведения см. в разделе ALTER DATABASE (Transact-SQL). Дефрагментация сильно фрагментированного индекса может привести к записи большего объема данных, чем создание индекса с полной регистрацией в журнале. Однако дефрагментация выполняется как ряд кратких транзакций, поэтому она не требует большого журнала, если часто создаются резервные копии журнала или если применяется простая (SIMPLE) модель восстановления.

Инструкция DBCC INDEXDEFRAG перемещает конечные страницы индекса в произвольном порядке. Таким образом, если содержимое индекса чередуется на диске с содержимым других индексов, выполнение инструкции DBCC INDEXDEFRAG для этого индекса не приведет к расположению всех конечных страниц индекса в последовательном порядке. Чтобы улучшить кластеризацию страниц, создайте индекс заново.

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

Разрешения

Может вызываться либо владельцем таблицы, либо членом предопределенной роли сервера sysadmin или предопределенной роли базы данных db_owner или db_ddladmin.

Примеры

Следующий код дефрагментирует все секции индекса PK_Product_ProductID таблицы Production.Product в базе данных AdventureWorks.

DBCC INDEXDEFRAG (AdventureWorks, "Production.Product", PK_Product_ProductID)
GO

См. также

Справочник

DBCC (Transact-SQL)
sys.dm_db_index_physical_stats
CREATE TABLE (Transact-SQL)
ALTER TABLE (Transact-SQL)
ALTER INDEX (Transact-SQL)

Другие ресурсы

Архитектура таблиц и индексов

Справка и поддержка

Получение помощи по SQL Server 2005

Журнал изменений

Версия Журнал

14 апреля 2006 г.

Изменения
  • Исправлен синтаксис путем указания предложений индекса и номера секции, как необязательных.