DBCC INDEXDEFRAG (Transact-SQL)DBCC INDEXDEFRAG (Transact-SQL)

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions)

Дефрагментирует индексы указанной таблицы или представления.Defragments indexes of the specified table or view.

Важно!

В будущей версии Microsoft SQL Server этот компонент будет удален.This feature will be removed in a future version of Microsoft SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.Avoid using this feature in new development work, and plan to modify applications that currently use this feature. Используйте вместо этого инструкцию ALTER INDEX.Use ALTER INDEX instead.

Применимо к: SQL ServerSQL ServerSQL Server 2008SQL Server 2008 до текущей версии)Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through current version)

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

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 ]   

Примечание

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

АргументыArguments

database_name | database_id | 0database_name | database_id | 0
База данных, содержащая индекс для дефрагментации.Is the database containing the index to defragment. Если указано значение 0, используется текущая база данных.If 0 is specified, the current database is used. Имена баз данных должны соответствовать правилам идентификаторов.Database names must comply with the rules for identifiers.

table_name | table_id | view_name | view_idtable_name | table_id | view_name | view_id
Таблица или представление, содержащие индекс для дефрагментации.Is the table or view containing the index to defragment. Имена таблиц и представлений должны соответствовать требованиям, предъявляемым к идентификаторам.Table and view names must comply with the rules for identifiers.

index_name | index_idindex_name | index_id
Имя или идентификатор индекса, подлежащего дефрагментации.Is the name or ID of the index to defragment. Если этот аргумент не указан, дефрагментируются все индексы заданной таблицы или представления.If not specified, the statement defragments all indexes of the specified table or view. Имена индексов должны соответствовать правилам для идентификаторов.Index names must comply with the rules for identifiers.

partition_number | 0partition_number | 0
Номер секции индекса, которую следует дефрагментировать.Is the partition number of the index to defragment. Если этот аргумент не указан или равен 0, дефрагментируются все секции заданного индекса.If not specified or if 0 is specified, the statement defragments all partitions in the specified index.

WITH NO_INFOMSGSWITH NO_INFOMSGS
Подавляет все информационные сообщения со степенями серьезности от 0 до 10.Suppresses all informational messages that have severity levels from 0 through 10.

RemarksRemarks

Инструкция DBCC INDEXDEFRAG дефрагментирует конечный уровень индекса, приводя физический порядок страниц в соответствие логическому порядку конечных узлов слева направо, что повышает эффективность сканирования индекса.DBCC INDEXDEFRAG defragments the leaf level of an index so that the physical order of the pages matches the left-to-right logical order of the leaf nodes, therefore improving index-scanning performance.

Примечание

При выполнении инструкции DBCC INDEXDEFRAG дефрагментация индекса осуществляется последовательно.When DBCC INDEXDEFRAG is run, index defragmentation occurs serially. Это означает, что операции над одним индексом выполняются в одном потокеThis means that the operation on a single index is performed using a single thread. без параллелизма.No parallelism occurs. Операции над несколькими индексами, относящиеся к одной инструкции DBCC INDEXDEFRAG, выполняются над одним индексом за раз.Also, operations on multiple indexes from the same DBCC INDEXDEFRAG statement are performed on one index at a time.

Кроме того, инструкция DBCC INDEXDEFRAG сжимает страницы индекса с учетом коэффициента заполнения, указанного при создании индекса.DBCC INDEXDEFRAG also compacts the pages of an index, taking into consideration the fill factor specified when the index was created. Любые пустые страницы при этом удаляются.Any empty pages created because of this compaction are removed. Дополнительные сведения см. в статье Указание коэффициента заполнения для индекса.For more information, see Specify Fill Factor for an Index.

Если индекс охватывает более одного файла, инструкция DBCC INDEXDEFRAG дефрагментирует по одному файлу за раз.If an index spans more than one file, DBCC INDEXDEFRAG defragments one file at a time. Страницы не перемещаются между файлами.Pages do not migrate between files.

Инструкция DBCC INDEXDEFRAG сообщает процент выполнения дефрагментации каждые пять минут.DBCC INDEXDEFRAG reports the estimated percentage completed every five minutes. Дефрагментацию можно остановить в любой момент, при этом вся выполненная работа сохраняется.DBCC INDEXDEFRAG can be stopped at any point in the process, and any completed work is retained.

В отличие от инструкции DBCC DBREINDEX и операций создания индексов вообще, инструкция DBCC INDEXDEFRAG выполняется в режиме в сети.Unlike DBCC DBREINDEX, or the index building operation generally, DBCC INDEXDEFRAG is an online operation. Она не удерживает блокировки длительное время.It does not hold locks long term. Таким образом, она не блокирует выполнение запросов или обновлений.Therefore, DBCC INDEXDEFRAG does not block running queries or updates. Так как время дефрагментации зависит от степени фрагментации, сравнительно нефрагментированный индекс иногда можно дефрагментировать быстрее, чем создать новый индекс.Because the time to defragment is related to the level of fragmentation, a relatively unfragmented index can be defragmented faster than a new index can be built. На дефрагментацию сильно фрагментированного индекса может уйти гораздо больше времени, чем на его создание заново.A very fragmented index might take considerably longer to defragment than to rebuild.

Процесс дефрагментации всегда полностью регистрируется в журнале независимо от модели восстановления баз данных.The defragmentation is always fully logged, regardless of the database recovery model setting. Дополнительные сведения см. в разделе ALTER DATABASE (Transact-SQL).For more information, see ALTER DATABASE (Transact-SQL). Дефрагментация сильно фрагментированного индекса может привести к записи большего объема данных, чем создание индекса с полной регистрацией в журнале.The defragmentation of a very fragmented index can generate more log than a fully logged index creation. Однако дефрагментация выполняется как ряд кратких транзакций, поэтому она не требует большого журнала, если часто создаются резервные копии журнала или если применяется простая (SIMPLE) модель восстановления.However, the defragmentation is performed as a series of short transactions, so a large log is unnecessary if log backups are taken frequently or if the recovery model setting is SIMPLE.

ОграниченияRestrictions

Инструкция DBCC INDEXDEFRAG перемещает конечные страницы индекса в произвольном порядке.DBCC INDEXDEFRAG shuffles index leaf pages in place. Таким образом, если содержимое индекса чередуется на диске с содержимым других индексов, выполнение инструкции DBCC INDEXDEFRAG для этого индекса не приведет к расположению всех конечных страниц индекса в последовательном порядке.Therefore, if an index is interleaved with other indexes on disk, running DBCC INDEXDEFRAG against that index does not make all leaf pages in the index contiguous. Чтобы улучшить кластеризацию страниц, создайте индекс заново.To improve the clustering of pages, rebuild the index. Инструкция DBCC INDEXDEFRAG не может быть использована для дефрагментации следующих индексов.DBCC INDEXDEFRAG cannot be used to defragment the following indexes:

  • Отключенный индекс.A disabled index.
  • Индекс с отключенной блокировкой страниц.An index with page locking set to OFF.
  • Пространственный индекс.A spatial index.

Эта инструкция не поддерживает системные таблицы.DBCC INDEXDEFRAG is not supported for use on system tables.

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

Если в инструкции DBCC INDEXDEFRAG указан индекс (но не указан аргумент WITH NO_INFOMSGS), она возвращает следующий результирующий набор (значения могут быть иными):DBCC INDEXDEFRAG returns the following result set (values may vary) if an index is specified in the statement (unless WITH NO_INFOMSGS is specified):

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.  

РазрешенияPermissions

Вызывающий должен быть владельцем таблицы, членом предопределенной роли сервера sysadmin, предопределенной роли базы данных db_owner или предопределенной роли базы данных db_ddladmin.Caller must own the table, or be a member of the sysadmin fixed server role, the db_owner fixed database role, or the db_ddladmin fixed database role.

ПримерыExamples

A.A. Использование DBCC INDEXDEFRAG для дефрагментации индексаUsing DBCC INDEXDEFRAG to defragment an index

Приведенный ниже код дефрагментирует все секции индекса PK_Product_ProductID таблицы Production.Product в базе данных AdventureWorks.The following example defragments all partitions of the PK_Product_ProductID index in the Production.Product table in the AdventureWorks database.

DBCC INDEXDEFRAG (AdventureWorks2012, 'Production.Product', PK_Product_ProductID);  
GO  

Б.B. Использование DBCC SHOWCONTIG и DBCC INDEXDEFRAG для дефрагментации индексов в базе данныхUsing DBCC SHOWCONTIG and DBCC INDEXDEFRAG to defragment the indexes in a database

В следующем примере показан простой способ дефрагментации всех индексов базы данных, фрагментированной сверх определенного порога.The following example shows a simple way to defragment all indexes in a database that are fragmented above a declared threshold.

/*Perform a 'USE <database name>' to select the database in which to run the script.*/  
-- Declare variables  
SET NOCOUNT ON;  
DECLARE @tablename VARCHAR(255);  
DECLARE @execstr   VARCHAR(400);  
DECLARE @objectid  INT;  
DECLARE @indexid   INT;  
DECLARE @frag      DECIMAL;  
DECLARE @maxfrag   DECIMAL;  
  
-- Decide on the maximum fragmentation to allow for.  
SELECT @maxfrag = 30.0;  
  
-- Declare a cursor.  
DECLARE tables CURSOR FOR  
   SELECT TABLE_SCHEMA + '.' + TABLE_NAME  
   FROM INFORMATION_SCHEMA.TABLES  
   WHERE TABLE_TYPE = 'BASE TABLE';  
  
-- Create the table.  
CREATE TABLE #fraglist (  
   ObjectName CHAR(255),  
   ObjectId INT,  
   IndexName CHAR(255),  
   IndexId INT,  
   Lvl INT,  
   CountPages INT,  
   CountRows INT,  
   MinRecSize INT,  
   MaxRecSize INT,  
   AvgRecSize INT,  
   ForRecCount INT,  
   Extents INT,  
   ExtentSwitches INT,  
   AvgFreeBytes INT,  
   AvgPageDensity INT,  
   ScanDensity DECIMAL,  
   BestCount INT,  
   ActualCount INT,  
   LogicalFrag DECIMAL,  
   ExtentFrag DECIMAL);  
  
-- Open the cursor.  
OPEN tables;  
  
-- Loop through all the tables in the database.  
FETCH NEXT  
   FROM tables  
   INTO @tablename;  
  
WHILE @@FETCH_STATUS = 0  
BEGIN  
-- Do the showcontig of all indexes of the table  
   INSERT INTO #fraglist   
   EXEC ('DBCC SHOWCONTIG (''' + @tablename + ''')   
      WITH FAST, TABLERESULTS, ALL_INDEXES, NO_INFOMSGS');  
   FETCH NEXT  
      FROM tables  
      INTO @tablename;  
END;  
  
-- Close and deallocate the cursor.  
CLOSE tables;  
DEALLOCATE tables;  
  
-- Declare the cursor for the list of indexes to be defragged.  
DECLARE indexes CURSOR FOR  
   SELECT ObjectName, ObjectId, IndexId, LogicalFrag  
   FROM #fraglist  
   WHERE LogicalFrag >= @maxfrag  
      AND INDEXPROPERTY (ObjectId, IndexName, 'IndexDepth') > 0;  
  
-- Open the cursor.  
OPEN indexes;  
  
-- Loop through the indexes.  
FETCH NEXT  
   FROM indexes  
   INTO @tablename, @objectid, @indexid, @frag;  
  
WHILE @@FETCH_STATUS = 0  
BEGIN  
   PRINT 'Executing DBCC INDEXDEFRAG (0, ' + RTRIM(@tablename) + ',  
      ' + RTRIM(@indexid) + ') - fragmentation currently '  
       + RTRIM(CONVERT(varchar(15),@frag)) + '%';  
   SELECT @execstr = 'DBCC INDEXDEFRAG (0, ' + RTRIM(@objectid) + ',  
       ' + RTRIM(@indexid) + ')';  
   EXEC (@execstr);  
  
   FETCH NEXT  
      FROM indexes  
      INTO @tablename, @objectid, @indexid, @frag;  
END;  
  
-- Close and deallocate the cursor.  
CLOSE indexes;  
DEALLOCATE indexes;  
  
-- Delete the temporary table.  
DROP TABLE #fraglist;  
GO  

См. также:See Also

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