ALTER INDEX (Transact-SQL)ALTER INDEX (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure даAzure Synapse Analytics (хранилище данных SQL) даParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Изменяет существующий индекс таблицы или представления (rowstore, columnstore или XML) посредством его отключения, перестройки или реорганизации либо посредством настройки параметров индекса.Modifies an existing table or view index (rowstore, columnstore, or XML) by disabling, rebuilding, or reorganizing the index; or by setting options on the index.

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

СинтаксисSyntax

-- Syntax for SQL Server and Azure SQL Database
  
ALTER INDEX { index_name | ALL } ON <object>  
{  
      REBUILD {  
            [ PARTITION = ALL ] [ WITH ( <rebuild_index_option> [ ,...n ] ) ]   
          | [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_index_option> ) [ ,...n ] ]  
      }  
    | DISABLE  
    | REORGANIZE  [ PARTITION = partition_number ] [ WITH ( <reorganize_option>  ) ]  
    | SET ( <set_index_option> [ ,...n ] )   
    | RESUME [WITH (<resumable_index_options>,[...n])]
    | PAUSE
    | ABORT
}  
[ ; ]  
  
<object> ::=   
{  
    { database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }  
}  
  
<rebuild_index_option > ::=  
{  
      PAD_INDEX = { ON | OFF }  
    | FILLFACTOR = fillfactor   
    | SORT_IN_TEMPDB = { ON | OFF }  
    | IGNORE_DUP_KEY = { ON | OFF }  
    | STATISTICS_NORECOMPUTE = { ON | OFF }  
    | STATISTICS_INCREMENTAL = { ON | OFF }  
    | ONLINE = {   
          ON [ ( <low_priority_lock_wait> ) ]   
        | OFF } 
    | RESUMABLE = { ON | OFF } 
    | MAX_DURATION = <time> [MINUTES}     
    | ALLOW_ROW_LOCKS = { ON | OFF }  
    | ALLOW_PAGE_LOCKS = { ON | OFF }  
    | MAXDOP = max_degree_of_parallelism  
    | COMPRESSION_DELAY = {0 | delay [Minutes]}  
    | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE }   
        [ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]  
}  
  
<single_partition_rebuild_index_option> ::=  
{  
      SORT_IN_TEMPDB = { ON | OFF }  
    | MAXDOP = max_degree_of_parallelism  
    | RESUMABLE = { ON | OFF } 
    | MAX_DURATION = <time> [MINUTES}     
    | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE} }  
    | ONLINE = { ON [ ( <low_priority_lock_wait> ) ] | OFF }  
}  
  
<reorganize_option>::=  
{  
       LOB_COMPACTION = { ON | OFF }  
    |  COMPRESS_ALL_ROW_GROUPS =  { ON | OFF}  
}  
  
<set_index_option>::=  
{  
      ALLOW_ROW_LOCKS = { ON | OFF }  
    | ALLOW_PAGE_LOCKS = { ON | OFF }  
    | OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF}
    | IGNORE_DUP_KEY = { ON | OFF }  
    | STATISTICS_NORECOMPUTE = { ON | OFF }  
    | COMPRESSION_DELAY= {0 | delay [Minutes]}  
}  

<resumable_index_option> ::=
 { 
    MAXDOP = max_degree_of_parallelism
    | MAX_DURATION =<time> [MINUTES]
    | <low_priority_lock_wait>  
 }
 
<low_priority_lock_wait>::=  
{  
    WAIT_AT_LOW_PRIORITY ( MAX_DURATION = <time> [ MINUTES ] ,   
                          ABORT_AFTER_WAIT = { NONE | SELF | BLOCKERS } )  
}  

-- Syntax for SQL Data Warehouse and Parallel Data Warehouse 
  
ALTER INDEX { index_name | ALL }  
    ON   [ schema_name. ] table_name  
{  
      REBUILD {  
            [ PARTITION = ALL [ WITH ( <rebuild_index_option> ) ] ] 
          | [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_index_option> )] ] 
      }  
    | DISABLE  
    | REORGANIZE [ PARTITION = partition_number ]  
}  
[;]  

<rebuild_index_option > ::=   
{  
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
        [ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]   
}

<single_partition_rebuild_index_option > ::=   
{  
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }  
}  
  

АргументыArguments

index_nameindex_name
Имя индекса.Is the name of the index. Имена индексов должны быть уникальными в пределах таблицы или представления, но необязательно должны быть уникальными в пределах базы данных.Index names must be unique within a table or view but do not have to be unique within a database. Имена индексов должны удовлетворять правилам для идентификаторов.Index names must follow the rules of identifiers.

ALLALL
Указывает все индексы, связанные с таблицей или представлением, независимо от типа индекса.Specifies all indexes associated with the table or view regardless of the index type. Если указывается ключевое слово ALL, то инструкция не будет выполнена, если один или несколько индексов находятся вне сети или предназначенной только для чтения файловой группе или указанная операция запрещена для одного или нескольких типов индекса.Specifying ALL causes the statement to fail if one or more indexes are in an offline or read-only filegroup or the specified operation is not allowed on one or more index types. В следующей таблице перечислены операции с индексами и запрещенные типы индексов.The following table lists the index operations and disallowed index types.

Использование ключевого слова ALL с этой операциейUsing the keyword ALL with this operation Отказывает, если в таблице имеется один или несколькоFails if the table has one or more
REBUILD WITH ONLINE = ONREBUILD WITH ONLINE = ON XML-индексXML index

Пространственный индексSpatial index

Индекс columnstore: Применимо к: SQL ServerSQL Server (начиная с SQL Server 2012 (11.x)SQL Server 2012 (11.x)) и База данных SQL AzureAzure SQL Database.Columnstore index: Applies to: SQL ServerSQL Server (Starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x)) and База данных SQL AzureAzure SQL Database
REBUILD PARTITION = partition_numberREBUILD PARTITION = partition_number Несекционированный, пространственный, отключенный индекс или XML-индексNonpartitioned index, XML index, spatial index, or disabled index
REORGANIZEREORGANIZE Индексы с параметром ALLOW_PAGE_LOCKS, равным OFFIndexes with ALLOW_PAGE_LOCKS set to OFF
REORGANIZE PARTITION = partition_numberREORGANIZE PARTITION = partition_number Несекционированный, пространственный, отключенный индекс или XML-индексNonpartitioned index, XML index, spatial index, or disabled index
IGNORE_DUP_KEY = ONIGNORE_DUP_KEY = ON XML-индексXML index

Пространственный индексSpatial index

Индекс columnstore: Применимо к: SQL ServerSQL Server (начиная с SQL Server 2012 (11.x)SQL Server 2012 (11.x)) и База данных SQL AzureAzure SQL Database.Columnstore index: Applies to: SQL ServerSQL Server (Starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x)) and База данных SQL AzureAzure SQL Database
ONLINE = ONONLINE = ON XML-индексXML index

Пространственный индексSpatial index

Индекс columnstore: Применимо к: SQL ServerSQL Server (начиная с SQL Server 2012 (11.x)SQL Server 2012 (11.x)) и База данных SQL AzureAzure SQL Database.Columnstore index: Applies to: SQL ServerSQL Server (Starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x)) and База данных SQL AzureAzure SQL Database
RESUMABLE = ONRESUMABLE = ON Возобновляемые индексы не поддерживаются с ключевым словом All.Resumable indexes not supported with All keyword.

Область применения: SQL ServerSQL Server (начиная с SQL Server 2017 (14.x)SQL Server 2017 (14.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and База данных SQL AzureAzure SQL Database

Предупреждение

Более подробные сведения об операциях с индексами, которые можно выполнить в сети, см. в разделе Рекомендации по операциям с индексами в сети.For more detailed information about index operations that can be performed online, see Guidelines for Online Index Operations.

Если ключевое слово ALL указывается вместе с PARTITION = partition_number, то все индексы должны быть выровнены.If ALL is specified with PARTITION = partition_number, all indexes must be aligned. Следовательно, они секционируются на основе эквивалентных функций секционирования.This means that they are partitioned based on equivalent partition functions. При использовании ключевого слова ALL вместе с PARTITION все индексные секции с одинаковым аргументом partition_number будут перестроены или реорганизованы.Using ALL with PARTITION causes all index partitions with the same partition_number to be rebuilt or reorganized. Дополнительные сведения о секционированных индексах см. в разделе Секционированные таблицы и индексы.For more information about partitioned indexes, see Partitioned Tables and Indexes.

database_namedatabase_name
Имя базы данных.Is the name of the database.

schema_nameschema_name
Имя схемы, которой принадлежит таблица или представление.Is the name of the schema to which the table or view belongs.

table_or_view_nametable_or_view_name
Имя таблицы или представления, связанного с индексом.Is the name of the table or view associated with the index. Чтобы отобразить отчет по индексам объекта, следует воспользоваться представлением каталога sys.indexes.To display a report of the indexes on an object, use the sys.indexes catalog view.

База данных SQLSQL Database поддерживает трехкомпонентный формат имени database_name.[schema_name].table_or_view_name, где database_name — текущая база данных или база данных tempdb, а имя таблицы или представления table_or_view_name начинается с #.supports the three-part name format database_name.[schema_name].table_or_view_name when the database_name is the current database or the database_name is tempdb and the table_or_view_name starts with #.

REBUILD [ WITH ( <rebuild_index_option> [ , ... n] ) ]REBUILD [ WITH (<rebuild_index_option> [ ,... n]) ]

Область применения: SQL ServerSQL Server (начиная с SQL Server 2012 (11.x)SQL Server 2012 (11.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x)) and База данных SQL AzureAzure SQL Database

Указывает, что индекс будет перестроен с использованием тех же столбцов, типов индекса, атрибута уникальности и порядка сортировки.Specifies the index will be rebuilt using the same columns, index type, uniqueness attribute, and sort order. Это предложение эквивалентно DBCC DBREINDEX.This clause is equivalent to DBCC DBREINDEX. REBUILD включает отключенный индекс.REBUILD enables a disabled index. При перестройке кластеризованного индекса не перестраиваются ассоциированные некластеризованные индексы, если только не указано ключевое слово ALL.Rebuilding a clustered index does not rebuild associated nonclustered indexes unless the keyword ALL is specified. Если параметры индекса не заданы, то применяется существующий параметр индекса, который хранится в таблице sys.indexes.If index options are not specified, the existing index option values stored in sys.indexes are applied. Для любого параметра индекса, значение которого не хранится в таблице sys.indexes, применяется значение по умолчанию, указанное в определении аргумента.For any index option whose value is not stored in sys.indexes, the default indicated in the argument definition of the option applies.

Если указано ключевое слово ALL, а базовая таблица реализована в виде кучи, операция перестроения не воздействует на таблицу.If ALL is specified and the underlying table is a heap, the rebuild operation has no effect on the table. Перестраиваются все некластеризованные индексы, ассоциированные с таблицей.Any nonclustered indexes associated with the table are rebuilt.

Возможно минимальное протоколирование операции перестроения, если модель восстановления базы данных настроена на массовый или простой режим.The rebuild operation can be minimally logged if the database recovery model is set to either bulk-logged or simple.

Примечание

При перестроении первичного XML-индекса индексированная пользовательская таблица недоступна в течение действия операции с индексами.When you rebuild a primary XML index, the underlying user table is unavailable for the duration of the index operation.

Для индексов columnstore операция перестроения:For columnstore indexes, the rebuild operation:

  • Не использует порядок сортировки.Does not use the sort order.
  • Приобретает монопольную блокировку на таблице или секции на то время, как происходит перестроение.Acquires an exclusive lock on the table or partition while the rebuild occurs. Во время перестроения данные находятся в автономном режиме и недоступны даже при использовании NOLOCK, RCSI или SI.The data is "offline" and unavailable during the rebuild, even when using NOLOCK, RCSI, or SI.
  • Повторно сжимает все данные в columnstore.Re-compresses all data into the columnstore. Во время перестроения существуют две копии индекса columnstore.Two copies of the columnstore index exist while the rebuild is taking place. После завершения перестроения SQL ServerSQL Server удаляет исходный индекс columnstore.When the rebuild is finished, SQL ServerSQL Server deletes the original columnstore index.

Дополнительные сведения см. в статье Реорганизация и перестроение индексов.For more information, see Reorganize and Rebuild Indexes.

PARTITIONPARTITION

Область применения: SQL ServerSQL Server (начиная с SQL Server 2008SQL Server 2008) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and База данных SQL AzureAzure SQL Database

Указывает, что только одна секция индекса будет перестроена или реорганизована.Specifies that only one partition of an index will be rebuilt or reorganized. PARTITION не может быть указана, если аргумент index_name — несекционированный индекс.PARTITION cannot be specified if index_name is not a partitioned index.

PARTITION = ALL, перестроение всех секций.PARTITION = ALL rebuilds all partitions.

Предупреждение

Создание и перестройка невыровненных индексов для таблицы, количество секций в которой превышает 1000, возможны, но не поддерживаются.Creating and rebuilding nonaligned indexes on a table with more than 1,000 partitions is possible, but is not supported. Это может привести к снижению производительности или чрезмерному потреблению памяти во время таких операций.Doing so may cause degraded performance or excessive memory consumption during these operations. Если количество секций превышает 1000, рекомендуется использовать только выровненные индексы.Microsoft recommends using only aligned indexes when the number of partitions exceed 1,000.

partition_numberpartition_number

Область применения: SQL ServerSQL Server (начиная с SQL Server 2008SQL Server 2008) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and База данных SQL AzureAzure SQL Database

Количество секций секционированного индекса, который необходимо перестроить или реорганизовать.Is the partition number of a partitioned index that is to be rebuilt or reorganized. Аргумент partition_number является постоянным выражением, которое может обращаться к переменным.partition_number is a constant expression that can reference variables. К ним относятся переменные определяемых пользователем типов или функции и определяемые пользователем функции, но не ссылки на инструкции языка Transact-SQLTransact-SQL.These include user-defined type variables or functions and user-defined functions, but cannot reference a Transact-SQLTransact-SQL statement. partition_numberдолжен существовать, или выполнение инструкции завершится с ошибкой.partition_number must exist or the statement fails.

WITH ( <single_partition_rebuild_index_option> )WITH (<single_partition_rebuild_index_option>)

Область применения: SQL ServerSQL Server (начиная с SQL Server 2008SQL Server 2008) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and База данных SQL AzureAzure SQL Database

SORT_IN_TEMPDB, MAXDOP и DATA_COMPRESSION — это параметры, которые могут быть указаны при перестроении одиночной секции (PARTITION = номер_секции).SORT_IN_TEMPDB, MAXDOP, and DATA_COMPRESSION are the options that can be specified when you rebuild a single partition (PARTITION = partition_number). XML-индексы не могут быть указаны в операции перестроения одиночной секции.XML indexes cannot be specified in a single partition rebuild operation.

DISABLEDISABLE
Помечает индекс как отключенный и недоступный для использования компонентом Компонент Database EngineDatabase Engine.Marks the index as disabled and unavailable for use by the Компонент Database EngineDatabase Engine. Любой индекс может быть отключен.Any index can be disabled. Определение отключенного индекса остается в системном каталоге без базовых индексных данных.The index definition of a disabled index remains in the system catalog with no underlying index data. Отключение кластеризованного индекса блокирует доступ пользователя к данным базовой таблицы.Disabling a clustered index prevents user access to the underlying table data. Чтобы активировать индекс, следует использовать инструкцию ALTER INDEX REBUILD или CREATE INDEX WITH DROP_EXISTING.To enable an index, use ALTER INDEX REBUILD or CREATE INDEX WITH DROP_EXISTING. Дополнительные сведения см. в разделах Отключение индексов и ограничений и Включение индексов и ограничений.For more information, see Disable Indexes and Constraints and Enable Indexes and Constraints.

Операция REORGANIZE для индекса rowstoreREORGANIZE a rowstore index
Для индексов rowstore REORGANIZE указывает необходимость реорганизации конечного уровня индекса.For rowstore indexes, REORGANIZE specifies to reorganize the index leaf level. Операция REORGANIZE:The REORGANIZE operation is:

  • всегда выполняется в сети.Always performed online. Это означает, что долгосрочные блокировки таблицы не удерживаются и запросы или обновления базовой таблицы могут продолжаться во время выполнения транзакции ALTER INDEX REORGANIZE.This means long-term blocking table locks are not held and queries or updates to the underlying table can continue during the ALTER INDEX REORGANIZE transaction.
  • не разрешается для отключенного индекса;Not allowed for a disabled index
  • не разрешается, если параметру ALLOW_PAGE_LOCKS задано значение OFF;Not allowed when ALLOW_PAGE_LOCKS is set to OFF
  • при выполнении в транзакции не откатывается при откате транзакции.Not rolled back when it is performed within a transaction and the transaction is rolled back.

Дополнительные сведения см. в статье Реорганизация и перестроение индексов.For more information, see Reorganize and Rebuild Indexes.

REORGANIZE WITH ( LOB_COMPACTION = { ON | OFF } )REORGANIZE WITH ( LOB_COMPACTION = { ON | OFF } )
Применяется к индексам rowstore.Applies to rowstore indexes.

LOB_COMPACTION = ONLOB_COMPACTION = ON

  • Указывает сжатие всех страниц, содержащих данные следующих типов данных (LOB): image, text, ntext, varchar(max), nvarchar(max), varbinary(max) и xml.Specifies to compact all pages that contain data of these large object (LOB) data types: image, text, ntext, varchar(max), nvarchar(max), varbinary(max), and xml. Сжатие этих данных может привести к уменьшению размера данных на диске.Compacting this data can reduce the data size on disk.
  • Для кластеризованного индекса сжимаются все столбцы LOB, содержащиеся в таблице.For a clustered index, this compacts all LOB columns that are contained in the table.
  • Для некластеризованного индекса сжимаются все столбцы LOB, являющиеся неключевыми столбцами, включенными в индекс.For a nonclustered index, this compacts all LOB columns that are nonkey (included) columns in the index.
  • REORGANIZE ALL выполняет операцию LOB_COMPACTION для всех индексов.REORGANIZE ALL performs LOB_COMPACTION on all indexes. Для каждого индекса сжимаются все столбцы LOB в кластеризованном индексе, базовой таблице или включенные столбцы в некластеризованном индексе.For each index, this compacts all LOB columns in the clustered index, underlying table, or included columns in a nonclustered index.

LOB_COMPACTION = OFFLOB_COMPACTION = OFF

  • Все страницы, содержащие данные большого объекта, не сжимаются.Pages that contain large object data are not compacted.
  • Параметр OFF не влияет на кучу.OFF has no effect on a heap.

Операция REORGANIZE для индекса columnstoreREORGANIZE a columnstore index
Для индексов columnstore REORGANIZE сжимает каждую разностную группу строк CLOSED в columnstore в виде сжатой группы строк.For columnstore indexes, REORGANIZE compresses each CLOSED delta rowgroup into the columnstore as a compressed rowgroup. Операция REORGANIZE всегда выполняется в сети.The REORGANIZE operation is always performed online. Это означает, что долгосрочные блокировки таблицы не удерживаются и запросы или обновления базовой таблицы могут продолжаться во время выполнения транзакции ALTER INDEX REORGANIZE.This means long-term blocking table locks are not held and queries or updates to the underlying table can continue during the ALTER INDEX REORGANIZE transaction. Дополнительные сведения см. в статье Реорганизация и перестроение индексов.For more information, see Reorganize and Rebuild Indexes.

  • REORGANIZE не требуется для перемещения разностных групп строк CLOSED в сжатые группы строк.REORGANIZE is not required in order to move CLOSED delta rowgroups into compressed rowgroups. Для сжатия разностных групп строк CLOSE периодически активируется фоновый процесс перемещения кортежей (TM).The background tuple-mover (TM) process wakes up periodically to compress CLOSED delta rowgroups. REORGANIZE рекомендуется использовать при отставании процесса перемещения кортежей.We recommend using REORGANIZE when tuple-mover is falling behind. REORGANIZE может сжимать группы строк более агрессивно.REORGANIZE can compress rowgroups more aggressively.
  • Сведения о сжатии всех групп строк OPEN и CLOSED см. далее в разделе о параметре REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS).To compress all OPEN and CLOSED rowgroups, see the REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS) option in this section.

Для индексов columnstore в SQL ServerSQL Server (начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x)) и База данных SQL AzureAzure SQL Database инструкция REORGANIZE выполняет следующие дополнительные оптимизации дефрагментации с подключением к сети:For columnstore indexes in SQL ServerSQL Server (Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x)) and База данных SQL AzureAzure SQL Database, REORGANIZE performs the following additional defragmentation optimizations online:

  • Физически удаляет строки из группы строк, если были логически удалено 10 % или более строк.Physically removes rows from a rowgroup when 10% or more of the rows have been logically deleted. Удаленные байты освобождают место на физическом носителе.The deleted bytes are reclaimed on the physical media. Например, если в сжатой группе из 1 миллиона строк удалено 100 тысяч строк, SQL Server удалит эти строки и выполнит повторное сжатие группы с 900 тыс. строк.For example, if a compressed row group of 1 million rows has 100K rows deleted, SQL Server will remove the deleted rows and recompress the rowgroup with 900k rows. Группа будет сохранена в хранилище за счет удаления удаленных строк.It saves on the storage by removing deleted rows.

  • Объединяет одну или несколько сжатых группах строк для увеличения числа строк для каждой группы до максимального значения, составляющего 1 024 576 строк.Combines one or more compressed rowgroups to increase rows per rowgroup up to the maximum of 1,024,576 rows. Например, при массовом импорте 5 пакетов с 102 400 строками вы получите 5 сжатых групп строк.For example, if you bulk import 5 batches of 102,400 rows you will get 5 compressed rowgroups. При выполнении команды REORGANIZE эти групп строк будут объединены в 1 сжатую группу строк, содержащую 512 000 строк.If you run REORGANIZE, these rowgroups will get merged into 1 compressed rowgroup of size 512,000 rows. Предполагается отсутствие ограничений на размер словаря или объем памяти.This assumes there were no dictionary size or memory limitations.

  • SQL Server попытается объединить группу строк, в которой 10 % строк или больше были логически удалены, с одной или несколькими группами строк.For rowgroups in which 10% or more of the rows have been logically deleted, SQL Server will try to combine this rowgroup with one or more rowgroups. Например, группа строк 1 сжимается с 500 000 строками, а группа строк 21 сжимается с максимум 1 048 576 строками.For example, rowgroup 1 is compressed with 500,000 rows and rowgroup 21 is compressed with the maximum of 1,048,576 rows. В группе строк 21 удалено 60 % строк и осталось 409 830 строк.Rowgroup 21 has 60% of the rows deleted which leaves 409,830 rows. SQL Server объединяет этих две группы строк для сжатия новой группы строк, содержащей 909 830 строк.SQL Server favors combining these two rowgroups to compress a new rowgroup that has 909,830 rows.

REORGANIZE WITH ( COMPRESS_ALL_ROW_GROUPS = { ON | OFF } )REORGANIZE WITH ( COMPRESS_ALL_ROW_GROUPS = { ON | OFF } )
Применимо к индексам columnstore.Applies to columnstore indexes.

Применимо к: SQL ServerSQL Server (начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x)) and База данных SQL AzureAzure SQL Database

COMPRESS_ALL_ROW_GROUPS позволяет принудительно отправлять разностные группы строк OPEN или CLOSED в columnstore.COMPRESS_ALL_ROW_GROUPS provides a way to force OPEN or CLOSED delta rowgroups into the columnstore. При использовании этого параметра не требуется перестраивать индекс columnstore для очистки разностных групп строк.With this option, it is not necessary to rebuild the columnstore index to empty the delta rowgroups. Это, в сочетании и другими функциями дефрагментации удаления и слияния, отменяет необходимость перестроения индекса в большинстве случаев.This, combined with the other remove and merge defragmentation features makes it no longer necessary to rebuild the index in most situations.

  • ON принудительно отправляет все группы строк в columnstore независимо от размера и состояния (CLOSED или OPEN).ON forces all rowgroups into the columnstore, regardless of size and state (CLOSED or OPEN).
  • OFF принудительно отправляет все группы строк CLOSED в columnstore.OFF forces all CLOSED rowgroups into the columnstore.

Дополнительные сведения см. в статье Реорганизация и перестроение индексов.For more information, see Reorganize and Rebuild Indexes.

SET ( <set_index option> [ , ... n] )SET ( <set_index option> [ ,... n] )
Указывает параметры индекса без перестройки или реорганизации индекса.Specifies index options without rebuilding or reorganizing the index. SET нельзя указать для отключенного индекса.SET cannot be specified for a disabled index.

PAD_INDEX = { ON | OFF }PAD_INDEX = { ON | OFF }

Область применения: SQL ServerSQL Server (начиная с SQL Server 2008SQL Server 2008) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and База данных SQL AzureAzure SQL Database

Определяет разреженность индекса.Specifies index padding. Значение по умолчанию — OFF.The default is OFF.

ONON
Процент свободного места, определяемый параметром FILLFACTOR, применяется к страницам индекса промежуточного уровня.The percentage of free space that is specified by FILLFACTOR is applied to the intermediate-level pages of the index. Если параметр FILLFACTOR не указан и при этом параметру PAD_INDEX задано значение ON, то используется значение коэффициента заполнения, хранимое в таблице sys.indexes.If FILLFACTOR is not specified at the same time PAD_INDEX is set to ON, the fill factor value stored in sys.indexes is used.

OFF или fillfactor не указанOFF or fillfactor is not specified
Страницы промежуточного уровня заполняются почти полностью.The intermediate-level pages are filled to near capacity. При этом остается достаточно места по крайней мере для одной строки максимального размера, которого может достигать индекс, в зависимости от набора ключей в промежуточных страницах.This leaves sufficient space for at least one row of the maximum size that the index can have, based on the set of keys on the intermediate pages.

Дополнительные сведения см. в разделе CREATE INDEX (Transact-SQL).For more information, see CREATE INDEX (Transact-SQL).

FILLFACTOR = fillfactorFILLFACTOR = fillfactor

Область применения: SQL ServerSQL Server (начиная с SQL Server 2008SQL Server 2008) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and База данных SQL AzureAzure SQL Database

Определяет величину в процентах, показывающую насколько должен компонент Компонент Database EngineDatabase Engine заполнять конечный уровень каждой страницы индекса во время его создания и изменения.Specifies a percentage that indicates how full the Компонент Database EngineDatabase Engine should make the leaf level of each index page during index creation or alteration. Значение fillfactor должно быть целым числом от 1 до 100.fillfactor must be an integer value from 1 to 100. Значение по умолчанию равно 0.The default is 0. Значения коэффициентов заполнения 0 и 100 идентичны.Fill factor values 0 and 100 are the same in all respects.

Явный параметр FILLFACTOR применяется, только если индекс создается впервые или перестраивается.An explicit FILLFACTOR setting applies only when the index is first created or rebuilt. Компонент Компонент Database EngineDatabase Engine не сохраняет динамически указанный процентный объем свободного места на страницах.The Компонент Database EngineDatabase Engine does not dynamically keep the specified percentage of empty space in the pages. Дополнительные сведения см. в разделе CREATE INDEX (Transact-SQL).For more information, see CREATE INDEX (Transact-SQL).

Увидеть коэффициент заполнения можно в таблице sys.indexes.To view the fill factor setting, use sys.indexes.

Важно!

Создание или замена кластеризованного индекса со значением FILLFACTOR влияет на пространство памяти, занимаемое данными, так как компонент Компонент Database EngineDatabase Engine перераспределяет данные при создании кластеризованного индекса.Creating or altering a clustered index with a FILLFACTOR value affects the amount of storage space the data occupies, because the Компонент Database EngineDatabase Engine redistributes the data when it creates the clustered index.

SORT_IN_TEMPDB = { ON | OFF }SORT_IN_TEMPDB = { ON | OFF }

Область применения: SQL ServerSQL Server (начиная с SQL Server 2008SQL Server 2008) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and База данных SQL AzureAzure SQL Database

Указывает, следует ли сохранять результаты сортировки в базе данных tempdb.Specifies whether to store the sort results in tempdb. Значение по умолчанию — OFF, за исключением функции гипермасштабирования базы данных SQL Azure.The default is OFF except for Azure SQL Database Hyperscale. Для всех операций построения индекса в режиме гипермасштабирования параметр SORT_IN_TEMPDB всегда включен независимо от указанного параметра, если не используется возобновляемое перестроение индекса.For all index rebuild operations in Hyperscale, SORT_IN_TEMPDB is always ON, regardless of the option specified unless resumable index rebuild is used.

ONON
Промежуточные результаты сортировки, которые используются при индексировании, хранятся в базе данных tempdb.The intermediate sort results that are used to build the index are stored in tempdb. Это может сократить время, требуемое для создания индекса, если база данных tempdb размещена на иных дисках, нежели пользовательская база данных.If tempdb is on a different set of disks than the user database, this may reduce the time needed to create an index. Однако это увеличивает использование места на диске, которое используется при индексировании.However, this increases the amount of disk space that is used during the index build.

OFFOFF
Промежуточные результаты сортировки хранятся в той же базе данных, где и индекс.The intermediate sort results are stored in the same database as the index.

Если выполнение сортировки не требуется или если сортировка может быть выполнена в памяти, параметр SORT_IN_TEMPDB пропускается.If a sort operation is not required, or if the sort can be performed in memory, the SORT_IN_TEMPDB option is ignored.

Дополнительные сведения см. в разделе Параметр SORT_IN_TEMPDB для индексов.For more information, see SORT_IN_TEMPDB Option For Indexes.

IGNORE_DUP_KEY = { ON | OFF }IGNORE_DUP_KEY = { ON | OFF }
Определяет ответ на ошибку, случающуюся, когда операция вставки пытается вставить в уникальный индекс повторяющиеся значения ключа.Specifies the error response when an insert operation attempts to insert duplicate key values into a unique index. Параметр IGNORE_DUP_KEY применяется только к операциям вставки, производимым после создания или перестроения индекса.The IGNORE_DUP_KEY option applies only to insert operations after the index is created or rebuilt. Значение по умолчанию — OFF.The default is OFF.

ONON
Если в уникальный индекс вставляются повторяющиеся значения ключа, выводится предупреждающее сообщение.A warning message will occur when duplicate key values are inserted into a unique index. С ошибкой завершаются только строки, нарушающие ограничение уникальности.Only the rows violating the uniqueness constraint will fail.

OFFOFF
Если в уникальный индекс вставляются повторяющиеся значения ключа, выводится сообщение об ошибке.An error message will occur when duplicate key values are inserted into a unique index. Будет выполнен откат всей операции INSERT.The entire INSERT operation will be rolled back.

IGNORE_DUP_KEY нельзя установить в значение ON для индексов, создаваемых для представлений, неуникальных индексов, XML-индексов, пространственных индексов и фильтруемых индексов.IGNORE_DUP_KEY cannot be set to ON for indexes created on a view, non-unique indexes, XML indexes, spatial indexes, and filtered indexes.

Для просмотра значения IGNORE_DUP_KEY используйте sys.indexes.To view IGNORE_DUP_KEY, use sys.indexes.

Для обратной совместимости синтаксиса аргумент WITH IGNORE_DUP_KEY эквивалентен аргументу WITH IGNORE_DUP_KEY = ON.In backward compatible syntax, WITH IGNORE_DUP_KEY is equivalent to WITH IGNORE_DUP_KEY = ON.

STATISTICS_NORECOMPUTE = { ON | OFF }STATISTICS_NORECOMPUTE = { ON | OFF }
Указывает, выполнялся ли перерасчет статистики распределения.Specifies whether distribution statistics are recomputed. Значение по умолчанию — OFF.The default is OFF.

ONON
Устаревшие статистики не пересчитываются автоматически.Out-of-date statistics are not automatically recomputed.

OFFOFF
Автоматическое обновление статистических данных включено.Automatic statistics updating are enabled.

Чтобы восстановить автоматическое обновление статистики, следует установить STATISTICS_NORECOMPUTE в значение OFF или выполнить UPDATE STATISTICS без предложения NORECOMPUTE.To restore automatic statistics updating, set the STATISTICS_NORECOMPUTE to OFF, or execute UPDATE STATISTICS without the NORECOMPUTE clause.

Важно!

Отключение автоматического перерасчета статистики распределения может помешать оптимизатору запросов выбрать оптимальные планы выполнения запросов, обращенных к таблице.Disabling automatic recomputation of distribution statistics may prevent the Query Optimizer from picking optimal execution plans for queries that involve the table.

STATISTICS_INCREMENTAL = { ON | OFF }STATISTICS_INCREMENTAL = { ON | OFF }

Область применения: SQL ServerSQL Server (начиная с SQL Server 2014 (12.x)SQL Server 2014 (12.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2014 (12.x)SQL Server 2014 (12.x)) and База данных SQL AzureAzure SQL Database

При значении ON статистики создаются как статистики отдельно по секциям.When ON, the statistics created are per partition statistics. При значении OFF дерево статистик удаляется и SQL ServerSQL Server повторно вычисляет статистики.When OFF, the statistics tree is dropped and SQL ServerSQL Server re-computes the statistics. Значение по умолчанию — OFF.The default is OFF.

Если статистики по секциям не поддерживаются, параметр пропускается и выводится предупреждение.If per partition statistics are not supported the option is ignored and a warning is generated. Добавочные статистики не поддерживаются для следующих типов статистических данных.Incremental stats are not supported for following statistics types:

  • Статистика, созданная с индексами, не выровненными по секциям для базовой таблицы.Statistics created with indexes that are not partition-aligned with the base table
  • Статистика, созданная в доступных для чтения базах данных-получателях AlwaysOn.Statistics created on Always On readable secondary databases
  • Статистика, созданная в базах данных, доступных только для чтения.Statistics created on read-only databases
  • Статистика, созданная по фильтрованным индексам.Statistics created on filtered indexes
  • Статистика, созданная по представлениям.Statistics created on views
  • Статистика, созданная по внутренним таблицам.Statistics created on internal tables
  • Статистика, созданная с пространственными индексами или XML-индексами.Statistics created with spatial indexes or XML indexes

ONLINE = { ON | OFF } <as applies to rebuild_index_option>ONLINE = { ON | OFF } <as applies to rebuild_index_option>
Определяет, будут ли базовые таблицы и связанные индексы доступны для запросов и изменения данных во время операций с индексами.Specifies whether underlying tables and associated indexes are available for queries and data modification during the index operation. Значение по умолчанию — OFF.The default is OFF.

Для XML-индекса или пространственного индекса поддерживается только значение ONLINE = OFF. Если для ONLINE задано состояние ON, возникает ошибка.For an XML index or spatial index, only ONLINE = OFF is supported, and if ONLINE is set to ON an error is raised.

Важно!

Операции с индексами в сети доступны не во всех выпусках MicrosoftMicrosoft SQL ServerSQL Server.Online index operations are not available in every edition of MicrosoftMicrosoft SQL ServerSQL Server. Сведения о функциях, поддерживаемых различными выпусками SQL ServerSQL Server, см. в статьях Возможности, поддерживаемые различными выпусками SQL Server 2016 (13.x)SQL Server 2016 (13.x) и Возможности, поддерживаемые различными выпусками SQL Server 2017.For a list of features that are supported by the editions of SQL ServerSQL Server, see Editions and Supported Features for SQL Server 2016 (13.x)SQL Server 2016 (13.x) and Editions and Supported Features for SQL Server 2017.

ONON
Долгосрочные блокировки таблицы не поддерживаются во время операций с индексами.Long-term table locks are not held for the duration of the index operation. Во время главной фазы операций с индексами только блокировка с намерением совмещаемого доступа (IS) удерживается в исходной таблице.During the main phase of the index operation, only an Intent Share (IS) lock is held on the source table. Это позволяет продолжить выполнение запросов или обновлений для базовых таблиц и индексов.This allows queries or updates to the underlying table and indexes to continue. В начале операции совмещаемая блокировка (S) исходного объекта поддерживается в течение очень короткого времени.At the start of the operation, a Shared (S) lock is very briefly held on the source object. Если создается некластеризованный индекс, то по завершении операции на короткое время создается блокировка типа S (совмещаемая) для источника. Блокировка типа SCH-M (изменения схемы) запрашивается, если кластеризованный индекс создается или удаляется в режиме в сети либо, происходит перестроение кластеризованного или некластеризованного индекса.At the end of the operation, an S lock is very briefly held on the source if a nonclustered index is being created, or an SCH-M (Schema Modification) lock is acquired when a clustered index is created or dropped online, or when a clustered or nonclustered index is being rebuilt. При создании индекса для временной локальной таблицы параметр ONLINE не может принимать значение ON.ONLINE cannot be set to ON when an index is being created on a local temporary table.

OFFOFF
Блокировки таблиц применяются во время выполнения операций с индексами.Table locks are applied for the duration of the index operation. Операция с индексами в режиме «вне сети», которая создает, перестраивает или удаляет кластеризованный, пространственный или XML-индекс либо перестраивает или удаляет некластеризованный индекс, получает блокировку изменения схемы (Sch-M) для этой таблицы.An offline index operation that creates, rebuilds, or drops a clustered, spatial, or XML index, or rebuilds or drops a nonclustered index, acquires a Schema modification (Sch-M) lock on the table. Это предотвращает доступ к базовой таблице всех пользователей во время операции.This prevents all user access to the underlying table for the duration of the operation. Операция с индексами вне сети, создающая некластеризованный индекс, получает совмещаемую блокировку (S) в таблице.An offline index operation that creates a nonclustered index acquires a Shared (S) lock on the table. Это запрещает проводить обновления базовой таблицы, но разрешает проводить операции чтения, например инструкции SELECT.This prevents updates to the underlying table but allows read operations, such as SELECT statements.

Дополнительные сведения см. в статье Выполнение операции с индексами в сети.For more information, see Perform Index Operations Online.

Индексы, в том числе индексы глобальных временных таблиц, могут быть перестроены при подключении к сети, за исключением следующего:Indexes, including indexes on global temp tables, can be rebuilt online except for the following cases:

  • XML-индексXML index
  • Индекс локальной временной таблицыIndex on a local temp table
  • Исходные уникальные кластеризованные индексы представлений.Initial unique clustered index on a view
  • Индексы columnstoreColumnstore indexes
  • Кластеризованные индексы, если базовая таблица содержит типы данных LOB: image, ntext, text и пространственные типы данных.Clustered index, if the underlying table contains LOB data types (image, ntext, text) and spatial data types
  • Столбцы varchar(max) и varbinary(max) не могут быть частью индекса.varchar(max) and varbinary(max) columns cannot be part of an index. В SQL ServerSQL Server (начиная с версии SQL Server 2012 (11.x)SQL Server 2012 (11.x)) и База данных SQL AzureAzure SQL Database, если таблица содержит столбец varchar(max) или varbinary(max) , кластеризованный индекс, содержащий другие столбцы, можно построить или перестроить с использованием параметра ONLINE.In SQL ServerSQL Server (Starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x)) and База данных SQL AzureAzure SQL Database, when a table contains varchar(max) or varbinary(max) columns, a clustered index containing other columns can be built or rebuilt using the ONLINE option. База данных SQL AzureAzure SQL Database не разрешает использовать параметр ONLINE, если базовая таблица содержит столбец varchar(max) или varbinary(max) .does not permit the ONLINE option when the base table contains varchar(max) or varbinary(max) columns

Дополнительные сведения см. в разделе Об операциях с индексами в режиме "в сети".For more information, see How Online Index Operations Work.

RESUMABLE = { ON | OFF}RESUMABLE = { ON | OFF}

Область применения: SQL ServerSQL Server (начиная с SQL Server 2017 (14.x)SQL Server 2017 (14.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and База данных SQL AzureAzure SQL Database

Указывает, является ли операция с индексами в режиме "в сети" возобновляемой.Specifies whether an online index operation is resumable.

Операция ON с индексами является возобновляемой.ON Index operation is resumable.

Операция OFF с индексами является невозобновляемой.OFF Index operation is not resumable.

MAX_DURATION = time [MINUTES] используется с RESUMABLE = ON (требуется ONLINE = ON).MAX_DURATION = time [MINUTES] used with RESUMABLE = ON (requires ONLINE = ON).

Область применения: SQL ServerSQL Server (начиная с SQL Server 2017 (14.x)SQL Server 2017 (14.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and База данных SQL AzureAzure SQL Database

Указывает время (целочисленное значение минутах), в течение которого выполняется возобновляемая операция с индексами в сети до приостановки.Indicates time (an integer value specified in minutes) that a resumable online index operation is executed before being paused.

Важно!

Более подробные сведения об операциях с индексами, которые можно выполнить в сети, см. в разделе Рекомендации по операциям с индексами в сети.For more detailed information about index operations that can be performed online, see Guidelines for Online Index Operations.

Примечание

Возобновляемое перестроение индекса с подключением к сети не поддерживается для индексов columnstore.Resumable online index rebuilds are not supported on columnstore indexes.

ALLOW_ROW_LOCKS = { ON | OFF }ALLOW_ROW_LOCKS = { ON | OFF }

Область применения: SQL ServerSQL Server (начиная с SQL Server 2008SQL Server 2008) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and База данных SQL AzureAzure SQL Database

Указывает, разрешена ли блокировка строк.Specifies whether row locks are allowed. Значение по умолчанию — ON.The default is ON.

ONON
Блокировки строк допустимы при доступе к индексу.Row locks are allowed when accessing the index. Компонент Компонент Database EngineDatabase Engine определяет, когда используются блокировки строки.The Компонент Database EngineDatabase Engine determines when row locks are used.

OFFOFF
Блокировки строк не используются.Row locks are not used.

ALLOW_PAGE_LOCKS = { ON | OFF }ALLOW_PAGE_LOCKS = { ON | OFF }

Область применения: SQL ServerSQL Server (начиная с SQL Server 2008SQL Server 2008) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and База данных SQL AzureAzure SQL Database

Указывает, разрешена ли блокировка страниц.Specifies whether page locks are allowed. Значение по умолчанию — ON.The default is ON.

ONON
Блокировки страниц допустимы при доступе к индексу.Page locks are allowed when you access the index. Компонент Компонент Database EngineDatabase Engine определяет, когда используются блокировки страниц.The Компонент Database EngineDatabase Engine determines when page locks are used.

OFFOFF
Блокировки страниц не используются.Page locks are not used.

Примечание

Индекс не может быть реорганизован, если ALLOW_PAGE_LOCKS установлен в состояние OFF.An index cannot be reorganized when ALLOW_PAGE_LOCKS is set to OFF.

OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }

Область применения: SQL ServerSQL Server (начиная с SQL Server 2019 (15.x)SQL Server 2019 (15.x)).Applies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)).

Определяет, следует ли выполнять оптимизацию, связанную с состязанием при операциях вставки на последнюю страницу.Specifies whether or not to optimize for last-page insert contention. Значение по умолчанию — OFF.The default is OFF. См. подробнее раздел о последовательных ключах в документации по CREATE INDEX.See the Sequential Keys section of the CREATE INDEX page for more information.

MAXDOP = max_degree_of_parallelismMAXDOP = max_degree_of_parallelism

Область применения: SQL ServerSQL Server (начиная с SQL Server 2008SQL Server 2008) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and База данных SQL AzureAzure SQL Database

Переопределяет параметр конфигурации max degree of parallelism на время выполнения операции с индексами.Overrides the max degree of parallelism configuration option for the duration of the index operation. Дополнительные сведения см. в разделе Настройка параметра конфигурации сервера max degree of parallelism.For more information, see Configure the max degree of parallelism Server Configuration Option. MAXDOP можно использовать для ограничения числа процессоров, используемых при параллельном выполнении планов.Use MAXDOP to limit the number of processors used in a parallel plan execution. Максимальное число процессоров — 64.The maximum is 64 processors.

Важно!

Хотя параметр MAXDOP синтаксически поддерживается для всех индексов XML, для пространственного или первичного XML-индекса инструкция ALTER INDEX в настоящее время использует только один процессор.Although the MAXDOP option is syntactically supported for all XML indexes, for a spatial index or a primary XML index, ALTER INDEX currently uses only a single processor.

Параметр max_degree_of_parallelism может иметь одно из следующих значений:max_degree_of_parallelism can be:

11
Подавляет формирование параллельных планов.Suppresses parallel plan generation.

>1>1
Ограничивает указанным значением максимальное число процессоров, используемых для параллельных операций с индексами.Restricts the maximum number of processors used in a parallel index operation to the specified number.

0 (по умолчанию)0 (default)
В зависимости от текущей рабочей нагрузки системы использует реальное или меньшее число процессоров.Uses the actual number of processors or fewer based on the current system workload.

Дополнительные сведения см. в статье Настройка параллельных операций с индексами.For more information, see Configure Parallel Index Operations.

Примечание

Параллельные операции с индексами доступны не во всех выпусках SQL ServerSQL Server.Parallel index operations are not available in every edition of SQL ServerSQL Server. Сведения о функциях, поддерживаемых различными выпусками SQL ServerSQL Server, см. в статье Возможности, поддерживаемые различными выпусками SQL Server 2016.For a list of features that are supported by the editions of SQL ServerSQL Server, see Editions and Supported Features for SQL Server 2016.

COMPRESSION_DELAY = { 0 |duration [Minutes] }COMPRESSION_DELAY = { 0 |duration [Minutes] }

Применимо к: SQL ServerSQL Server (начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x))Applies to: SQL ServerSQL Server (Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x))

Для таблицы на основе диска задержка указывает минимальное количество минут, в течение которых разностная группа строк в состоянии CLOSED должна оставаться в разностной группе строк до того, как SQL Server сожмет ее в сжатую группу строк.For a disk-based table, delay specifies the minimum number of minutes a delta rowgroup in the CLOSED state must remain in the delta rowgroup before SQL Server can compress it into the compressed rowgroup. Поскольку таблицы на основе диска не отслеживают время вставки и обновления отдельных строк, SQL Server применяет задержку к разностным группам строк в состоянии CLOSED.Since disk-based tables don't track insert and update times on individual rows, SQL Server applies the delay to delta rowgroups in the CLOSED state.
Значение по умолчанию — 0 минут.The default is 0 minutes.

Значение по умолчанию — 0 минут.The default is 0 minutes.

Рекомендации по использованию COMPRESSION_DELAY см. в разделе Начало работы с columnstore для получения операционной аналитики в реальном времени.For recommendations on when to use COMPRESSION_DELAY, see Get started with Columnstore for real time operational analytics.

DATA_COMPRESSIONDATA_COMPRESSION
Задает режим сжатия данных для указанного индекса, номера секции или диапазона секций.Specifies the data compression option for the specified index, partition number, or range of partitions. Существуют следующие варианты выбора.The options are as follows:

NoneNONE
Индекс или заданные секции не сжимаются.Index or specified partitions are not compressed. Это не относится к индексам columnstore.This does not apply to columnstore indexes.

ROWROW
Для индекса или заданных секций производится сжатие строк.Index or specified partitions are compressed by using row compression. Это не относится к индексам columnstore.This does not apply to columnstore indexes.

PAGEPAGE
Для индекса или заданных секций производится сжатие страниц.Index or specified partitions are compressed by using page compression. Это не относится к индексам columnstore.This does not apply to columnstore indexes.

COLUMNSTORECOLUMNSTORE

Область применения: SQL ServerSQL Server (начиная с SQL Server 2014 (12.x)SQL Server 2014 (12.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2014 (12.x)SQL Server 2014 (12.x)) and База данных SQL AzureAzure SQL Database

Применяется только к индексам columnstore, включая некластеризованные и кластеризованные индексы columnstore.Applies only to columnstore indexes, including both nonclustered columnstore and clustered columnstore indexes. COLUMNSTORE указывает, что должны быть распакованы индекс или конкретные секции, которые были упакованы с помощью параметра COLUMNSTORE_ARCHIVE.COLUMNSTORE specifies to decompress the index or specified partitions that are compressed with the COLUMNSTORE_ARCHIVE option. При восстановлении данных сжатие будет продолжаться с применением сжатия columnstore, предусмотренного для всех индексов columnstore.When the data is restored, it will continue to be compressed with the columnstore compression that is used for all columnstore indexes.

COLUMNSTORE_ARCHIVECOLUMNSTORE_ARCHIVE

Область применения: SQL ServerSQL Server (начиная с SQL Server 2014 (12.x)SQL Server 2014 (12.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2014 (12.x)SQL Server 2014 (12.x)) and База данных SQL AzureAzure SQL Database

Применяется только к индексам columnstore, включая некластеризованные и кластеризованные индексы columnstore.Applies only to columnstore indexes, including both nonclustered columnstore and clustered columnstore indexes. Параметр COLUMNSTORE_ARCHIVE обеспечивает дальнейшее сжатие указанной секции до еще меньшего размера.COLUMNSTORE_ARCHIVE will further compress the specified partition to a smaller size. Это может использоваться для архивации или в других ситуациях, где требуется уменьшение объема пространства и допускается увеличение затрат времени на сохранение и выборкуThis can be used for archival, or for other situations that require a smaller storage size and can afford more time for storage and retrieval.

Дополнительные сведения о сжатии см. в разделе Сжатие данных.For more information about compression, see Data Compression.

ON PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n] )ON PARTITIONS ( { <partition_number_expression> | <range> } [,...n] )

Область применения: SQL ServerSQL Server (начиная с SQL Server 2008SQL Server 2008) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and База данных SQL AzureAzure SQL Database

Указывает секции, к которым применяется параметр DATA_COMPRESSION.Specifies the partitions to which the DATA_COMPRESSION setting applies. Если индекс не секционирован, аргумент ON PARTITIONS создаст ошибку.If the index is not partitioned, the ON PARTITIONS argument will generate an error. Если не указано предложение ON PARTITIONS, то параметр DATA_COMPRESSION применяется ко всем секциям секционированного индекса.If the ON PARTITIONS clause is not provided, the DATA_COMPRESSION option applies to all partitions of a partitioned index.

<partition_number_expression> можно указать одним из следующих способов.<partition_number_expression> can be specified in the following ways:

  • указав номер секции, например ON PARTITIONS (2);Provide the number for a partition, for example: ON PARTITIONS (2).
  • указав номера нескольких секций, разделив их запятыми, например ON PARTITIONS (1, 5);Provide the partition numbers for several individual partitions separated by commas, for example: ON PARTITIONS (1, 5).
  • указав как диапазоны секций, так и отдельные секции, например ON PARTITIONS (2, 4, 6 TO 8).Provide both ranges and individual partitions: ON PARTITIONS (2, 4, 6 TO 8).

<range> можно указать номерами секций, разделенными ключевым словом TO, например: ON PARTITIONS (6 TO 8).<range> can be specified as partition numbers separated by the word TO, for example: ON PARTITIONS (6 TO 8).

Чтобы для разных секций задать разные типы сжатия данных, укажите параметр DATA_COMPRESSION несколько раз, например следующим образом.To set different types of data compression for different partitions, specify the DATA_COMPRESSION option more than once, for example:

REBUILD WITH   
(  
DATA_COMPRESSION = NONE ON PARTITIONS (1),   
DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8),   
DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5)  
);  

ONLINE = { ON | OFF } <применительно к single_partition_rebuild_index_option>ONLINE = { ON | OFF } <as applies to single_partition_rebuild_index_option>
Указывает, может ли быть перестроен индекс или секция индекса базовой таблицы в режиме "в сети" или "вне сети".Specifies whether an index or an index partition of an underlying table can be rebuilt online or offline. Если REBUILD выполняется в режиме "в сети" (ON), то данные таблицы доступны для запросов и изменения данных во время операций с индексами.If REBUILD is performed online (ON) the data in this table is available for queries and data modification during the index operation. Значение по умолчанию — OFF.The default is OFF.

ONON
Долгосрочные блокировки таблицы не поддерживаются во время операций с индексами.Long-term table locks are not held for the duration of the index operation. Во время главной фазы операций с индексами только блокировка с намерением совмещаемого доступа (IS) удерживается в исходной таблице.During the main phase of the index operation, only an Intent Share (IS) lock is held on the source table. Необходимо наличие S-блокировки таблицы в начале перестройки индекса и блокировки Sch-M на таблице в конце перестроения индекса в режиме "в сети".An S-lock on the table is required in the Starting of the index rebuild and a Sch-M lock on the table at the end of the online index rebuild. Обе блокировки являются короткими блокировками метаданных, но при этом блокировка изменения схемы (Sch-M) должна ожидать завершения всех блокирующих транзакций.Although both locks are short metadata locks, especially the Sch-M lock must wait for all blocking transactions to be completed. Во время ожидания Sch-M блокирует все другие транзакции, ожидающие за этой блокировкой доступа к одной таблице.During the wait time the Sch-M lock blocks all other transactions that wait behind this lock when accessing the same table.

Примечание

Перестроение индекса в режиме "в сети" может задать параметры low_priority_lock_wait, описанные ниже в этом разделе.Online index rebuild can set the low_priority_lock_wait options described later in this section.

OFFOFF
Блокировки таблиц применяются во время выполнения операций с индексами.Table locks are applied for the duration of the index operation. Это предотвращает доступ к базовой таблице всех пользователей во время операции.This prevents all user access to the underlying table for the duration of the operation.

WAIT_AT_LOW_PRIORITY используется только с ONLINE=ON.WAIT_AT_LOW_PRIORITY used with ONLINE=ON only.

Область применения: SQL ServerSQL Server (начиная с SQL Server 2014 (12.x)SQL Server 2014 (12.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2014 (12.x)SQL Server 2014 (12.x)) and База данных SQL AzureAzure SQL Database

Перестроение индекса в режиме «в сети» должно ожидать операции блокировки в этой таблице.An online index rebuild has to wait for blocking operations on this table. WAIT_AT_LOW_PRIORITY указывает, что операция перестроения индекса в режиме "в сети" будет ожидать блокировки с низким приоритетом, позволяя выполняться другим операциям, пока операция перестроения индекса в режиме "в сети" находится в состоянии ожидания.WAIT_AT_LOW_PRIORITY indicates that the online index rebuild operation will wait for low priority locks, allowing other operations to proceed while the online index build operation is waiting. Пропуск параметра WAIT AT LOW PRIORITY равнозначен использованию параметра WAIT_AT_LOW_PRIORITY (MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).Omitting the WAIT AT LOW PRIORITY option is equivalent to WAIT_AT_LOW_PRIORITY (MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE). Дополнительные сведения см. в разделе WAIT_AT_LOW_PRIORITY.For more information, see WAIT_AT_LOW_PRIORITY.

MAX_DURATION = time [MINUTES]MAX_DURATION = time [MINUTES]

Область применения: SQL ServerSQL Server (начиная с SQL Server 2014 (12.x)SQL Server 2014 (12.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2014 (12.x)SQL Server 2014 (12.x)) and База данных SQL AzureAzure SQL Database

Время ожидания (целочисленное значение, указанное в минутах) в течение которого блокировки для операции перестроения индекса в режиме «в сети» будут ожидать с низким приоритетом при выполнении команды DDL.The wait time (an integer value specified in minutes) that the online index rebuild locks will wait with low priority when executing the DDL command. Если операция будет заблокирована на время MAX_DURATION, будет выполнено одно из действий ABORT_AFTER_WAIT.If the operation is blocked for the MAX_DURATION time, one of the ABORT_AFTER_WAIT actions will be executed. Время MAX_DURATION всегда указывается в минутах, и слово MINUTES можно опустить.MAX_DURATION time is always in minutes, and the word MINUTES can be omitted.

ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS } ]ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS } ]

Область применения: SQL ServerSQL Server (начиная с SQL Server 2014 (12.x)SQL Server 2014 (12.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2014 (12.x)SQL Server 2014 (12.x)) and База данных SQL AzureAzure SQL Database

NoneNONE
Продолжить ожидание блокировки с обычным приоритетом.Continue waiting for the lock with normal (regular) priority.

SELFSELF
Прекратить операцию DDL по перестроению индекса в режиме «в сети», выполняемую в данный момент без выполнения какого-либо действия.Exit the online index rebuild DDL operation currently being executed without taking any action.

BLOCKERSBLOCKERS
Остановить все пользовательские транзакции, в данный момент блокирующие операцию DDL по перестроению индекса в режиме «в сети», чтобы можно было продолжить данную операцию.Kill all user transactions that block the online index rebuild DDL operation so that the operation can continue. Параметр BLOCKERS требует, чтобы у имени входа было разрешение ALTER ANY CONNECTION.The BLOCKERS option requires the login to have ALTER ANY CONNECTION permission.

RESUMERESUME

Область применения: SQL ServerSQL Server (начиная с SQL Server 2017 (14.x)SQL Server 2017 (14.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and База данных SQL AzureAzure SQL Database

Возобновить операцию с индексами, приостановленную вручную или из-за сбоя.Resume an index operation that is paused manually or due to a failure.

MAX_DURATION используется с RESUMABLE=ONMAX_DURATION used with RESUMABLE=ON

Область применения: SQL ServerSQL Server (начиная с SQL Server 2017 (14.x)SQL Server 2017 (14.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and База данных SQL AzureAzure SQL Database

Время (целочисленное значение минутах), в течение которого выполняется возобновляемая операция с индексами с подключением к сети после приостановки.The time (an integer value specified in minutes) that the resumable online index operation is executed after being resumed. После истечения этого времени возобновляемая операция приостанавливается, если она все еще выполнялась.Once the time expires, the resumable operation is paused if it is still running.

WAIT_AT_LOW_PRIORITY используется с RESUMABLE=ON и ONLINE = ON.WAIT_AT_LOW_PRIORITY used with RESUMABLE=ON and ONLINE = ON.

Область применения: SQL ServerSQL Server (начиная с SQL Server 2017 (14.x)SQL Server 2017 (14.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and База данных SQL AzureAzure SQL Database

Возобновление перестроения индекса в режиме "в сети" после приостановки должно ожидать операции блокировки в этой таблице.Resuming an online index rebuild after a pause has to wait for blocking operations on this table. WAIT_AT_LOW_PRIORITY указывает, что операция перестроения индекса в режиме "в сети" будет ожидать блокировки с низким приоритетом, позволяя выполняться другим операциям, пока операция перестроения индекса в режиме "в сети" находится в состоянии ожидания.WAIT_AT_LOW_PRIORITY indicates that the online index rebuild operation will wait for low priority locks, allowing other operations to proceed while the online index build operation is waiting. Пропуск параметра WAIT AT LOW PRIORITY равнозначен использованию параметра WAIT_AT_LOW_PRIORITY (MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).Omitting the WAIT AT LOW PRIORITY option is equivalent to WAIT_AT_LOW_PRIORITY (MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE). Дополнительные сведения см. в разделе WAIT_AT_LOW_PRIORITY.For more information, see WAIT_AT_LOW_PRIORITY.

PAUSEPAUSE

Область применения: SQL ServerSQL Server (начиная с SQL Server 2017 (14.x)SQL Server 2017 (14.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and База данных SQL AzureAzure SQL Database

Приостановить возобновляемую операцию перестроения индексов в режиме "в сети".Pause a resumable online index rebuild operation.

ABORTABORT

Область применения: SQL ServerSQL Server (начиная с SQL Server 2017 (14.x)SQL Server 2017 (14.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and База данных SQL AzureAzure SQL Database

Прервать выполняющуюся или приостановленную операцию с индексами, объявленную как возобновляемая.Abort a running or paused index operation that was declared as resumable. Чтобы прекратить возобновляемую операцию перестроения индексов, необходимо явно выполнить команду ABORT.You have to explicitly execute an ABORT command to terminate a resumable index rebuild operation. Сбой или приостановка возобновляемой операции с индексами не прекращает ее выполнение. Операция остается в неопределенном состоянии приостановки.Failure or pausing a resumable index operation does not terminate its execution; rather, it leaves the operation in an indefinite pause state.

RemarksRemarks

Инструкция ALTER INDEX не может использоваться для повторного секционирования индекса или его перемещения в другую файловую группу.ALTER INDEX cannot be used to repartition an index or move it to a different filegroup. Эта инструкция не может использоваться для изменения определения индекса, в том числе добавления или удаления столбцов или изменения порядка столбцов.This statement cannot be used to modify the index definition, such as adding or deleting columns or changing the column order. Для выполнения этих операций следует использовать инструкцию CREATE INDEX с предложением DROP_EXISTING.Use CREATE INDEX with the DROP_EXISTING clause to perform these operations.

Если параметр не указан явно, то применяется текущий параметр.When an option is not explicitly specified, the current setting is applied. Например, если параметр FILLFACTOR не указан в предложении REBUILD, то коэффициент заполнения, сохраненный в системном каталоге, будет использоваться в процессе перестроения.For example, if a FILLFACTOR setting is not specified in the REBUILD clause, the fill factor value stored in the system catalog will be used during the rebuild process. Для просмотра текущего параметра индекса следует использовать таблицу sys.indexes.To view the current index option settings, use sys.indexes.

Значения ONLINE, MAXDOP и SORT_IN_TEMPDB не хранятся в системном каталоге.The values for ONLINE, MAXDOP, and SORT_IN_TEMPDB are not stored in the system catalog. Если значение некоторого параметра не указано в инструкции индекса, то используется значение по умолчанию.Unless specified in the index statement, the default value for the option is used.

На компьютерах с несколькими процессорами инструкция ALTER INDEX REBUILD, как и другие запросы, использует больше процессоров для операций просмотра и сортировки, связанных с изменением индекса.On multiprocessor computers, just like other queries do, ALTER INDEX REBUILD automatically uses more processors to perform the scan and sort operations that are associated with modifying the index. При выполнении инструкции ALTER INDEX REORGANIZE без предложения LOB_COMPACTION или с ним значение аргумента max degree of parallelism представляет собой однопотоковую операцию.When you run ALTER INDEX REORGANIZE, with or without LOB_COMPACTION, the max degree of parallelism value is a single threaded operation. Дополнительные сведения см. в статье Настройка параллельных операций с индексами.For more information, see Configure Parallel Index Operations.

Важно!

Индекс нельзя реорганизовать или перестроить, если файловая группа, в которой он находится, размещена вне сети или предназначена только для чтения.An index cannot be reorganized or rebuilt if the filegroup in which it is located is offline or set to read-only. Если указывается ключевое слово ALL, а один или несколько индексов находятся в файловой группе, которая размещена вне сети или предназначена только для чтения, то выполнить инструкцию не удастся.When the keyword ALL is specified and one or more indexes are in an offline or read-only filegroup, the statement fails.

Перестроение индексовRebuilding Indexes

При перестроении старый индекс удаляется и создается новый.Rebuilding an index drops and re-creates the index. Таким образом, устраняется фрагментация, восстанавливается место на диске путем сжатия страниц с учетом указанного или существующего коэффициента заполнения, переупорядочиваются индексные строки в последовательных страницах.This removes fragmentation, reclaims disk space by compacting the pages based on the specified or existing fill factor setting, and reorders the index rows in contiguous pages. Если указывается ключевое слово ALL, то все индексы для таблицы удаляются и перестраиваются в одной транзакции.When ALL is specified, all indexes on the table are dropped and rebuilt in a single transaction. Ограничения FOREIGN KEY не обязательно отменять заранее.Foreign key constraints do not have to be dropped in advance. Если перестраиваются индексы с 128 или большим числом экстентов, то компонент Компонент Database EngineDatabase Engine откладывает процедуры освобождения страниц и связанные с ними блокировки до фиксации транзакции.When indexes with 128 extents or more are rebuilt, the Компонент Database EngineDatabase Engine defers the actual page deallocations, and their associated locks, until after the transaction commits.

Дополнительные сведения см. в статье Реорганизация и перестроение индексов.For more information, see Reorganize and Rebuild Indexes.

Реорганизация индексовReorganizing Indexes

Для реорганизации индекса требуется минимальный объем системных ресурсов.Reorganizing an index uses minimal system resources. При реорганизации концевой уровень кластеризованных и некластеризованных индексов на таблицах и представлениях дефрагментируется путем физической реорганизации страниц конечного уровня, в результате чего они выстраиваются в соответствии с логическим порядком конечных узлов (слева направо).It defragments the leaf level of clustered and nonclustered indexes on tables and views by physically reordering the leaf-level pages to match the logical, left to right, order of the leaf nodes. Кроме того, реорганизация сжимает страницы индекса.Reorganizing also compacts the index pages. Их сжатие производится в соответствии с текущим значением коэффициента заполнения.Compaction is based on the existing fill factor value.

Если указывается ключевое слово ALL, то реляционные индексы, как кластеризованные, так и некластеризованные, и XML-индексы для таблицы реорганизуются.When ALL is specified, relational indexes, both clustered and nonclustered, and XML indexes on the table are reorganized. Существуют некоторые ограничения при указаниии ALL. См. определение ALL в разделе "Аргументы" этой статьи.Some restrictions apply when specifying ALL, refer to the definition for ALL in the Arguments section of this article.

Дополнительные сведения см. в статье Реорганизация и перестроение индексов.For more information, see Reorganize and Rebuild Indexes.

Важно!

Для таблицы Хранилища данных SQL Azure с упорядоченным кластеризованным индексом columnstore ALTER INDEX REORGANIZE не будет выполнять повторную сортировку данных.For an Azure SQL Data Warehouse table with an ordered clustered columnstore index, ALTER INDEX REORGANIZE does not re-sort the data. Для повторной сортировки данных используйте ALTER INDEX REBUILD.To resort the data use ALTER INDEX REBUILD.

Отключение индексовDisabling Indexes

Отключение индексов предотвращает доступ пользователя к индексам в случае использования кластеризованных индексов к данным базовой таблицы.Disabling an index prevents user access to the index, and for clustered indexes, to the underlying table data. Определение индекса остается в системном каталоге.The index definition remains in the system catalog. Отключение некластеризованных индексов или кластеризованных индексов в представлении физически удаляет данные индекса.Disabling a nonclustered index or clustered index on a view physically deletes the index data. При отключении кластеризованного индекса блокируется доступ к данным, но данные остаются необслуживаемыми в сбалансированном дереве до тех пор, пока индекс не будет удален или перестроен.Disabling a clustered index prevents access to the data, but the data remains unmaintained in the B-tree until the index is dropped or rebuilt. Для просмотра состояния включенного или отключенного индекса следует направить запрос в столбец is_disabled в представлении каталога sys.indexes.To view the status of an enabled or disabled index, query the is_disabled column in the sys.indexes catalog view.

Если таблица входит в публикацию репликации транзакций, то нельзя отключить никакие индексы, связанные с первичными ключевыми столбцами.If a table is in a transactional replication publication, you cannot disable any indexes that are associated with primary key columns. Эти индексы необходимы для репликации.These indexes are required by replication. Чтобы отключить индексы, сначала необходимо удалить таблицу из публикации.To disable an index, you must first drop the table from the publication. Дополнительные сведения см. в статье Публикация данных и объектов базы данных.For more information, see Publish Data and Database Objects.

С помощью инструкции ALTER INDEX REBUILD или CREATE INDEX WITH DROP_EXISTING включите индекс.Use the ALTER INDEX REBUILD statement or the CREATE INDEX WITH DROP_EXISTING statement to enable the index. Перестроить отключенный кластеризованный индекс нельзя, если параметр ONLINE установлен в ON.Rebuilding a disabled clustered index cannot be performed with the ONLINE option set to ON. Дополнительные сведения см. в статье Отключение индексов и ограничений.For more information, see Disable Indexes and Constraints.

Настройка параметровSetting Options

Вы можете задать параметры ALLOW_ROW_LOCKS, ALLOW_PAGE_LOCKS, OPTIMIZE_FOR_SEQUENTIAL_KEY, IGNORE_DUP_KEY и STATISTICS_NORECOMPUTE для определенного индекса без перестройки или реорганизации этого индекса.You can set the options ALLOW_ROW_LOCKS, ALLOW_PAGE_LOCKS, OPTIMIZE_FOR_SEQUENTIAL_KEY, IGNORE_DUP_KEY and STATISTICS_NORECOMPUTE for a specified index without rebuilding or reorganizing that index. Измененные значения немедленно применяются к индексу.The modified values are immediately applied to the index. Для просмотра этих установок следует использовать таблицу sys.indexes.To view these settings, use sys.indexes. Дополнительные сведения см. в разделе Установка параметров индекса.For more information, see Set Index Options.

Параметры блокировок строк и страницRow and Page Locks Options

Когда присвоены значения ALLOW_ROW_LOCKS = ON и ALLOW_PAGE_LOCK = ON, при доступе к индексу допустимы блокировки на уровне строк, страниц и таблиц.When ALLOW_ROW_LOCKS = ON and ALLOW_PAGE_LOCK = ON, row-level, page-level, and table-level locks are allowed when you access the index. Компонент Компонент Database EngineDatabase Engine выбирает соответствующую блокировку и может повышать уровень с блокировки строки или страницы до блокировки таблицы.The Компонент Database EngineDatabase Engine chooses the appropriate lock and can escalate the lock from a row or page lock to a table lock.

Если присвоены значения ALLOW_ROW_LOCKS = OFF и ALLOW_PAGE_LOCK = OFF, при доступе к индексу допустима только блокировка на уровне таблиц.When ALLOW_ROW_LOCKS = OFF and ALLOW_PAGE_LOCK = OFF, only a table-level lock is allowed when you access the index.

Если при установке параметров блокировки строки или страницы указывается ключевое слово ALL, то установки применяются ко всем индексам.If ALL is specified when the row or page lock options are set, the settings are applied to all indexes. Если базовая таблица представляет собой кучу, установки применяются следующими способами:When the underlying table is a heap, the settings are applied in the following ways:

ALLOW_ROW_LOCKS = ON или OFFALLOW_ROW_LOCKS = ON or OFF Для кучи и любых соответствующих некластеризованных индексов.To the heap and any associated nonclustered indexes.
ALLOW_PAGE_LOCKS = ONALLOW_PAGE_LOCKS = ON Для кучи и любых соответствующих некластеризованных индексов.To the heap and any associated nonclustered indexes.
ALLOW_PAGE_LOCKS = OFFALLOW_PAGE_LOCKS = OFF Полностью для некластеризованных индексов.Fully to the nonclustered indexes. Это означает, что все блокировки страниц запрещаются для некластеризованных индексов.This means that all page locks are not allowed on the nonclustered indexes. В куче запрещены только общая блокировка (S), блокировка обновления (U) и монопольная блокировка (X) для страниц.On the heap, only the shared (S), update (U) and exclusive (X) locks for the page are not allowed. Компонент Компонент Database EngineDatabase Engine может запросить намеренную блокировку страницы (IS, IU или IX) для внутренних целей.The Компонент Database EngineDatabase Engine can still acquire an intent page lock (IS, IU or IX) for internal purposes.

Операции с индексами в режиме "в сети"Online Index Operations

Если при перестройке индекса параметр ONLINE установлен в значение ON, то базовые объекты, таблицы и связанные с ними индексы доступны для запросов и изменения данных.When rebuilding an index and the ONLINE option is set to ON, the underlying objects, the tables and associated indexes, are available for queries and data modification. Можно также перестроить в режиме «в сети» часть индекса, находящегося в одной секции.You can also rebuild online a portion of an index residing on a single partition. Монопольные блокировки таблиц удерживаются лишь на очень короткое время в процессе изменения.Exclusive table locks are held only for a very short amount of time during the alteration process.

Реорганизация индекса всегда выполняется в режиме в сети.Reorganizing an index is always performed online. Процесс не удерживает блокировку в течение долгого времени и поэтому не блокирует выполняемые запросы и обновления.The process does not hold locks long term and, therefore, does not block queries or updates that are running.

Параллельные операции с индексами в режиме «в сети» для одной таблицы или секции можно выполнять лишь при выполнении следующих действий:You can perform concurrent online index operations on the same table or table partition only when doing the following:

  • создание нескольких некластеризованных индексов;Creating multiple nonclustered indexes.
  • реорганизация различных индексов в одной таблице;Reorganizing different indexes on the same table.
  • реорганизация различных индексов при перестройке неперекрывающихся индексов в одной таблице.Reorganizing different indexes while rebuilding nonoverlapping indexes on the same table.

Все остальные попытки выполнения операций с индексами в сети завершаются ошибкой.All other online index operations performed at the same time fail. Например, нельзя одновременно перестроить два или несколько индексов в одной таблице или создать новый индекс в процессе перестройки существующего индекса для этой таблицы.For example, you cannot rebuild two or more indexes on the same table concurrently, or create a new index while rebuilding an existing index on the same table.

Возобновляемые операции с индексамиResumable index operations

Область применения: SQL ServerSQL Server (начиная с SQL Server 2017 (14.x)SQL Server 2017 (14.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and База данных SQL AzureAzure SQL Database

Операция ONLINE INDEX REBUILD указывается как возобновляемая с помощью параметра RESUMABLE = ON.Online index rebuild is specified as resumable using the RESUMABLE = ON option.

  • Параметр RESUMABLE не сохраняется в метаданных для указанного индекса и применяется только на время выполнения текущей инструкции DDL.The RESUMABLE option is not persisted in the metadata for a given index and applies only to the duration of a current DDL statement. Таким образом, для включения возобновляемости предложение RESUMABLE=ON должно быть указано явным образом.Therefore, the RESUMABLE = ON clause must be specified explicitly to enable resumability.

  • Параметр MAX_DURATION поддерживается для параметра RESUMABLE=ON или параметра аргумента low_priority_lock_wait.MAX_DURATION option is supported for RESUMABLE = ON option or the low_priority_lock_wait argument option.

    • Параметр MAX_DURATION для RESUMABLE задает временной интервал для перестраиваемого индекса.MAX_DURATION for RESUMABLE option specifies the time interval for an index being rebuild. После окончания этого времени операция перестроения индекса приостанавливается или завершает выполнение.Once this time is used the index rebuild is either paused or it completes its execution. Пользователь решает, когда можно возобновить перестроение приостановленного индекса.User decides when a rebuild for a paused index can be resumed. Значение time в минутах для MAX_DURATION должно быть больше 0 минут и меньше или равно 1 неделе (7 * 24 * 60 = 10 080 минут).The time in minutes for MAX_DURATION must be greater than 0 minutes and less or equal one week (7 * 24 * 60 = 10080 minutes). Длинная пауза в операции с индексами может повлиять на производительность DML в конкретной таблице, а также на емкость диска базы данных, поскольку они оба индексируют исходное и только что созданное требуемое место на диске и должны быть обновлены во время операций DML.Having a long pause for an index operation may impact the DML performance on a specific table as well as the database disk capacity since both indexes the original one and the newly created one require disk space and need to be updated during DML operations. Если параметр MAX_DURATION пропускается, операция с индексами будет продолжаться вплоть до ее завершения или до момента возникновения сбоя.If MAX_DURATION option is omitted, the index operation will continue until its completion or until a failure occurs.
    • Параметр аргумента <low_priority_lock_wait> позволяет решить, каким образом будет продолжена операция с индексами при SCH-M-блокировке.The <low_priority_lock_wait> argument option allows you to decide how the index operation can proceed when blocked on the SCH-M lock.
  • Повторное выполнение исходной инструкции ALTER INDEX REBUILD с теми же параметрами возобновляет приостановленную операцию перестроение индексов.Re-executing the original ALTER INDEX REBUILD statement with the same parameters resumes a paused index rebuild operation. Возобновить приостановленную операцию перестроения индексов можно также путем выполнения инструкции ALTER INDEX RESUME.You can also resume a paused index rebuild operation by executing the ALTER INDEX RESUME statement.

  • Параметр SORT_IN_TEMPDB = ON не поддерживается для возобновляемых индексов.The SORT_IN_TEMPDB=ON option is not supported for resumable index

  • Команду DDL с параметром RESUMABLE=ON невозможно выполнить внутри явной транзакции (она не может быть частью блока BEGIN TRAN ... COMMIT).The DDL command with RESUMABLE=ON cannot be executed inside an explicit transaction (cannot be part of begin tran ... commit block).

  • Возобновляемыми являются только приостановленные операции с индексами.Only index operations that are paused are resumable.

  • При возобновлении приостановленной операции с индексами можно изменить значение MAXDOP на новое.When resuming an index operation that is paused, you can change the MAXDOP value to a new value. Если параметр MAXDOP не указан при возобновлении приостановленной операции с индексами, берется последнее значение MAXDOP.If MAXDOP is not specified when resuming an index operation that is paused, the last MAXDOP value is taken. Если параметр MAXDOP вообще не указан для операции перестроения индексов, берется значение по умолчанию.IF the MAXDOP option is not specified at all for index rebuild operation, the default value is taken.

  • Чтобы немедленно приостановить операцию с индексами, можно остановить текущую команду (CTRL+C) либо выполнить команду ALTER INDEX PAUSE INDEX или KILL session_id.To pause immediately the index operation, you can stop the ongoing command (Ctrl-C) or you can execute the ALTER INDEX PAUSE command or the KILL session_id command. После приостановки команду можно возобновить с помощью параметра RESUME.Once the command is paused it can be resumed using RESUME option.

  • Команда ABORT разрывает сеанс, размещающий исходное перестроение индекса, и прерывает выполнение операции с индексами.The ABORT command kills the session that hosted the original index rebuild and aborts the index operation

  • Для возобновляемого перестроения индекса не требуются дополнительные ресурсы, за исключением перечисленных ниже.No extra resources are required for resumable index rebuild except for

    • Дополнительное место для хранения создаваемого индекса, включая время, когда индекс будет приостановлен.Additional space required to keep the index being built, including the time when index is being paused
    • Состояние DDL, запрещающее изменения DDL.A DDL state preventing any DDL modification
  • На этапе приостановки индекса будет выполняться процесс очистки фантомных записей, но он будет приостановлен во время выполнения индекса.The ghost cleanup will be running during the index pause phase, but it will be paused during index run
    Для возобновляемых операций перестроения индексов отключены следующие функциональные возможности.The following functionality is disabled for resumable index rebuild operations

    • Перестроение отключенного индекса не поддерживается с RESUMABLE = ON.Rebuilding an index that is disabled is not supported with RESUMABLE=ON
    • Команда ALTER INDEX REBUILD ALL.ALTER INDEX REBUILD ALL command
    • ALTER TABLE с командой DDL для перестроения индексаALTER TABLE using index rebuild
    • Команду DDL с параметром "RESUMABLE=ON" невозможно выполнить внутри явной транзакции (она не может быть частью блока BEGIN TRAN ... COMMIT)DDL command with "RESUMEABLE = ON" cannot be executed inside an explicit transaction (cannot be part of begin tran ... commit block)
    • Перестроение индекса, который содержит вычисляемые столбцы или столбцы TIMESTAMP в качестве ключевых столбцов.Rebuild an index that has computed or TIMESTAMP column(s) as key columns.
  • Если базовая таблица содержит столбцы LOB, для возобновляемого перестроения кластеризованных индексов требуется Sch-M-блокировка в начале этой операции.In case the base table contains LOB column(s) resumable clustered index rebuild requires a Sch-M lock in the Starting of this operation

Примечание

Команда DDL выполняется вплоть до завершения, приостанавливается или завершается ошибкой.The DDL command runs until it completes, pauses or fails. Если команда приостанавливается, возникнет ошибка, указывающая на приостановку операции и невозможность завершения создания индекса.In case the command pauses, an error will be issued indicating that the operation was paused and that the index creation did not complete. Дополнительные сведения о текущем состоянии индекса можно получить из sys.index_resumable_operations.More information about the current index status can be obtained from sys.index_resumable_operations. Как и в случае выше, при сбое также будет выведено сообщение об ошибке.As before in case of a failure an error will be issued as well.

Дополнительные сведения см. в статье Выполнение операции с индексами в сети.For more information, see Perform Index Operations Online.

WAIT_AT_LOW_PRIORITY с операциями с индексами в режиме "в сети"WAIT_AT_LOW_PRIORITY with online index operations

Для выполнения инструкции DDL для перестроения индекса в режиме «в сети» все активные блокирующие транзакции, выполняемые для конкретной таблицы, должны быть завершены.In order to execute the DDL statement for an online index rebuild, all active blocking transactions running on a particular table must be completed. Если выполняется перестроение индекса в режиме «в сети», то все новые транзакции, готовые к выполнению на данной таблице, блокируются.When the online index rebuild executes, it blocks all new transactions that are ready to start execution on this table. Хотя продолжительность блокировки для перестроения индекса в режиме «в сети» очень коротка, ожидание завершения всех открытых транзакций на данной таблице и блокировка новых запускаемых транзакций может значительно отразиться на пропускной способности и времени выполнения операции, а также значительно ограничить доступ к базовой таблице.Although the duration of the lock for online index rebuild is very short, waiting for all open transactions on a given table to complete and blocking the new transactions to start, might significantly affect the throughput, causing a workload slow down or timeout, and significantly limit access to the underlying table. Параметр WAIT_AT_LOW_PRIORITY позволяет администратору базы данных управлять S и Sch-M блокировками, необходимыми для перестроения индекса в режиме "в сети". Доступны 3 варианта.The WAIT_AT_LOW_PRIORITY option allows DBA's to manage the S-lock and Sch-M locks required for online index rebuilds and allows them to select one of 3 options. Во всех 3 случаях, если во время ожидания ( (MAX_DURATION = n [minutes]) ) нет блокирующих действий, перестроение индекса с подключением выполняется немедленно и без ожидания завершения инструкции DDL.In all 3 cases, if during the wait time ( (MAX_DURATION = n [minutes]) ), there are no blocking activities, the online index rebuild is executed immediately without waiting and the DDL statement is completed.

Ограничения пространственного индексаSpatial Index Restrictions

При перестроении пространственного индекса базовая пользовательская таблица недоступна на протяжении выполнения операции с индексом, поскольку пространственный индекс блокирует схему.When you rebuild a spatial index, the underlying user table is unavailable for the duration of the index operation because the spatial index holds a schema lock.

Ограничение PRIMARY KEY в пользовательской таблице не может быть изменено, пока для столбца этой таблицы определен пространственный индекс.The PRIMARY KEY constraint in the user table cannot be modified while a spatial index is defined on a column of that table. Для изменения ограничения PRIMARY KEY сначала необходимо удалить все пространственные индексы таблицы.To change the PRIMARY KEY constraint, first drop every spatial index of the table. После изменения ограничения PRIMARY KEY все пространственные индексы можно создать повторно.After modifying the PRIMARY KEy constraint, you can re-create each of the spatial indexes.

В отдельной операции перестроения секции невозможно указать пространственные индексы.In a single partition rebuild operation, you cannot specify any spatial indexes. Однако пространственные индексы можно указать при полном перестроении секции.However, you can specify spatial indexes in a complete partition rebuild.

Чтобы изменить параметры, характерные для пространственного индекса (такие как BOUNDING_BOX или GRID), необходимо либо применить инструкцию CREATE SPATIAL INDEX с параметром DROP_EXISTING = ON, либо удалить пространственный индекс и создать новый.To change options that are specific to a spatial index, such as BOUNDING_BOX or GRID, you can either use a CREATE SPATIAL INDEX statement that specifies DROP_EXISTING = ON, or drop the spatial index and create a new one. Пример см. в разделе CREATE SPATIAL INDEX (Transact-SQL).For an example, see CREATE SPATIAL INDEX (Transact-SQL).

Сжатие данныхData Compression

Дополнительную информацию о сжатии данных см. в разделе Сжатие данных.For a more information about data compression, see Data Compression.

Чтобы оценить, как изменение параметров сжатия PAGE и ROW повлияет на таблицу, индекс или секцию, используйте хранимую процедуру sp_estimate_data_compression_savings.To evaluate how changing PAGE and ROW compression will affect a table, an index, or a partition, use the sp_estimate_data_compression_savings stored procedure.

На секционированные индексы налагаются следующие ограничения.The following restrictions apply to partitioned indexes:

  • Если у таблицы есть невыровненные индексы, то изменить настройку сжатия отдельной секции с помощью инструкции ALTER INDEX ALL невозможно.When you use ALTER INDEX ALL ..., you cannot change the compression setting of a single partition if the table has nonaligned indexes.
  • Инструкция ALTER INDEX <index> ... REBUILD PARTITION ... производит перестроение указанной секции индекса.The ALTER INDEX <index> ... REBUILD PARTITION ... syntax rebuilds the specified partition of the index.
  • Инструкция ALTER INDEX <index> ... REBUILD WITH ... производит перестроение всех секций индекса.The ALTER INDEX <index> ... REBUILD WITH ... syntax rebuilds all partitions of the index.

СтатистикаStatistics

При применении инструкции ALTER INDEX ALL ... к таблице происходит обновление только тех статистических данных, которые связаны с индексами.When you execute ALTER INDEX ALL ... on a table, only the statistics associates with indexes are updated. Автоматические или созданные вручную статические данные таблицы (вместо индекса) не обновляются.Automatic or manual statistics created on the table (instead of an index) are not updated.

РазрешенияPermissions

Для выполнения ALTER INDEX необходимо иметь как минимум разрешение ALTER для таблицы или представления.To execute ALTER INDEX, at a minimum, ALTER permission on the table or view is required.

Заметки о версииVersion Notes

  • База данных SQLSQL Database не использует параметры файловой группы и файлового потока.does not use filegroup and filestream options.
  • Индексы columnstore недоступны до SQL Server 2012 (11.x)SQL Server 2012 (11.x).Columnstore indexes are not available prior to SQL Server 2012 (11.x)SQL Server 2012 (11.x).
  • Возобновляемые операции с индексами будут доступны начиная с SQL Server 2017 (14.x)SQL Server 2017 (14.x) для База данных SQL AzureAzure SQL Database.Resumable index operations are available Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x) База данных SQL AzureAzure SQL Database

Пример основного синтаксиса:Basic syntax example:

ALTER INDEX index1 ON table1 REBUILD;  
  
ALTER INDEX ALL ON table1 REBUILD;  
  
ALTER INDEX ALL ON dbo.table1 REBUILD;  

Примеры: Индексы columnstoreExamples: Columnstore Indexes

Эти примеры относятся к индексам columnstore.These examples apply to columnstore indexes.

A.A. Демонстрация REORGANIZEREORGANIZE demo

В этом примере показана работа команды ALTER INDEX REORGANIZE.This example demonstrates how the ALTER INDEX REORGANIZE command works. В нем создается таблица с несколькими группами строк и показано использование команды REORGANIZE для объединения этих групп строк.It creates a table that has multiple rowgroups, and then demonstrates how REORGANIZE merges the rowgroups.

-- Create a database   
CREATE DATABASE [ columnstore ];  
GO  
  
-- Create a rowstore staging table  
CREATE TABLE [ staging ] (  
     AccountKey              int NOT NULL,  
     AccountDescription      nvarchar (50),  
     AccountType             nvarchar(50),  
     AccountCodeAlternateKey     int  
     )  
  
-- Insert 10 million rows into the staging table.   
DECLARE @loop int  
DECLARE @AccountDescription varchar(50)  
DECLARE @AccountKey int  
DECLARE @AccountType varchar(50)  
DECLARE @AccountCode int  
  
SELECT @loop = 0  
BEGIN TRAN  
    WHILE (@loop < 300000)   
      BEGIN  
        SELECT @AccountKey = CAST (RAND()*10000000 as int);  
        SELECT @AccountDescription = 'accountdesc ' + CONVERT(varchar(20), @AccountKey);  
        SELECT @AccountType = 'AccountType ' + CONVERT(varchar(20), @AccountKey);  
        SELECT @AccountCode =  CAST (RAND()*10000000 as int);  
  
        INSERT INTO  staging VALUES (@AccountKey, @AccountDescription, @AccountType, @AccountCode);  
  
        SELECT @loop = @loop + 1;  
    END  
COMMIT  
  
-- Create a table for the clustered columnstore index  
  
CREATE TABLE cci_target (  
     AccountKey              int NOT NULL,  
     AccountDescription      nvarchar (50),  
     AccountType             nvarchar(50),  
     AccountCodeAlternateKey int  
     )  
  
-- Convert the table to a clustered columnstore index named inxcci_cci_target;  
CREATE CLUSTERED COLUMNSTORE INDEX idxcci_cci_target ON cci_target;  

Используйте параметр TABLOCK для параллельной вставки строк.Use the TABLOCK option to insert rows in parallel. Начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x), операция INSERT INTO может выполняться параллельно с TABLOCK.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), the INSERT INTO operation can run in parallel when TABLOCK is used.

INSERT INTO cci_target WITH (TABLOCK) 
SELECT TOP 300000 * FROM staging;  

Выполните эту команду, чтобы увидеть разностные группы строк OPEN.Run this command to see the OPEN delta rowgroups. Количество групп строк зависит от уровня параллелизма.The number of rowgroups depends on the degree of parallelism.

SELECT *   
FROM sys.dm_db_column_store_row_group_physical_stats   
WHERE object_id  = object_id('cci_target');  

Выполните эту команду для принудительной отправки всех групп строк CLOSED и OPEN в columnstore.Run this command to force all CLOSED and OPEN rowgroups into the columnstore.

ALTER INDEX idxcci_cci_target ON cci_target REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);  

Выполните эту команду еще раз, и вы увидите, что небольшие группы строк объединены в одну сжатую группу строк.Run this command again and you will see that smaller rowgroups are merged into one compressed rowgroup.

ALTER INDEX idxcci_cci_target ON cci_target REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);  

Б.B. Сжатие разностных групп строк CLOSED в columnstoreCompress CLOSED delta rowgroups into the columnstore

В этом примере используется параметр REORGANIZE для сжатия каждой разностной группы строк CLOSED в columnstore в виде сжатой группы строк.This example uses the REORGANIZE option to compresses each CLOSED delta rowgroup into the columnstore as a compressed rowgroup. Это делать необязательно, но полезно, когда процесс перемещения кортежей сжимает группы строк CLOSED недостаточно быстро.This is not necessary, but is useful when the tuple-mover is not compressing CLOSED rowgroups fast enough.

-- Uses AdventureWorksDW  
-- REORGANIZE all partitions  
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE;  
  
-- REORGANIZE a specific partition  
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE PARTITION = 0;  

В.C. Сжатие всех разностных групп строк OPEN и CLOSED в columnstoreCompress all OPEN AND CLOSED delta rowgroups into the columnstore

Применимо к: SQL ServerSQL Server (начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x)) and База данных SQL AzureAzure SQL Database

Команда REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON) сжимает каждую разностную группу строк OPEN и CLOSED в columnstore как сжатую группу строк.The command REORGANIZE WITH ( COMPRESS_ALL_ROW_GROUPS = ON ) compresses each OPEN and CLOSED delta rowgroup into the columnstore as a compressed rowgroup. При этом очищается хранилище deltastore и все строки принудительно сжимаются в columnstore.This empties the deltastore and forces all rows to get compressed into the columnstore. Это особенно полезно после выполнения множества операций вставки, так как они хранят строки в одном или нескольких разностных группах строк.This is useful especially after performing many insert operations since these operations store the rows in one or more delta rowgroups.

REORGANIZE объединяет группы строк для заполнения групп строк до максимального числа строк <= 1 024 576.REORGANIZE combines rowgroups to fill rowgroups up to a maximum number of rows <= 1,024,576. Таким образом, при сжатии всех групп строк OPEN и CLOSED у вас не будет большого количества сжатых групп строк, содержащих небольшое количество строк.Therefore, when you compress all OPEN and CLOSED rowgroups you won't end up with lots of compressed rowgroups that only have a few rows in them. Чтобы сократить размер в сжатом виде и повысить производительность запросов, группы строк следует заполнить как можно плотнее.You want rowgroups to be as full as possible to reduce the compressed size and improve query performance.

-- Uses AdventureWorksDW2016  
-- Move all OPEN and CLOSED delta rowgroups into the columnstore.  
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);  
  
-- For a specific partition, move all OPEN AND CLOSED delta rowgroups into the columnstore  
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE PARTITION = 0 WITH (COMPRESS_ALL_ROW_GROUPS = ON);  

Г.D. Дефрагментация индекса columnstore в режиме "в сети"Defragment a columnstore index online

Не применяется к SQL Server 2012 (11.x)SQL Server 2012 (11.x) и SQL Server 2014 (12.x)SQL Server 2014 (12.x).Does not apply to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) and SQL Server 2014 (12.x)SQL Server 2014 (12.x).

Начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x), REORGANIZE позволяет не только сжимать разностные групп строк в columnstore.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), REORGANIZE does more than compress delta rowgroups into the columnstore. Эта команда также выполняет дефрагментацию в режиме "в сети".It also performs online defragmentation. Сначала она уменьшает размер columnstore путем физического удаления удаленных строк, если в группе строк было удалено 10 % или более строк.First, it reduces the size of the columnstore by physically removing deleted rows when 10% or more of the rows in a rowgroup have been deleted. Затем она объединяет группы строк для формирования более крупных групп, каждая из которых может содержать до 1 024 576 строк.Then, it combines rowgroups together to form larger rowgroups that have up to the maximum of 1,024,576 rows per rowgroups. Все измененные группы строк проходят повторное сжатие.All rowgroups that are changed get re-compressed.

Примечание

Начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x), в большинстве случаев больше не требуется перестраивать индекса columnstore, так как REORGANIZE физически удаляет удаленные строки и объединяет группы строк.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), rebuilding a columnstore index is no longer necessary in most situations since REORGANIZE physically removes deleted rows and merges rowgroups. Параметр COMPRESS_ALL_ROW_GROUPS принудительно отправляет все разностные группы строк OPEN или CLOSED в columnstore. Ранее это можно было сделать только с помощью перестроения.The COMPRESS_ALL_ROW_GROUPS option forces all OPEN or CLOSED delta rowgroups into the columnstore which previously could only be done with a rebuild. REORGANIZE работает в режиме "в сети" и выполняется в фоне, поэтому запросы могут продолжаться по мере выполнения операции.REORGANIZE is online and occurs in the background so queries can continue as the operation happens.

-- Uses AdventureWorks  
-- Defragment by physically removing rows that have been logically deleted from the table, and merging rowgroups.  
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE;  

Д.E. Перестроение кластеризованного индекса columnstore в режиме "вне сети"Rebuild a clustered columnstore index offline

Применимо для следующих объектов: SQL ServerSQL Server (начиная с SQL Server 2012 (11.x)SQL Server 2012 (11.x))Applies to: SQL ServerSQL Server (Starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x))

Совет

Начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x) и База данных SQL AzureAzure SQL Database, рекомендуется использовать инструкцию ALTER INDEX REORGANIZE вместо инструкции ALTER INDEX REBUILD.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) and in База данных SQL AzureAzure SQL Database, we recommend using ALTER INDEX REORGANIZE instead of ALTER INDEX REBUILD.

Примечание

В SQL Server 2012 (11.x)SQL Server 2012 (11.x) и SQL Server 2014 (12.x)SQL Server 2014 (12.x) REORGANIZE используется только для сжатия групп строк CLOSED в columnstore.In SQL Server 2012 (11.x)SQL Server 2012 (11.x) and SQL Server 2014 (12.x)SQL Server 2014 (12.x), REORGANIZE is only used to compress CLOSED rowgroups into the columnstore. Единственным способом выполнения операций дефрагментация и принудительной отправки всех разностных групп строк в columnstore является перестроение индекса.The only way to perform defragmentation operations and to force all delta rowgroups into the columnstore is to rebuild the index.

В этом примере показано, как перестроить кластеризованный индекс columnstore и принудительно отправить все разностные группы строк в columnstore.This example shows how to rebuild a clustered columnstore index and force all delta rowgroups into the columnstore. В этом первом шаге подготавливается таблица FactInternetSales2 с кластеризованным индексом columnstore и происходит вставка данных из первых четырех столбцов.This first step prepares a table FactInternetSales2 with a clustered columnstore index and inserts data from the first four columns.

-- Uses AdventureWorksDW  
  
CREATE TABLE dbo.FactInternetSales2 (  
    ProductKey [int] NOT NULL,   
    OrderDateKey [int] NOT NULL,   
    DueDateKey [int] NOT NULL,   
    ShipDateKey [int] NOT NULL);  
  
CREATE CLUSTERED COLUMNSTORE INDEX cci_FactInternetSales2  
ON dbo.FactInternetSales2;  
  
INSERT INTO dbo.FactInternetSales2  
SELECT ProductKey, OrderDateKey, DueDateKey, ShipDateKey  
FROM dbo.FactInternetSales;  
  
SELECT * FROM sys.column_store_row_groups;  

Как здесь показано, результатом становится одна группа строк OPEN, а это означает, что SQL ServerSQL Server будет ожидать добавления большего количества строк и только после этого закроет группу строк и переместит данные в columnstore.The results show there is one OPEN rowgroup, which means SQL ServerSQL Server will wait for more rows to be added before it closes the rowgroup and moves the data to the columnstore. Следующая инструкция перестраивает кластеризованный индекс columnstore, что приводит к принудительной отправке всех строк в columnstore.This next statement rebuilds the clustered columnstore index, which forces all rows into the columnstore.

ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REBUILD;  
SELECT * FROM sys.column_store_row_groups;  

Результаты инструкции SELECT показывают, что группа строк имеет атрибут COMPRESSED, а это означает, что сегменты столбца этой группы строк теперь упакованы и хранятся в columnstore.The results of the SELECT statement show the rowgroup is COMPRESSED, which means the column segments of the rowgroup are now compressed and stored in the columnstore.

Е.F. Перестроение секции кластеризованного индекса columnstore в режиме "вне сети"Rebuild a partition of a clustered columnstore index offline

Область применения: SQL ServerSQL Server (начиная с SQL Server 2012 (11.x)SQL Server 2012 (11.x))Applies to: SQL ServerSQL Server (Starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x))

Для перестроения секции большого кластеризованного индекса columnstore используйте инструкцию ALTER INDEX REBUILD с параметром секции.To rebuild a partition of a large clustered columnstore index, use ALTER INDEX REBUILD with the partition option. В этом примере перестраивается секция 12.This example rebuilds partition 12. Начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x), рекомендуется заменить REBUILD на REORGANIZE.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), we recommend replacing REBUILD with REORGANIZE.

ALTER INDEX cci_fact3   
ON fact3  
REBUILD PARTITION = 12;  

Ж.G. Изменение кластеризованного индекса columnstore для использования архивного сжатияChange a clustered columstore index to use archival compression

Не применяется к SQL Server 2012 (11.x)SQL Server 2012 (11.x).Does not apply to: SQL Server 2012 (11.x)SQL Server 2012 (11.x)

Используя параметр сжатия данных COLUMNSTORE_ARCHIVE, можно еще больше уменьшить размер кластеризованного индекса columnstore.You can choose to reduce the size of a clustered columnstore index even further by using the COLUMNSTORE_ARCHIVE data compression option. Это целесообразно для более старых данных, которые будут храниться в дешевом хранилище.This is practical for older data that you want to keep on cheaper storage. Рекомендуется применять этот параметр только для редко используемых данных, поскольку распаковка выполняется медленнее, чем обычное сжатие COLUMNSTORE.We recommend only using this on data that is not accessed often since decompress is slower than with the normal COLUMNSTORE compression.

В следующем примере перестраивается кластеризованный индекс columnstore в целях применения архивного сжатия, затем показано, как удалить архивное сжатие.The following example rebuilds a clustered columnstore index to use archival compression, and then shows how to remove the archival compression. Конечным результатом становится использование только сжатия columnstore.The final result will use only columnstore compression.

--Prepare the example by creating a table with a clustered columnstore index.  
CREATE TABLE SimpleTable (  
    ProductKey [int] NOT NULL,   
    OrderDateKey [int] NOT NULL,   
    DueDateKey [int] NOT NULL,   
    ShipDateKey [int] NOT NULL  
);  
  
CREATE CLUSTERED INDEX cci_SimpleTable ON SimpleTable (ProductKey);  
  
CREATE CLUSTERED COLUMNSTORE INDEX cci_SimpleTable  
ON SimpleTable  
WITH (DROP_EXISTING = ON);  
  
--Compress the table further by using archival compression.  
ALTER INDEX cci_SimpleTable ON SimpleTable  
REBUILD  
WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE);  
  
--Remove the archive compression and only use columnstore compression.  
ALTER INDEX cci_SimpleTable ON SimpleTable  
REBUILD  
WITH (DATA_COMPRESSION = COLUMNSTORE);  
GO  

Примеры: индексы rowstoreExamples: Rowstore indexes

A.A. Перестроение индексаRebuilding an index

В следующем примере показано, как перестроить единственный индекс на таблице Employee базы данных AdventureWorks2012AdventureWorks2012.The following example rebuilds a single index on the Employee table in the AdventureWorks2012AdventureWorks2012 database.

ALTER INDEX PK_Employee_EmployeeID ON HumanResources.Employee REBUILD;  

Б.B. Перестроение всех индексов по таблице и указание параметровRebuilding all indexes on a table and specifying options

В следующем примере указывается ключевое слово ALL.The following example specifies the keyword ALL. Это приводит к перестроению всех индексов, связанных с таблицей Production.Product базы данных AdventureWorks2012AdventureWorks2012.This rebuilds all indexes associated with the table Production.Product in the AdventureWorks2012AdventureWorks2012 database. Указываются три параметра.Three options are specified.

Область применения: SQL ServerSQL Server (начиная с SQL Server 2008SQL Server 2008) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and База данных SQL AzureAzure SQL Database

ALTER INDEX ALL ON Production.Product  
REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON);  

В следующем примере добавляется параметр ONLINE, содержащий параметры блокировки с низким приоритетом, и добавляется параметр сжатия строк.The following example adds the ONLINE option including the low priority lock option, and adds the row compression option.

Область применения: SQL ServerSQL Server (начиная с SQL Server 2014 (12.x)SQL Server 2014 (12.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2014 (12.x)SQL Server 2014 (12.x)) and База данных SQL AzureAzure SQL Database

ALTER INDEX ALL ON Production.Product  
REBUILD WITH   
(  
    FILLFACTOR = 80,   
    SORT_IN_TEMPDB = ON,  
    STATISTICS_NORECOMPUTE = ON,  
    ONLINE = ON ( WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 4 MINUTES, ABORT_AFTER_WAIT = BLOCKERS ) ),   
    DATA_COMPRESSION = ROW  
);  

В.C. Реорганизация индекса со сжатием данных LOBReorganizing an index with LOB compaction

В следующем примере показано, как реорганизовать единственный кластеризованный индекс в базе данных AdventureWorks2012AdventureWorks2012.The following example reorganizes a single clustered index in the AdventureWorks2012AdventureWorks2012 database. Поскольку индекс содержит тип данных LOB на конечном уровне, инструкция также подвергает сжатию все страницы, в которых содержатся данные больших объектов.Because the index contains a LOB data type in the leaf level, the statement also compacts all pages that contain the large object data. Следует отметить, что указывать параметр WITH (LOB_COMPACTION = ON) не требуется, так как значение по умолчанию — ON.Note that specifying the WITH (LOB_COMPACTION = ON) option is not required because the default value is ON.

ALTER INDEX PK_ProductPhoto_ProductPhotoID ON Production.ProductPhoto REORGANIZE WITH (LOB_COMPACTION = ON);  

Г.D. Установка параметров для индексаSetting options on an index

В следующем примере задается несколько параметров индекса AK_SalesOrderHeader_SalesOrderNumber в базе данных AdventureWorks2012AdventureWorks2012.The following example sets several options on the index AK_SalesOrderHeader_SalesOrderNumber in the AdventureWorks2012AdventureWorks2012 database.

Область применения: SQL ServerSQL Server (начиная с SQL Server 2008SQL Server 2008) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and База данных SQL AzureAzure SQL Database

ALTER INDEX AK_SalesOrderHeader_SalesOrderNumber ON  
    Sales.SalesOrderHeader  
SET (  
    STATISTICS_NORECOMPUTE = ON,  
    IGNORE_DUP_KEY = ON,  
    ALLOW_PAGE_LOCKS = ON  
    ) ;  
GO

Д.E. Отключение индексаDisabling an index

В следующем примере показано отключение некластеризованного индекса на таблице Employee базы данных AdventureWorks2012AdventureWorks2012.The following example disables a nonclustered index on the Employee table in the AdventureWorks2012AdventureWorks2012 database.

ALTER INDEX IX_Employee_ManagerID ON HumanResources.Employee DISABLE;

Е.F. Отключение ограниченийDisabling constraints

В следующем примере показано отключение ограничения PRIMARY KEY путем отключения индекса PRIMARY KEY в базе данных AdventureWorks2012AdventureWorks2012.The following example disables a PRIMARY KEY constraint by disabling the PRIMARY KEY index in the AdventureWorks2012AdventureWorks2012 database. Ограничение FOREIGN KEY в базовой таблице автоматически отключается, и выводится предупредительное сообщение.The FOREIGN KEY constraint on the underlying table is automatically disabled and warning message is displayed.

ALTER INDEX PK_Department_DepartmentID ON HumanResources.Department DISABLE;  

Результирующий набор возвращает это предупреждающее сообщение.The result set returns this warning message.

Warning: Foreign key 'FK_EmployeeDepartmentHistory_Department_DepartmentID'  
on table 'EmployeeDepartmentHistory' referencing table 'Department'  
was disabled as a result of disabling the index 'PK_Department_DepartmentID'.

Ж.G. Включение ограниченийEnabling constraints

В следующем примере активируются ограничения PRIMARY KEY и FOREIGN KEY, снятые в примере Е.The following example enables the PRIMARY KEY and FOREIGN KEY constraints that were disabled in Example F.

Ограничение PRIMARY KEY активируется путем перестройки индекса PRIMARY KEY.The PRIMARY KEY constraint is enabled by rebuilding the PRIMARY KEY index.

ALTER INDEX PK_Department_DepartmentID ON HumanResources.Department REBUILD;  

Затем активируется ограничение FOREIGN KEY.The FOREIGN KEY constraint is then enabled.

ALTER TABLE HumanResources.EmployeeDepartmentHistory  
CHECK CONSTRAINT FK_EmployeeDepartmentHistory_Department_DepartmentID;  
GO  

З.H. Перестроение секционированного индексаRebuilding a partitioned index

В следующем примере перестраивается единственная секция с номером 5 секционированного индекса IX_TransactionHistory_TransactionDate в базе данных AdventureWorks2012AdventureWorks2012.The following example rebuilds a single partition, partition number 5, of the partitioned index IX_TransactionHistory_TransactionDate in the AdventureWorks2012AdventureWorks2012 database. Секция 5 перестраивается в сети, 10 минут времени ожидания для блокировки с низким приоритетом применяется отдельно к каждой полученной блокировке операции перестроения индекса.Partition 5 is rebuilt online and the 10 minutes wait time for the low priority lock applies separately to every lock acquired by index rebuild operation. Если в течение этого времени не удается получить блокировку для завершения перестроения индекса, инструкция по перестроению прерывается.If during this time the lock cannot be obtained to complete index rebuild, the rebuild operation statement is aborted.

Область применения: SQL ServerSQL Server (начиная с SQL Server 2014 (12.x)SQL Server 2014 (12.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2014 (12.x)SQL Server 2014 (12.x)) and База данных SQL AzureAzure SQL Database

-- Verify the partitioned indexes.  
SELECT *  
FROM sys.dm_db_index_physical_stats (DB_ID(),OBJECT_ID(N'Production.TransactionHistory'), NULL , NULL, NULL);  
GO  
--Rebuild only partition 5.  
ALTER INDEX IX_TransactionHistory_TransactionDate  
ON Production.TransactionHistory  
REBUILD Partition = 5   
   WITH (ONLINE = ON (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 10 minutes, ABORT_AFTER_WAIT = SELF)));  
GO  

И.I. Изменение настроек сжатия индексаChanging the compression setting of an index

В следующем примере перестраивается индекс на несекционированной таблице rowstore.The following example rebuilds an index on a nonpartitioned rowstore table.

ALTER INDEX IX_INDEX1   
ON T1  
REBUILD   
WITH (DATA_COMPRESSION = PAGE);  
GO  

Дополнительные примеры сжатия данных см. в разделе Сжатие данных.For additional data compression examples, see Data Compression.

К.J. Возобновляемое перестроение индексов в режиме "в сети"Online resumable index rebuild

Область применения: SQL ServerSQL Server (начиная с SQL Server 2017 (14.x)SQL Server 2017 (14.x)) и База данных SQL AzureAzure SQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and База данных SQL AzureAzure SQL Database

В следующих примерах показано использование возобновляемого перестроения индексов в режиме "в сети".The following examples show how to use online resumable index rebuild.

  1. Выполните перестроение индекса в режиме "в сети" в качестве возобновляемой операции с параметром MAXDOP = 1.Execute an online index rebuild as resumable operation with MAXDOP=1.

    ALTER INDEX test_idx on test_table REBUILD WITH (ONLINE=ON, MAXDOP=1, RESUMABLE=ON) ;
    
  2. При повторном выполнении этой команды (см. выше) после приостановки операции индекса автоматически возобновляется операция перестроения индекса.Executing the same command again (see above) after an index operation was paused, resumes automatically the index rebuild operation.

  3. Выполните перестроение индекса в режиме "в сети" в качестве возобновляемой операции с параметром MAX_DURATION = 240.Execute an online index rebuild as resumable operation with MAX_DURATION set to 240 minutes.

    ALTER INDEX test_idx on test_table REBUILD WITH (ONLINE=ON, RESUMABLE=ON, MAX_DURATION=240) ; 
    
  4. Приостановите выполняющееся возобновляемое перестроение индексов в режиме "в сети".Pause a running resumable online index rebuild.

    ALTER INDEX test_idx on test_table PAUSE ;
    
  5. Возобновите перестроение индекса в режиме "в сети" для перестроения индекса, который был выполнен как возобновляемая операция, указав новое значение для MAXDOP, равное 4.Resume an online index rebuild for an index rebuild that was executed as resumable operation specifying a new value for MAXDOP set to 4.

    ALTER INDEX test_idx on test_table RESUME WITH (MAXDOP=4) ;
    
  6. Возобновите операцию перестроения индекса в режиме "в сети" для перестроения индекса в режиме "в сети", которое было выполнено как возобновляемое.Resume an online index rebuild operation for an index online rebuild that was executed as resumable. Задайте параметру MAXDOP значение 2, установите время для выполняющегося в качестве возобновляемого индекса равным 240 минутам, а в случае блокировки индекса задайте время ожидания 10 минут, после чего все блокировщики должны быть удалены.Set MAXDOP to 2, set the execution time for the index being running as resumable to 240 minutes and in case of an index being blocked on the lock wait 10 minutes and after that kill all blockers.

       ALTER INDEX test_idx on test_table  
          RESUME WITH (MAXDOP=2, MAX_DURATION= 240 MINUTES, 
          WAIT_AT_LOW_PRIORITY (MAX_DURATION=10, ABORT_AFTER_WAIT=BLOCKERS)) ;
    
  7. Прервите возобновляемую операцию перестроения индекса, которая выполняется или приостановлена.Abort resumable index rebuild operation which is running or paused.

    ALTER INDEX test_idx on test_table ABORT ;
    

См. также:See Also

Руководство по архитектуре и разработке индексов SQL Server SQL Server Index Architecture and Design Guide
Выполнение операций с индексами в режиме "в сети" Perform Index Operations Online
CREATE INDEX (Transact-SQL) CREATE INDEX (Transact-SQL)
CREATE SPATIAL INDEX (Transact-SQL) CREATE SPATIAL INDEX (Transact-SQL)
CREATE XML INDEX (Transact-SQL) CREATE XML INDEX (Transact-SQL)
DROP INDEX (Transact-SQL) DROP INDEX (Transact-SQL)
Отключение индексов и ограничений Disable Indexes and Constraints
XML-индексы (SQL Server) XML Indexes (SQL Server)
Реорганизация и перестроение индексов Reorganize and Rebuild Indexes
sys.dm_db_index_physical_stats (Transact-SQL) sys.dm_db_index_physical_stats (Transact-SQL)
EVENTDATA (Transact-SQL)EVENTDATA (Transact-SQL)