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

ESTE TÓPICO APLICA-SE A: simSQL Server (a partir de 2008)simBanco de Dados SQL do Microsoft AzuresimAzure SQL Data Warehouse simParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Modifica uma tabela ou índice de exibição existente (relacional ou XML) desabilitando, recriando ou reorganizando o índice, ou definindo opções no índice.Modifies an existing table or view index (relational or XML) by disabling, rebuilding, or reorganizing the index; or by setting options on the index.

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

-- 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 ] . | schema_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 }  
    | 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 }  
}  

ArgumentosArguments

index_nameindex_name
É o nome do índice.Is the name of the index. Os nomes de índice devem ser exclusivos em uma tabela ou exibição, mas não precisam ser exclusivos no banco de dados.Index names must be unique within a table or view but do not have to be unique within a database. Os nomes de índice precisam seguir as regras para identificadores.Index names must follow the rules of identifiers.

ALLALL
Especifica todos os índices associados à tabela ou exibição, independentemente do tipo de índice.Specifies all indexes associated with the table or view regardless of the index type. Especificar ALL fará com que a instrução falhe se um ou mais índices estiverem em um grupo de arquivos offline ou somente leitura, ou se a operação especificada não for permitida em um ou mais tipos de índice.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. A tabela a seguir lista as operações de índice e os tipos de índice não permitidos.The following table lists the index operations and disallowed index types.

Usando a palavra-chave ALL com esta operaçãoUsing the keyword ALL with this operation Falhará se a tabela tiver um ou maisFails if the table has one or more
REBUILD WITH ONLINE = ONREBUILD WITH ONLINE = ON Índice XMLXML index

Índice espacialSpatial index

Índice Columnstore: aplica-se a: SQL ServerSQL Server (Começando com SQL Server 2012 (11.x)SQL Server 2012 (11.x)) e Banco de Dados SQLSQL Database.Columnstore index: Applies to: SQL ServerSQL Server (Starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x)) and Banco de Dados SQLSQL Database.
REBUILD PARTITION = partition_numberREBUILD PARTITION = partition_number Índice não particionado, índice XML, índice espacial ou índice desabilitadoNonpartitioned index, XML index, spatial index, or disabled index
REORGANIZEREORGANIZE Índices com ALLOW_PAGE_LOCKS definido como OFFIndexes with ALLOW_PAGE_LOCKS set to OFF
REORGANIZE PARTITION = partition_numberREORGANIZE PARTITION = partition_number Índice não particionado, índice XML, índice espacial ou índice desabilitadoNonpartitioned index, XML index, spatial index, or disabled index
IGNORE_DUP_KEY = ONIGNORE_DUP_KEY = ON Índice XMLXML index

Índice espacialSpatial index

Índice Columnstore: aplica-se a: SQL ServerSQL Server (Começando com SQL Server 2012 (11.x)SQL Server 2012 (11.x)) e Banco de Dados SQLSQL Database.Columnstore index: Applies to: SQL ServerSQL Server (Starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x)) and Banco de Dados SQLSQL Database.
ONLINE = ONONLINE = ON Índice XMLXML index

Índice espacialSpatial index

Índice Columnstore: aplica-se a: SQL ServerSQL Server (Começando com SQL Server 2012 (11.x)SQL Server 2012 (11.x)) e Banco de Dados SQLSQL Database.Columnstore index: Applies to: SQL ServerSQL Server (Starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x)) and Banco de Dados SQLSQL Database.
RESUMABLE = ONRESUMABLE = ON Índices retomáveis não são compatíveis com a palavra-chave All.Resumable indexes not supported with All keyword.

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2017 (14.x)SQL Server 2017 (14.x)) e Banco de Dados SQLSQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and Banco de Dados SQLSQL Database

Aviso

Para obter mais informações sobre operações de índice que podem ser executadas online, consulte Diretrizes para operações de índice online.For more detailed information about index operations that can be performed online, see Guidelines for Online Index Operations.

Se ALL for especificado com PARTITION = partition_number, todos os índices deverão ser alinhados.If ALL is specified with PARTITION = partition_number, all indexes must be aligned. Isso significa que eles serão particionados com base nas funções de partições equivalentes.This means that they are partitioned based on equivalent partition functions. Usar ALL com PARTITION faz com que todas as partições de índice com o mesmo partition_number sejam recriadas ou reorganizadas.Using ALL with PARTITION causes all index partitions with the same partition_number to be rebuilt or reorganized. Para obter mais informações sobre índices particionados, consulte Partitioned Tables and Indexes.For more information about partitioned indexes, see Partitioned Tables and Indexes.

database_namedatabase_name
É o nome do banco de dados.Is the name of the database.

schema_nameschema_name
É o nome do esquema ao qual a tabela ou exibição pertence.Is the name of the schema to which the table or view belongs.

table_or_view_nametable_or_view_name
É o nome da tabela ou exibição associada ao índice.Is the name of the table or view associated with the index. Para exibir um relatório dos índices em um objeto, use a exibição do catálogo sys.indexes.To display a report of the indexes on an object, use the sys.indexes catalog view.

O Banco de Dados SQLSQL Database é compatível ao formato de nome de três partes database_name.[schema_name].table_or_view_name quando database_name é o banco de dados atual ou database_name é tempdb e table_or_view_name começa com #. Banco de Dados SQLSQL Database 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]) ]
Especifica que o índice será recriado usando as mesmas colunas, tipo de índice, atributo de exclusividade e ordem de classificação.Specifies the index will be rebuilt using the same columns, index type, uniqueness attribute, and sort order. Essa cláusula é equivalente a DBCC DBREINDEX.This clause is equivalent to DBCC DBREINDEX. REBUILD habilita um índice desabilitado.REBUILD enables a disabled index. A recriação de um índice clusterizado não recriará os índices não clusterizados associados, a menos que a palavra-chave ALL seja especificada.Rebuilding a clustered index does not rebuild associated nonclustered indexes unless the keyword ALL is specified. Se as opções de índice não forem especificadas, os valores de opção de índice existentes armazenados em sys.indexes serão aplicados.If index options are not specified, the existing index option values stored in sys.indexes are applied. Para qualquer opção de índice cujo valor não seja armazenado em sys.indexes, o padrão indicado na definição de argumento da opção será aplicado.For any index option whose value is not stored in sys.indexes, the default indicated in the argument definition of the option applies.

Se ALL for especificado e a tabela subjacente for um heap, a operação de recriação não terá efeito na tabela.If ALL is specified and the underlying table is a heap, the rebuild operation has no effect on the table. Quaisquer índices não clusterizados associados à tabela serão recriados.Any nonclustered indexes associated with the table are rebuilt.

A operação de recriação poderá ser registrada minimamente se o modelo de recuperação de banco de dados for definido como bulk-logged ou simples.The rebuild operation can be minimally logged if the database recovery model is set to either bulk-logged or simple.

Observação

Ao recriar um índice XML primário, a tabela de usuário subjacente não estará disponível durante a operação de índice.When you rebuild a primary XML index, the underlying user table is unavailable for the duration of the index operation.

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2012 (11.x)SQL Server 2012 (11.x)) e Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x)) and Banco de Dados SQLSQL Database.

Para índices columnstore, a operação de recompilação:For columnstore indexes, the rebuild operation:

  1. não usa a ordem de classificação.Does not use the sort order.

  2. Obtenha um bloqueio exclusivo na tabela ou na partição durante a recompilação.Acquires an exclusive lock on the table or partition while the rebuild occurs. Os dados estão "offline" e indisponíveis durante a recompilação, mesmo se você usar NOLOCK, RCSI ou SI.The data is “offline” and unavailable during the rebuild, even when using NOLOCK, RCSI, or SI.

  3. Compacta novamente todos os dados do columnstore.Re-compresses all data into the columnstore. Há duas cópias do índice columnstore durante a recompilação.Two copies of the columnstore index exist while the rebuild is taking place. Quando a recompilação é concluída, o SQL ServerSQL Server exclui o índice columnstore original.When the rebuild is finished, SQL ServerSQL Server deletes the original columnstore index.

    Para obter mais informações sobre como recompilar índices columnstore, consulte Índices Columnstore – desfragmentaçãoFor more information about rebuilding columnstore indexes, see Columnstore indexes - defragmentation

PARTITIONPARTITION

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2008SQL Server 2008) e Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Banco de Dados SQLSQL Database.

Especifica que somente uma partição de um índice será recriada ou reorganizada.Specifies that only one partition of an index will be rebuilt or reorganized. PARTITION não poderá ser especificado se index_name não for um índice particionado.PARTITION cannot be specified if index_name is not a partitioned index.

PARTITION = ALL recria todas as partições.PARTITION = ALL rebuilds all partitions.

Aviso

É possível criar e reconstruir índices não alinhados em uma tabela com mais de 1.000 partições, mas não há suporte para isso.Creating and rebuilding nonaligned indexes on a table with more than 1,000 partitions is possible, but is not supported. Fazer isso pode provocar degradação do desempenho ou consumo excessivo de memória durante essas operações.Doing so may cause degraded performance or excessive memory consumption during these operations. É recomendável usar índices alinhados apenas quando o número de partições for maior que 1.000.We recommend using only aligned indexes when the number of partitions exceed 1,000.

partition_numberpartition_number

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2008SQL Server 2008) e Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Banco de Dados SQLSQL Database.

É o número de partição de um índice particionado que será reconstruído ou reorganizado.Is the partition number of a partitioned index that is to be rebuilt or reorganized. partition_number é uma expressão de constante que pode fazer referência a variáveis.partition_number is a constant expression that can reference variables. Isso inclui variáveis de tipo definido pelo usuário ou funções e funções definidas pelo usuário, mas não é possível fazer referência a uma instrução 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 deve existir ou a instrução falhará.partition_number must exist or the statement fails.

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

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2008SQL Server 2008) e Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Banco de Dados SQLSQL Database.

SORT_IN_TEMPDB, MAXDOP e DATA_COMPRESSION são as opções que podem ser especificadas ao recriar uma única partição (PARTITION = n).SORT_IN_TEMPDB, MAXDOP, and DATA_COMPRESSION are the options that can be specified when you rebuild a single partition (PARTITION = n). Índices XML não podem ser especificados em uma única operação de recriação de partição.XML indexes cannot be specified in a single partition rebuild operation.

DISABLEDISABLE
Marca o índice como desabilitado e indisponível para uso pelo Mecanismo de Banco de DadosDatabase Engine.Marks the index as disabled and unavailable for use by the Mecanismo de Banco de DadosDatabase Engine. Qualquer índice pode ser desabilitado.Any index can be disabled. A definição de um índice desabilitado permanece no catálogo do sistema sem nenhum dado de índice subjacente.The index definition of a disabled index remains in the system catalog with no underlying index data. Desabilitar um índice clusterizado evita que o usuário acesse os dados da tabela subjacente.Disabling a clustered index prevents user access to the underlying table data. Para habilitar um índice, use ALTER INDEX REBUILD ou CREATE INDEX WITH DROP_EXISTING.To enable an index, use ALTER INDEX REBUILD or CREATE INDEX WITH DROP_EXISTING. Para obter mais informações, consulte Desabilitar índices e restrições e Habilitar índices e restrições.For more information, see Disable Indexes and Constraints and Enable Indexes and Constraints.

REORGANIZE um índice rowstoreREORGANIZE a rowstore index
Para índices rowstore, REORGANIZE especifica reorganizar o nível folha do índice.For rowstore indexes, REORGANIZE specifies to reorganize the index leaf level. A operação de REORGANIZE é:The REORGANIZE operation is:

  • sempre executada online.Always performed online. Isso significa que os bloqueios de tabela de longo prazo não são mantidos e que as consultas ou atualizações da tabela subjacente podem continuar durante a transação 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.
  • Não é permitida para um índice desabilitadoNot allowed for a disabled index
  • Não é permitida quando ALLOW_PAGE_LOCKS está definido como OFFNot allowed when ALLOW_PAGE_LOCKS is set to OFF
  • Não é revertida quando é executada em uma transação e a transação é revertida.Not rolled back when it is performed within a transaction and the transaction is rolled back.

REORGANIZE WITH ( LOB_COMPACTION = { ON | OFF } )REORGANIZE WITH ( LOB_COMPACTION = { ON | OFF } )
Aplica-se a índices rowstore.Applies to rowstore indexes.

LOB_COMPACTION = ONLOB_COMPACTION = ON

  • Especifica compactar todas as páginas que contêm dados destes tipos de dados de objeto grande (LOB): image, text, ntext, varchar(max), nvarchar(max), varbinary(max) e 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. A compactação desses dados pode reduzir o tamanho dos dados no disco.Compacting this data can reduce the data size on disk.

  • Para um índice clusterizado, isso compacta todas as colunas LOB contidas na tabela.For a clustered index, this compacts all LOB columns that are contained in the table.

  • Reorganizar um índice não clusterizado, compacta todas as colunas LOB não chave (incluídas) no índice.For a nonclustered index, this compacts all LOB columns that are nonkey (included) columns in the index.

  • REORGANIZE ALL executa LOB_COMPACTION em todos os índices.REORGANIZE ALL performs LOB_COMPACTION on all indexes. Para cada índice, isso compacta todas as colunas LOB no índice clusterizado, na tabela subjacente ou nas colunas incluídas em um índice não clusterizado.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

  • Páginas que contêm dados de objeto grande não são compactadas.Pages that contain large object data are not compacted.

  • OFF não tem nenhum efeito em um heap.OFF has no effect on a heap.

    REORGANIZE um índice columnstoreREORGANIZE a columnstore index
    Para índices columnstore, REORGANIZE compacta cada rowgroup delta CLOSED no columnstore como um rowgroup compactado.For columnstore indexes, REORGANIZE compresses each CLOSED delta rowgroup into the columnstore as a compressed rowgroup. A operação REORGANIZE sempre é executada online.The REORGANIZE operation is always performed online. Isso significa que os bloqueios de tabela de longo prazo não são mantidos e que as consultas ou atualizações da tabela subjacente podem continuar durante a transação 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.

  • REORGANIZE não é necessário para mover rowgroups delta CLOSED para rowgroups compactados.REORGANIZE is not required in order to move CLOSED delta rowgroups into compressed rowgroups. O processo TM (motor de tupla) em segundo plano é ativado periodicamente para compactar rowgroups delta CLOSED.The background tuple-mover (TM) process wakes up periodically to compress CLOSED delta rowgroups. É recomendável usar REORGANIZE quando o motor de tupla está ficando para trás.We recommend using REORGANIZE when tuple-mover is falling behind. REORGANIZE pode compactar rowgroups de maneira mais agressiva.REORGANIZE can compress rowgroups more aggressively.

  • Para compactar todos os rowgroups OPEN e CLOSED, veja a opção REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS) nesta seção.To compress all OPEN and CLOSED rowgroups, see the REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS) option in this section.

Para índices columnstore em SQL ServerSQL Server (a partir de 2016) e Banco de Dados SQLSQL Database, REORGANIZE executa as seguintes otimizações adicionais desfragmentação online:For columnstore indexes in SQL ServerSQL Server (Starting with 2016) and Banco de Dados SQLSQL Database, REORGANIZE performs the following additional defragmentation optimizations online:

  • Remove fisicamente linhas de um grupo de linhas quando 10% ou mais linhas foram excluídas logicamente.Physically removes rows from a rowgroup when 10% or more of the rows have been logically deleted. Os bytes excluídos são recuperados na mídia física.The deleted bytes are reclaimed on the physical media. Por exemplo, se um grupo de linhas compactado de 1 milhão de linhas tiver 100 mil linhas excluídas, o SQL Server removerá as linhas excluídas e recompactará o rowgroup com 900 mil linhas.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. Ele salva no armazenamento removendo as linhas excluídas.It saves on the storage by removing deleted rows.

  • Combina um ou mais rowgroups compactados para aumentar linhas por rowgroup até o máximo de 1.024.576 linhas.Combines one or more compressed rowgroups to increase rows per rowgroup up to the maximum of 1,024,576 rows. Por exemplo, se você importar em massa cinco lotes de 102.400 linhas, obterá cinco rowgroups compactados.For example, if you bulk import 5 batches of 102,400 rows you will get 5 compressed rowgroups. Se você executar REORGANIZE, esses rowgroups serão mesclados em um grupo de linhas compactado de 512 mil linhas de tamanho.If you run REORGANIZE, these rowgroups will get merged into 1 compressed rowgroup of size 512,000 rows. Isso pressupõe que não havia nenhuma limitação de tamanho ou memória de dicionário.This assumes there were no dictionary size or memory limitations.

  • Para rowgroups em que 10% ou mais linhas foram excluídas logicamente, o SQL Server tenta combinar esse grupo de linhas com um ou mais rowgroups.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. Por exemplo, o rowgroup 1 é compactado com 500 mil linhas e o rowgroup 21 é compactado com o máximo de 1.048.576 linhas.For example, rowgroup 1 is compressed with 500,000 rows and rowgroup 21 is compressed with the maximum of 1,048,576 rows. O rowgroup 21 tem 60% das linhas excluídas, o que deixa 409.830 linhas.Rowgroup 21 has 60% of the rows deleted which leaves 409,830 rows. O SQL Server favorece combinar esses dois rowgroups para compactar um novo rowgroup com 909.830 linhas.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 } )

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2016 (13.x)SQL Server 2016 (13.x)) e Banco de Dados SQLSQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x)) and Banco de Dados SQLSQL Database

COMPRESS_ALL_ROW_GROUPS fornece uma maneira de forçar os rowgroups delta OPEN ou CLOSED para o columnstore.COMPRESS_ALL_ROW_GROUPS provides a way to force OPEN or CLOSED delta rowgroups into the columnstore. Com essa opção, não é necessário recompilar o índice columnstore para esvaziar os rowgroups delta.With this option, it is not necessary to rebuild the columnstore index to empty the delta rowgroups. Isso, combinado a outros recursos de desfragmentação de remover e mesclar, faz com que não seja mais necessário recompilar o índice na maioria das situações.This, combined with the other remove and merge defragmentation features makes it no longer necessary to rebuild the index in most situations.

  • ON força todos os rowgroups para a columnstore, não importa o tamanho e o estado (CLOSED ou OPEN).ON forces all rowgroups into the columnstore, regardless of size and state (CLOSED or OPEN).

  • OFF força todos os rowgroups CLOSED para o columnstore.OFF forces all CLOSED rowgroups into the columnstore.

SET ( <set_index option> [ ,... n] )SET ( <set_index option> [ ,... n] )
Especifica opções de índice sem recriar ou reorganizar o índice.Specifies index options without rebuilding or reorganizing the index. SET não pode ser especificado para um índice desabilitado.SET cannot be specified for a disabled index.

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

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2008SQL Server 2008) e Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Banco de Dados SQLSQL Database.

Especifica o preenchimento do índice.Specifies index padding. O padrão é OFF.The default is OFF.

ONON
A porcentagem de espaço livre especificada por FILLFACTOR é aplicada às páginas de nível intermediário do índice.The percentage of free space that is specified by FILLFACTOR is applied to the intermediate-level pages of the index. Se FILLFACTOR não for especificado ao mesmo tempo em que PAD_INDEX é definido como ON, o valor do fator de preenchimento armazenado em sys.indexes será usado.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 ou fillfactor não está especificadoOFF or fillfactor is not specified
As páginas do nível intermediário são preenchidas até próximo à capacidade máxima.The intermediate-level pages are filled to near capacity. Isso deixa espaço suficiente para pelo menos uma linha do tamanho máximo que o índice pode ter, com base no conjunto de chaves das páginas intermediárias.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.

Para obter mais informações, consulte CREATE INDEX (Transact-SQL).For more information, see CREATE INDEX (Transact-SQL).

FILLFACTOR = fillfactorFILLFACTOR = fillfactor

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2008SQL Server 2008) e Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Banco de Dados SQLSQL Database.

Especifica uma porcentagem que indica quanto Mecanismo de Banco de DadosDatabase Engine deve preencher o nível folha de cada página de índice durante a criação ou alteração do índice.Specifies a percentage that indicates how full the Mecanismo de Banco de DadosDatabase Engine should make the leaf level of each index page during index creation or alteration. fillfactor deve ser um valor inteiro de 1 a 100.fillfactor must be an integer value from 1 to 100. O padrão é 0.The default is 0. Os valores de fator de preenchimento 0 e 100 são iguais em todos os aspectos.Fill factor values 0 and 100 are the same in all respects.

Uma configuração FILLFACTOR explícita é usada somente quando o índice é criado pela primeira vez ou recriado.An explicit FILLFACTOR setting applies only when the index is first created or rebuilt. O Mecanismo de Banco de DadosDatabase Engine não mantém dinamicamente a porcentagem especificada de espaço vazio nas páginas.The Mecanismo de Banco de DadosDatabase Engine does not dynamically keep the specified percentage of empty space in the pages. Para obter mais informações, consulte CREATE INDEX (Transact-SQL).For more information, see CREATE INDEX (Transact-SQL).

Para exibir a configuração do fator de preenchimento, use sys.indexes.To view the fill factor setting, use sys.indexes.

Importante

A criação ou alteração de um índice clusterizado com um valor FILLFACTOR afeta a quantidade de espaço de armazenamento que os dados ocupam, pois o Mecanismo de Banco de DadosDatabase Engine redistribui os dados quando cria o índice clusterizado.Creating or altering a clustered index with a FILLFACTOR value affects the amount of storage space the data occupies, because the Mecanismo de Banco de DadosDatabase Engine redistributes the data when it creates the clustered index.

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

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2008SQL Server 2008) e Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Banco de Dados SQLSQL Database.

Especifica se os resultados de classificação devem ser armazenados em tempdb.Specifies whether to store the sort results in tempdb. O padrão é OFF.The default is OFF.

ONON
Os resultados de classificação intermediários usados para criar o índice são armazenados no tempdb.The intermediate sort results that are used to build the index are stored in tempdb. Se tempdb estiver em um conjunto de discos diferente do banco de dados do usuário, isso poderá reduzir o tempo necessário para criar um índice.If tempdb is on a different set of disks than the user database, this may reduce the time needed to create an index. Entretanto, isso aumenta o espaço em disco usado durante a criação do índice.However, this increases the amount of disk space that is used during the index build.

OFFOFF
Os resultados intermediários de classificação são armazenados no mesmo banco de dados que o índice.The intermediate sort results are stored in the same database as the index.

Se uma operação de classificação não for necessária, ou se a classificação puder ser executada na memória, a opção SORT_IN_TEMPDB será ignorada.If a sort operation is not required, or if the sort can be performed in memory, the SORT_IN_TEMPDB option is ignored.

Para obter mais informações, consulte a Opção SORT_IN_TEMPDB para índices.For more information, see SORT_IN_TEMPDB Option For Indexes.

IGNORE_DUP_KEY = { ON | OFF }IGNORE_DUP_KEY = { ON | OFF }
Especifica a resposta de erro quando uma operação de inserção tenta inserir valores da chave duplicada em um índice exclusivo.Specifies the error response when an insert operation attempts to insert duplicate key values into a unique index. A opção IGNORE_DUP_KEY aplica-se apenas a operações de inserção depois que o índice é criado ou recriado.The IGNORE_DUP_KEY option applies only to insert operations after the index is created or rebuilt. O padrão é OFF.The default is OFF.

ONON
Uma mensagem de aviso será exibida quando valores de chave duplicados forem inseridos em um índice exclusivo.A warning message will occur when duplicate key values are inserted into a unique index. Ocorrerá falha somente nas linhas que violarem a restrição de exclusividade.Only the rows violating the uniqueness constraint will fail.

OFFOFF
Ocorrerá uma mensagem de erro quando os valores de chave duplicados forem inseridos em um índice exclusivo.An error message will occur when duplicate key values are inserted into a unique index. Toda a operação INSERT será revertida.The entire INSERT operation will be rolled back.

IGNORE_DUP_KEY não pode ser definido como ON para índices criados em uma exibição, índices não exclusivos, índices XML, índices espaciais e índices filtrados.IGNORE_DUP_KEY cannot be set to ON for indexes created on a view, non-unique indexes, XML indexes, spatial indexes, and filtered indexes.

Para exibir IGNORE_DUP_KEY, use sys.indexes.To view IGNORE_DUP_KEY, use sys.indexes.

Na sintaxe compatível com versões anteriores, WITH IGNORE_DUP_KEY é equivalente a 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 }
Especifica se as estatísticas de distribuição são recomputadas.Specifies whether distribution statistics are recomputed. O padrão é OFF.The default is OFF.

ONON
As estatísticas desatualizadas não são recalculadas automaticamente.Out-of-date statistics are not automatically recomputed.

OFFOFF
A atualização automática de estatísticas está habilitada.Automatic statistics updating are enabled.

Para restaurar a atualização automática de estatísticas, defina STATISTICS_NORECOMPUTE como OFF ou execute UPDATE STATISTICS sem a cláusula NORECOMPUTE.To restore automatic statistics updating, set the STATISTICS_NORECOMPUTE to OFF, or execute UPDATE STATISTICS without the NORECOMPUTE clause.

Importante

Desabilitar o recálculo automático de estatísticas de distribuição pode impedir que o otimizador de consulta selecione os planos de execução ideais para consultas que envolvem a tabela.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 }
Quando estiver ON, as estatísticas serão criadas conforme as estatísticas de partição.When ON, the statistics created are per partition statistics. Quando estiver OFF, a árvore de estatísticas será removida e o SQL ServerSQL Server calculará as estatísticas novamente.When OFF, the statistics tree is dropped and SQL ServerSQL Server re-computes the statistics. O padrão é OFF.The default is OFF.

Se as estatísticas por partição não tiverem suporte, a opção será ignorada e um aviso será gerado.If per partition statistics are not supported the option is ignored and a warning is generated. As estatísticas incrementais não têm suporte para os seguintes tipos de estatísticas:Incremental stats are not supported for following statistics types:

  • Estatísticas criadas com os índices que não estejam alinhados por partição com a tabela base.Statistics created with indexes that are not partition-aligned with the base table.
  • Estatísticas criadas em bancos de dados secundários legíveis AlwaysOn.Statistics created on Always On readable secondary databases.
  • Estatísticas criadas em bancos de dados somente leitura.Statistics created on read-only databases.
  • Estatísticas criadas em índices filtrados.Statistics created on filtered indexes.
  • Estatísticas criadas em exibições.Statistics created on views.
  • Estatísticas criadas em tabelas internas.Statistics created on internal tables.
  • Estatísticas criadas com índices espaciais ou índices XML.Statistics created with spatial indexes or XML indexes.

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2014 (12.x)SQL Server 2014 (12.x)) e Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2014 (12.x)SQL Server 2014 (12.x)) and Banco de Dados SQLSQL Database.

ONLINE = { ON | OFF } <conforme se aplica a rebuild_index_option>ONLINE = { ON | OFF } <as applies to rebuild_index_option>
Especifica se as tabelas subjacentes e os índices associados estão disponíveis para consultas e modificação de dados durante a operação de índice.Specifies whether underlying tables and associated indexes are available for queries and data modification during the index operation. O padrão é OFF.The default is OFF.

Para um índice XML ou índice espacial, só há suporte para ONLINE = OFF e, se ONLINE for definido como ON, um erro será gerado.For an XML index or spatial index, only ONLINE = OFF is supported, and if ONLINE is set to ON an error is raised.

Observação

As operações de índice online não estão disponíveis em todas as edições de MicrosoftMicrosoft SQL ServerSQL Server.Online index operations are not available in every edition of MicrosoftMicrosoft SQL ServerSQL Server. Para obter uma lista de recursos compatíveis com as edições do SQL ServerSQL Server, consulte Edições e recursos compatíveis com SQL Server 2016 (13.x)SQL Server 2016 (13.x) e Edições e os recursos compatíveis com 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
Bloqueios de tabela de longa duração não são mantidos durante a operação do índice.Long-term table locks are not held for the duration of the index operation. Durante a fase principal da operação de índice, apenas um bloqueio IS (Tentativa Compartilhada) é mantido na tabela de origem.During the main phase of the index operation, only an Intent Share (IS) lock is held on the source table. Isso permite que as consultas ou atualizações na tabela e nos índices subjacentes continuem.This allows queries or updates to the underlying table and indexes to continue. No início da operação, um bloqueio S (Compartilhado) é mantido brevemente no objeto de origem.At the start of the operation, a Shared (S) lock is very briefly held on the source object. Ao término da operação, por um breve momento, um bloqueio S será mantido na origem se um índice não clusterizado estiver sendo criado; ou um bloqueio SCH-M (Modificação de Esquema) será adquirido quando um índice clusterizado for criado ou descartado online, ou quando um índice clusterizado ou não clusterizado estiver sendo recriado.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. Não será possível definir ONLINE como ON quando um índice estiver sendo criado em uma tabela temporária local.ONLINE cannot be set to ON when an index is being created on a local temporary table.

OFFOFF
Os bloqueios de tabela são aplicados enquanto durar a operação de índice.Table locks are applied for the duration of the index operation. Uma operação de índice offline que cria, recria ou descarta um índice clusterizado, espacial ou XML, ou que recria ou descarta um índice não clusterizado, adquire um bloqueio Sch-M na tabela.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. Isso evita o acesso de todos os usuários à tabela subjacente enquanto durar a operação.This prevents all user access to the underlying table for the duration of the operation. Uma operação de índice offline que cria um índice não clusterizado adquire um bloqueio Compartilhado (S) na tabela.An offline index operation that creates a nonclustered index acquires a Shared (S) lock on the table. Isso impede atualizações na tabela subjacente, mas permite operações de leitura, como instruções SELECT.This prevents updates to the underlying table but allows read operations, such as SELECT statements.

Para obter mais informações, consulte Como funcionam as operações de índice online.For more information, see How Online Index Operations Work.

Índices, inclusive aqueles em tabelas temporárias globais, podem ser recriados online com as seguintes exceções:Indexes, including indexes on global temp tables, can be rebuilt online with the following exceptions:

  • índices XMLXML indexes

  • Índices em tabelas temporárias locaisIndexes on local temp tables

  • Um subconjunto de um índice particionado (é possível recriar online um índice particionado inteiro.)A subset of a partitioned index (An entire partitioned index can be rebuilt online.)

  • Banco de Dados SQLSQL Database anterior à V12 e do SQL Server anterior à SQL Server 2012 (11.x)SQL Server 2012 (11.x), não permita a opção ONLINE para compilação de índice clusterizado nem operações de recompilação quando a tabela base contiver colunas varchar(max) ou varbinary(max). prior to V12, and SQL Server prior to SQL Server 2012 (11.x)SQL Server 2012 (11.x), do not permit the ONLINE option for clustered index build or rebuild operations when the base table contains varchar(max) or varbinary(max) columns.

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

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2017 (14.x)SQL Server 2017 (14.x)) e Banco de Dados SQLSQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and Banco de Dados SQLSQL Database

Especifica se uma operação de índice online é retomável.Specifies whether an online index operation is resumable.

ON A operação do índice é retomável.ON Index operation is resumable.

OFF A operação do índice não é retomável.OFF Index operation is not resumable.

MAX_DURATION = time [MINUTES] usado com RESUMABLE = ON (requer ONLINE = ON).MAX_DURATION = time [MINUTES] used with RESUMABLE = ON (requires ONLINE = ON).

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2017 (14.x)SQL Server 2017 (14.x)) e Banco de Dados SQLSQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and Banco de Dados SQLSQL Database

Indica o tempo (um valor inteiro especificado em minutos) pelo qual um uma operação de índice online retomável é executada antes de ser colocada em pausa.Indicates time (an integer value specified in minutes) that a resumable online index operation is executed before being paused.

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

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2008SQL Server 2008) e Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Banco de Dados SQLSQL Database.

Especifica se bloqueios de linha são permitidos.Specifies whether row locks are allowed. O padrão é ON.The default is ON.

ONON
Bloqueios de linha são permitidos ao acessar o índice.Row locks are allowed when accessing the index. O Mecanismo de Banco de DadosDatabase Engine determina quando os bloqueios de linha são usados.The Mecanismo de Banco de DadosDatabase Engine determines when row locks are used.

OFFOFF
Bloqueios de linha não são usados.Row locks are not used.

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

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2008SQL Server 2008) e Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Banco de Dados SQLSQL Database.

Especifica se bloqueios de página são permitidos.Specifies whether page locks are allowed. O padrão é ON.The default is ON.

ONON
Bloqueios de página são permitidos ao acessar o índice.Page locks are allowed when you access the index. O Mecanismo de Banco de DadosDatabase Engine determina quando os bloqueios de página são usados.The Mecanismo de Banco de DadosDatabase Engine determines when page locks are used.

OFFOFF
Bloqueios de página não são usados.Page locks are not used.

Observação

Um índice não pode ser reorganizado quando ALLOW_PAGE_LOCKS está definido como OFF.An index cannot be reorganized when ALLOW_PAGE_LOCKS is set to OFF.

MAXDOP = max_degree_of_parallelismMAXDOP = max_degree_of_parallelism

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2008SQL Server 2008) e Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Banco de Dados SQLSQL Database.

Substitui a opção de configuração max degree of parallelism enquanto durar a operação do índice.Overrides the max degree of parallelism configuration option for the duration of the index operation. Para obter mais informações, veja Configurar a opção max degree of parallelism de configuração de servidor.For more information, see Configure the max degree of parallelism Server Configuration Option. Use MAXDOP para limitar o número de processadores usados em uma execução de plano paralelo.Use MAXDOP to limit the number of processors used in a parallel plan execution. O máximo é de 64 processadores.The maximum is 64 processors.

Importante

Embora a opção MAXDOP tenha suporte sintaticamente em todos os índices XML, para um índice espacial ou um índice XML primário, no momento, ALTER INDEX usa apenas um único processador.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 pode ser:max_degree_of_parallelism can be:

11
Suprime a geração de plano paralelo.Suppresses parallel plan generation.

>1>1
Restringe o número máximo de processadores usados em uma operação de índice paralela ao número especificado.Restricts the maximum number of processors used in a parallel index operation to the specified number.

0 (padrão)0 (default)
Usa o número real de processadores, ou menos, com base na carga de trabalho atual do sistema.Uses the actual number of processors or fewer based on the current system workload.

Para obter mais informações, consulte Configurar operações de índice paralelo.For more information, see Configure Parallel Index Operations.

Observação

As operações de índice paralelas não estão disponíveis em todas as edições do MicrosoftMicrosoft SQL ServerSQL Server.Parallel index operations are not available in every edition of MicrosoftMicrosoft SQL ServerSQL Server. Para obter uma lista de recursos compatíveis com as edições do SQL ServerSQL Server, consulte Edições e recursos compatíveis para SQL Server 2016 (13.x)SQL Server 2016 (13.x).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).

COMPRESSION_DELAY = { 0 |duration [Minutes] }COMPRESSION_DELAY = { 0 |duration [Minutes] }
Este recurso está disponível começando com o SQL Server 2016 (13.x)SQL Server 2016 (13.x)This feature is available Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x)

Para uma tabela baseada em disco, o atraso especifica o número mínimo de minutos que um rowgroup delta no estado CLOSED deve permanecer no rowgroup delta antes de o SQL Server poder compactá-lo no rowgroup compactado.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. Uma vez que tabelas baseadas em disco não controlam tempos de inserção e atualização em linhas individuais, o SQL Server aplica o atraso a rowgroups delta no estado 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.
O padrão é 0 minuto.The default is 0 minutes.

O padrão é 0 minuto.The default is 0 minutes.

Para obter recomendações sobre quando usar COMPRESSION_DELAY, consulte Índices columnstore para análise operacional em tempo real.For recommendations on when to use COMPRESSION_DELAY, see Columnstore Indexes for Real-Time Operational Analytics.

DATA_COMPRESSIONDATA_COMPRESSION
Especifica a opção de compactação de dados para o índice, número de partição ou intervalo de partições especificado.Specifies the data compression option for the specified index, partition number, or range of partitions. As opções são as seguintes:The options are as follows:

NenhumaNONE
O índice ou as partições especificadas não são compactados.Index or specified partitions are not compressed. Não se aplica a índices columnstore.This does not apply to columnstore indexes.

ROWROW
O índice ou as partições especificadas são compactados com o uso da compactação de linha.Index or specified partitions are compressed by using row compression. Não se aplica a índices columnstore.This does not apply to columnstore indexes.

PAGEPAGE
O índice ou as partições especificadas são compactados com o uso da compactação de página.Index or specified partitions are compressed by using page compression. Não se aplica a índices columnstore.This does not apply to columnstore indexes.

COLUMNSTORECOLUMNSTORE

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2014 (12.x)SQL Server 2014 (12.x)) e Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2014 (12.x)SQL Server 2014 (12.x)) and Banco de Dados SQLSQL Database.

Aplica-se somente a índices columnstore, incluindo índices columnstore não clusterizados e clusterizados.Applies only to columnstore indexes, including both nonclustered columnstore and clustered columnstore indexes. COLUMNSTORE especifica a descompactação do índice ou partições especificadas compactadas com a opção COLUMNSTORE_ARCHIVE.COLUMNSTORE specifies to decompress the index or specified partitions that are compressed with the COLUMNSTORE_ARCHIVE option. Quando os dados forem restaurados, eles continuarão sendo compactados através da compactação columnstore usada em todos os índices 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

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2014 (12.x)SQL Server 2014 (12.x)) e Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2014 (12.x)SQL Server 2014 (12.x)) and Banco de Dados SQLSQL Database.

Aplica-se somente a índices columnstore, incluindo índices columnstore não clusterizados e clusterizados.Applies only to columnstore indexes, including both nonclustered columnstore and clustered columnstore indexes. COLUMNSTORE_ARCHIVE compactará ainda mais a partição especificada para um tamanho menor.COLUMNSTORE_ARCHIVE will further compress the specified partition to a smaller size. Isso pode ser usado para fins de arquivamento, ou em outras situações que exijam menos armazenamento e possam dispensar mais tempo para armazenamento e recuperação.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.

Para obter mais informações sobre compactação, consulte Compactação de dados.For more information about compression, see Data Compression.

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

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2008SQL Server 2008) e Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Banco de Dados SQLSQL Database.

Especifica as partições às quais se aplica a configuração DATA_COMPRESSION.Specifies the partitions to which the DATA_COMPRESSION setting applies. Se o índice não for particionado, o argumento ON PARTITIONS irá gerar um erro.If the index is not partitioned, the ON PARTITIONS argument will generate an error. Se a cláusula ON PARTITIONS não for fornecida, a opção DATA_COMPRESSION será aplicada a todas as partições de um índice particionado.If the ON PARTITIONS clause is not provided, the DATA_COMPRESSION option applies to all partitions of a partitioned index.

<partition_number_expression> pode ser especificado das seguintes maneiras:<partition_number_expression> can be specified in the following ways:

  • Forneça o número para uma partição, por exemplo: ON PARTITIONS (2).Provide the number for a partition, for example: ON PARTITIONS (2).

  • Forneça os números de várias partições individuais separados por vírgulas, por exemplo: ON PARTITIONS (1, 5).Provide the partition numbers for several individual partitions separated by commas, for example: ON PARTITIONS (1, 5).

  • Forneça os intervalos e as partições individuais: ON PARTITIONS (2, 4, 6 TO 8).Provide both ranges and individual partitions: ON PARTITIONS (2, 4, 6 TO 8).

    <range> pode ser especificado como números de partição separados pela palavra TO, por exemplo: ON PARTITIONS (6 TO 8).<range> can be specified as partition numbers separated by the word TO, for example: ON PARTITIONS (6 TO 8).

    Para definir tipos diferentes de compactação de dados para partições diferentes, especifique a opção DATA_COMPRESSION mais de uma vez, por exemplo: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 } <conforme se aplica a single_partition_rebuild_index_option>ONLINE = { ON | OFF } <as applies to single_partition_rebuild_index_option>
Especifica se um índice ou partição do índice de uma tabela subjacente pode ser recriado online ou offline.Specifies whether an index or an index partition of an underlying table can be rebuilt online or offline. Se REBUILD for executada online (ON), os dados nessa tabela estarão disponíveis para consultas e modificação de dados durante a operação de índice.If REBUILD is performed online (ON) the data in this table is available for queries and data modification during the index operation. O padrão é OFF.The default is OFF.

ONON
Bloqueios de tabela de longa duração não são mantidos durante a operação do índice.Long-term table locks are not held for the duration of the index operation. Durante a fase principal da operação de índice, apenas um bloqueio IS (Tentativa Compartilhada) é mantido na tabela de origem.During the main phase of the index operation, only an Intent Share (IS) lock is held on the source table. Um bloqueio S na tabela é exigido no Início da recompilação de índice e um bloqueio Sch-M na tabela no final da recompilação de índice online.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. Embora ambos os bloqueios sejam bloqueios de metadados curtos, especialmente o bloqueio Sch-M deve esperar que todas as transações de bloqueio sejam concluídas.Although both locks are short metadata locks, especially the Sch-M lock must wait for all blocking transactions to be completed. Durante o tempo de espera, o bloqueio Sch-M bloqueia todas as transações restantes que esperam atrás desse bloqueio ao acessar a mesma tabela.During the wait time the Sch-M lock blocks all other transactions that wait behind this lock when accessing the same table.

Observação

A recompilação de índice online pode definir as opções low_priority_lock_wait descritas posteriormente nesta seção.Online index rebuild can set the low_priority_lock_wait options described later in this section.

OFFOFF
Os bloqueios de tabela são aplicados enquanto durar a operação de índice.Table locks are applied for the duration of the index operation. Isso evita o acesso de todos os usuários à tabela subjacente enquanto durar a operação.This prevents all user access to the underlying table for the duration of the operation.

WAIT_AT_LOW_PRIORITY usado com ONLINE=ON apenas.WAIT_AT_LOW_PRIORITY used with ONLINE=ON only.

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2014 (12.x)SQL Server 2014 (12.x)) e Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2014 (12.x)SQL Server 2014 (12.x)) and Banco de Dados SQLSQL Database.

Uma recriação de índice online precisa aguardar as operações de bloqueio nesta tabela.An online index rebuild has to wait for blocking operations on this table. WAIT_AT_LOW_PRIORITY indica que a operação de recompilação do índice online aguardará bloqueios de baixa prioridade, permitindo que outras operações continuem enquanto a operação de compilação de índice online estiver aguardando.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. Omitir a opção WAIT AT LOW PRIORITY é equivalente a WAIT_AT_LOW_PRIORITY (MAX_DURATION = 0 minutos, 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). Para obter mais informações, consulte WAIT_AT_LOW_PRIORITY.For more information, see WAIT_AT_LOW_PRIORITY.

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

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2014 (12.x)SQL Server 2014 (12.x)) e Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2014 (12.x)SQL Server 2014 (12.x)) and Banco de Dados SQLSQL Database.

O tempo (um valor inteiro especificado em minutos) que a opção ou os bloqueios de recompilação de índice online deverão aguardar com baixa prioridade ao executar o comando 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. Se a operação for bloqueada por MAX_DURATION, uma das ações de ABORT_AFTER_WAIT será executada.If the operation is blocked for the MAX_DURATION time, one of the ABORT_AFTER_WAIT actions will be executed. O tempo MAX_DURATION está sempre em minutos e a palavra MINUTES pode ser omitida.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 } ]

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2014 (12.x)SQL Server 2014 (12.x)) e Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2014 (12.x)SQL Server 2014 (12.x)) and Banco de Dados SQLSQL Database.

NenhumaNONE
Continue aguardando o bloqueio com prioridade normal.Continue waiting for the lock with normal (regular) priority.

SELFSELF
Saia da operação DDL de recompilação de índice online em execução no momento sem realizar a ação.Exit the online index rebuild DDL operation currently being executed without taking any action.

BLOCKERSBLOCKERS
Elimine todas as transações de usuário que bloqueiam a operação DDL de recompilação de índice online para que a operação possa continuar.Kill all user transactions that block the online index rebuild DDL operation so that the operation can continue. A opção BLOCKERS exige que o logon tenha a permissão ALTER ANY CONNECTION.The BLOCKERS option requires the login to have ALTER ANY CONNECTION permission.

RESUMERESUME

Aplica-se a: começando com SQL Server 2017 (14.x)SQL Server 2017 (14.x)Applies to: Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)

Retome uma operação de índice que seja esteja em pausa manualmente ou devido a uma falha.Resume an index operation that is paused manually or due to a failure.

MAX_DURATION usado com RESUMABLE=ONMAX_DURATION used with RESUMABLE=ON

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2017 (14.x)SQL Server 2017 (14.x)) e Banco de Dados SQLSQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and Banco de Dados SQLSQL Database

O tempo (um valor de inteiro especificado em minutos) pelo qual a operação de índice online é executada após ser retomada.The time (an integer value specified in minutes) the resumable online index operation is executed after being resumed. Quando o tempo expirar, a operação retomável será colocada em pausa se ainda estiver em execução.Once the time expires, the resumable operation is paused if it is still running.

WAIT_AT_LOW_PRIORITY usado com RESUMABLE=ON e ONLINE = ON.WAIT_AT_LOW_PRIORITY used with RESUMABLE=ON and ONLINE = ON.

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2017 (14.x)SQL Server 2017 (14.x)) e Banco de Dados SQLSQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and Banco de Dados SQLSQL Database

Retomar uma recompilação de índice online após uma pausa precisa esperar as operações de bloqueio nesta tabela.Resuming an online index rebuild after a pause has to wait for blocking operations on this table. WAIT_AT_LOW_PRIORITY indica que a operação de recompilação do índice online aguardará bloqueios de baixa prioridade, permitindo que outras operações continuem enquanto a operação de compilação de índice online estiver aguardando.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. Omitir a opção WAIT AT LOW PRIORITY é equivalente a WAIT_AT_LOW_PRIORITY (MAX_DURATION = 0 minutos, 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). Para obter mais informações, consulte WAIT_AT_LOW_PRIORITY.For more information, see WAIT_AT_LOW_PRIORITY.

PAUSEPAUSE

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2017 (14.x)SQL Server 2017 (14.x)) e Banco de Dados SQLSQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and Banco de Dados SQLSQL Database

Pause uma operação de recompilação de índice online retomável.Pause a resumable online index rebuild operation.

ABORTABORT

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2017 (14.x)SQL Server 2017 (14.x)) e Banco de Dados SQLSQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and Banco de Dados SQLSQL Database

Anule uma operação de índice em execução ou em pausa declarada como retomável.Abort a running or paused index operation that was declared as resumable. Você precisa executar explicitamente uma operação ABORT para terminar uma operação de recompilação de índice retomável.You have to explicitly execute an ABORT command to terminate a resumable index rebuild operation. Falha ou pausar uma operação de índice retomável não termina sua execução; em vez disso, deixa a operação em um estado de pausa indefinido.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 não pode ser usado para reparticionar um índice ou movê-lo para um grupo de arquivos diferente.ALTER INDEX cannot be used to repartition an index or move it to a different filegroup. Essa instrução não pode ser usada para modificar a definição de índice, como adicionar ou excluir colunas ou alterar a ordem das colunas.This statement cannot be used to modify the index definition, such as adding or deleting columns or changing the column order. Use CREATE INDEX com a cláusula DROP_EXISTING para executar essas operações.Use CREATE INDEX with the DROP_EXISTING clause to perform these operations.

Quando uma opção não for especificada explicitamente, a configuração atual será aplicada.When an option is not explicitly specified, the current setting is applied. Por exemplo, se uma configuração FILLFACTOR não for especificada na cláusula REBUILD, o valor do fator de preenchimento armazenado no catálogo do sistema será usado durante o processo de recriação.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. Para exibir as configurações de opção de índice atuais, use sys.indexes.To view the current index option settings, use sys.indexes.

Os valores de ONLINE, MAXDOP e SORT_IN_TEMPDB não são armazenados no catálogo do sistema.The values for ONLINE, MAXDOP, and SORT_IN_TEMPDB are not stored in the system catalog. A menos que especificado na instrução de índice, o valor padrão da opção será usado.Unless specified in the index statement, the default value for the option is used.

Em computadores com multiprocessadores, assim como ocorre com outras consultas, ALTER INDEX... REBUILD usa automaticamente mais processadores para executar as operações de verificação e classificação que estão associadas à modificação do índice.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. Quando você executa ALTER INDEX... REORGANIZE, com ou sem LOB_COMPACTION, o valor grau máximo de paralelismo é uma operação encadeada única.When you run ALTER INDEX ... REORGANIZE, with or without LOB_COMPACTION, the max degree of parallelism value is a single threaded operation. Para obter mais informações, consulte Configurar operações de índice paralelo.For more information, see Configure Parallel Index Operations.

Importante

Um índice não poderá ser reorganizado ou recriado se o grupo de arquivos no qual ele está localizado estiver offline ou definido como somente leitura.An index cannot be reorganized or rebuilt if the filegroup in which it is located is offline or set to read-only. Quando a palavra-chave ALL for especificada e um ou mais índices estiver em um grupo de arquivos offline ou somente leitura, a instrução falhará.When the keyword ALL is specified and one or more indexes are in an offline or read-only filegroup, the statement fails.

Recompilando índicesRebuilding Indexes

A recriação de um índice descarta e recria o índice.Rebuilding an index drops and re-creates the index. Isso remove a fragmentação, recupera espaço em disco ao compactar as páginas com base na configuração do fator de preenchimento especificada ou existente, e reclassifica as linhas do índice em páginas contíguas.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. Quando ALL é especificado, todos os índices da tabela são descartados e recriados em uma única transação.When ALL is specified, all indexes on the table are dropped and rebuilt in a single transaction. As restrições de chave estrangeira não precisam ser descartadas com antecedência.Foreign key constraints do not have to be dropped in advance. Quando índices com 128 extensões ou mais são recriados, o Mecanismo de Banco de DadosDatabase Engine adia as desalocações de página atuais e seus bloqueios associados até depois da confirmação da transação.When indexes with 128 extents or more are rebuilt, the Mecanismo de Banco de DadosDatabase Engine defers the actual page deallocations, and their associated locks, until after the transaction commits.

Para obter mais informações, veja Reorganizar e recriar índices.For more information, see Reorganize and Rebuild Indexes.

Observação

A recriação ou reorganização de índices pequenos geralmente não reduz a fragmentação.Rebuilding or reorganizing small indexes often does not reduce fragmentation. As páginas de índices pequenos às vezes são armazenadas em extensões mistas.The pages of small indexes are sometimes stored on mixed extents. Extensões mistas são compartilhadas por até oito objetos, portanto, a fragmentação em um índice pequeno pode não ser reduzida após a reorganização ou recriação.Mixed extents are shared by up to eight objects, so the fragmentation in a small index might not be reduced after reorganizing or rebuilding it.

Importante

Quando um índice for criado ou reconstruído no SQL ServerSQL Server, as estatísticas serão criadas ou atualizadas por meio do exame de todas as linhas da tabela.When an index is created or rebuilt in SQL ServerSQL Server, statistics are created or updated by scanning all the rows in the table.

No entanto, começando com o SQL Server 2012 (11.x)SQL Server 2012 (11.x), as estatísticas não são criadas por meio do exame de todas as linhas da tabela quando um índice particionado é criado ou reconstruído.However, starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x), statistics are not created by scanning all the rows in the table when a partitioned index is created or rebuilt. Em vez disso, o otimizador de consultas usa o algoritmo de amostragem padrão para gerar essas estatísticas.Instead, the query optimizer uses the default sampling algorithm to generate these statistics. Para obter estatísticas em índices particionados por meio do exame de todas as linhas da tabela, use CREATE STATISTICS ou UPDATE STATISTICS com a cláusula FULLSCAN.To obtain statistics on partitioned indexes by scanning all the rows in the table, use CREATE STATISTICS or UPDATE STATISTICS with the FULLSCAN clause.

Nas versões anteriores do SQL ServerSQL Server, às vezes, era possível recriar um índice não clusterizado para corrigir as inconsistências causadas por falhas de hardware.In earlier versions of SQL ServerSQL Server, you could sometimes rebuild a nonclustered index to correct inconsistencies caused by hardware failures.
No SQL Server 2008SQL Server 2008 e posteriores, ainda é possível reparar essas inconsistências entre o índice e o índice clusterizado recriando um índice não clusterizado offline.In SQL Server 2008SQL Server 2008 and later, you may still be able to repair such inconsistencies between the index and the clustered index by rebuilding a nonclustered index offline. Entretanto, não é possível reparar inconsistências de índice não clusterizado recriando o índice online, porque o mecanismo de recriação online usará o índice não clusterizado existente como base para a recriação e, portanto, a inconsistência persistirá.However, you cannot repair nonclustered index inconsistencies by rebuilding the index online, because the online rebuild mechanism will use the existing nonclustered index as the basis for the rebuild and thus persist the inconsistency. A recriação do índice offline poderá forçar, algumas vezes, um exame do índice clusterizado (ou heap) e, consequentemente, remover a inconsistência.Rebuilding the index offline can sometimes force a scan of the clustered index (or heap) and so remove the inconsistency. Para garantir uma recompilação do índice clusterizado, remova e recrie o índice não clusterizado.To assure a rebuild from the clustered index, drop and recreate the non-clustered index. Como nas versões anteriores, é recomendável que a recuperação de inconsistências seja feita com a restauração dos dados afetados de um backup; porém, talvez seja possível reparar as inconsistências do índice recriando o índice não clusterizado offline.As with earlier versions, we recommend recovering from inconsistencies by restoring the affected data from a backup; however, you may be able to repair the index inconsistencies by rebuilding the nonclustered index offline. Para obter mais informações, veja DBCC CHECKDB (Transact-SQL).For more information, see DBCC CHECKDB (Transact-SQL).

Para recompilar um índice columnstore clusterizado, SQL ServerSQL Server:To rebuild a clustered columnstore index, SQL ServerSQL Server:

  1. Obtenha um bloqueio exclusivo na tabela ou na partição durante a recompilação.Acquires an exclusive lock on the table or partition while the rebuild occurs. Os dados estão “offline” e indisponíveis durante a recompilação.The data is “offline” and unavailable during the rebuild.

  2. Desfragmenta o columnstore excluindo fisicamente as linhas que foram excluídas logicamente da tabela; os bytes excluídos são recuperados na mídia física.Defragments the columnstore by physically deleting rows that have been logically deleted from the table; the deleted bytes are reclaimed on the physical media.

  3. Lê todos os dados do índice columnstore original, incluindo o deltastore.Reads all data from the original columnstore index, including the deltastore. Combina os dados em novos rowgroups e compacta os rowgroups em columnstore.It combines the data into new rowgroups, and compresses the rowgroups into the columnstore.

  4. Requer espaço no meio físico para armazenar duas cópias do índice columnstore durante a recriação.Requires space on the physical media to store two copies of the columnstore index while the rebuild is taking place. Quando a recompilação é concluída, o SQL ServerSQL Server exclui o índice columnstore clusterizado original.When the rebuild is finished, SQL ServerSQL Server deletes the original clustered columnstore index.

Reorganizando índicesReorganizing Indexes

A reorganização de um índice utiliza recursos mínimos do sistema.Reorganizing an index uses minimal system resources. Ela desfragmenta o nível folha de índices clusterizados e não clusterizados em tabelas e exibições, reordenando fisicamente as páginas de nível folha para que correspondam à ordem lógica, da esquerda para a direita, dos nós folha.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. A reorganização também compacta as páginas de índice.Reorganizing also compacts the index pages. A compactação baseia-se no valor do fator de preenchimento existente.Compaction is based on the existing fill factor value. Para exibir a configuração do fator de preenchimento, use sys.indexes.To view the fill factor setting, use sys.indexes.

Quando ALL for especificado, os índices relacionais, clusterizados e não clusterizados e os índices XML da tabela serão reorganizados.When ALL is specified, relational indexes, both clustered and nonclustered, and XML indexes on the table are reorganized. Algumas restrições se aplicam quando ALL é especificado; veja a definição de ALL na seção Argumentos deste artigo.Some restrictions apply when specifying ALL, refer to the definition for ALL in the Arguments section of this article.

Para obter mais informações, veja Reorganizar e recriar índices.For more information, see Reorganize and Rebuild Indexes.

Importante

Quando um índice é reorganizado em SQL ServerSQL Server, as estatísticas não são atualizadas.When an index is reorganized in SQL ServerSQL Server, statistics are not updated.

Desabilitando índicesDisabling Indexes

A desabilitação de um índice impede o acesso do usuário ao índice, e, para índices clusterizados, aos dados da tabela subjacente.Disabling an index prevents user access to the index, and for clustered indexes, to the underlying table data. A definição de índice permanece no catálogo do sistema.The index definition remains in the system catalog. A desabilitação de um índice não clusterizado ou clusterizado em uma exibição exclui fisicamente os dados do índice.Disabling a nonclustered index or clustered index on a view physically deletes the index data. A desabilitação de um índice clusterizado impede o acesso aos dados, mas eles permanecem inalterados na árvore B até que o índice seja descartado ou recriado.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. Para exibir o status de um índice habilitado ou desabilitado, consulte a coluna is_disabled na exibição do catálogo sys.indexes.To view the status of an enabled or disabled index, query the is_disabled column in the sys.indexes catalog view.

Se uma tabela estiver em uma publicação de replicação transacional, não será possível desabilitar nenhum índice associado a colunas de chave primária.If a table is in a transactional replication publication, you cannot disable any indexes that are associated with primary key columns. Esses índices são necessários para a replicação.These indexes are required by replication. Para desabilitar um índice, você deve primeiramente descartar a tabela da publicação.To disable an index, you must first drop the table from the publication. Para obter mais informações, consulte Publicar dados e objetos de banco de dados.For more information, see Publish Data and Database Objects.

Use a instrução ALTER INDEX REBUILD ou CREATE INDEX WITH DROP_EXISTING para habilitar o índice.Use the ALTER INDEX REBUILD statement or the CREATE INDEX WITH DROP_EXISTING statement to enable the index. A recriação de um índice clusterizado desabilitado não pode ser executada com a opção ONLINE definida como ON.Rebuilding a disabled clustered index cannot be performed with the ONLINE option set to ON. Para obter mais informações, consulte Desabilitar índices e restrições.For more information, see Disable Indexes and Constraints.

Opções de configuraçãoSetting Options

É possível definir as opções ALLOW_ROW_LOCKS, ALLOW_PAGE_LOCKS, IGNORE_DUP_KEY e STATISTICS_NORECOMPUTE para um índice especificado sem recriá-lo ou reorganizá-lo.You can set the options ALLOW_ROW_LOCKS, ALLOW_PAGE_LOCKS, IGNORE_DUP_KEY and STATISTICS_NORECOMPUTE for a specified index without rebuilding or reorganizing that index. Os valores modificados são aplicados imediatamente ao índice.The modified values are immediately applied to the index. Para exibir essas configurações, use sys.indexes.To view these settings, use sys.indexes. Para obter mais informações sobre opções de índice, consulte Definir opções de índice.For more information, see Set Index Options.

Opções de bloqueios de linha e de páginaRow and Page Locks Options

Quando ALLOW_ROW_LOCKS = ON e ALLOW_PAGE_LOCK = ON, os bloqueios em nível de linha, página e tabela são permitidos quando você acessa o índice.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. O Mecanismo de Banco de DadosDatabase Engine escolhe o bloqueio apropriado e pode escalar o bloqueio de uma linha ou página para um bloqueio de tabela.The Mecanismo de Banco de DadosDatabase Engine chooses the appropriate lock and can escalate the lock from a row or page lock to a table lock.

Quando ALLOW_ROW_LOCKS = OFF e ALLOW_PAGE_LOCK = OFF, somente um bloqueio em nível de tabela é permitido ao acessar o índice.When ALLOW_ROW_LOCKS = OFF and ALLOW_PAGE_LOCK = OFF, only a table-level lock is allowed when you access the index.

Se ALL for especificado quando as opções de bloqueio de linha ou de página forem definidas, as configurações serão aplicadas a todos os índices.If ALL is specified when the row or page lock options are set, the settings are applied to all indexes. Quando a tabela subjacente é um heap, as configurações são aplicadas das seguintes maneiras:When the underlying table is a heap, the settings are applied in the following ways:

ALLOW_ROW_LOCKS = ON ou OFFALLOW_ROW_LOCKS = ON or OFF Ao heap e a quaisquer índices não clusterizados associados.To the heap and any associated nonclustered indexes.
ALLOW_PAGE_LOCKS = ONALLOW_PAGE_LOCKS = ON Ao heap e a quaisquer índices não clusterizados associados.To the heap and any associated nonclustered indexes.
ALLOW_PAGE_LOCKS = OFFALLOW_PAGE_LOCKS = OFF Totalmente aos índices não clusterizados.Fully to the nonclustered indexes. Isso significa que todos os bloqueios de página não são permitidos nos índices não clusterizados.This means that all page locks are not allowed on the nonclustered indexes. No heap, somente os bloqueios S (compartilhados), U (atualização) e X (exclusivos) da página não são permitidos.On the heap, only the shared (S), update (U) and exclusive (X) locks for the page are not allowed. O Mecanismo de Banco de DadosDatabase Engine ainda pode adquirir um bloqueio de página intencional (IS, IU ou IX) para fins internos.The Mecanismo de Banco de DadosDatabase Engine can still acquire an intent page lock (IS, IU or IX) for internal purposes.

Operações de índice onlineOnline Index Operations

Ao recriar um índice, se a opção ONLINE estiver definida como ON, os objetos, as tabelas e os índices associados subjacentes estarão disponíveis para consultas e modificação de dados.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. Você também pode recriar online uma parte de um índice que reside em uma única partição.You can also rebuild online a portion of an index residing on a single partition. Os bloqueios de tabela exclusivos são mantidos por pouco tempo durante o processo de alteração.Exclusive table locks are held only for a very short amount of time during the alteration process.

A reorganização de um índice sempre é executada online.Reorganizing an index is always performed online. O processo não mantém bloqueios de longo prazo e, portanto, não bloqueia consultas ou atualizações em execução.The process does not hold locks long term and, therefore, does not block queries or updates that are running.

É possível executar operações de índice online simultâneas na mesma tabela ou partição de tabela somente ao fazer o seguinte:You can perform concurrent online index operations on the same table or table partition only when doing the following:

  • Criar vários índices não clusterizados.Creating multiple nonclustered indexes.
  • Reorganizar índices diferentes na mesma tabela.Reorganizing different indexes on the same table.
  • Reorganizar índices diferentes ao recriar índices não sobrepostos na mesma tabela.Reorganizing different indexes while rebuilding nonoverlapping indexes on the same table.

Todas as outras operações de índice online executadas ao mesmo tempo falham.All other online index operations performed at the same time fail. Por exemplo, não é possível recriar dois ou mais índices na mesma tabela ao mesmo tempo, ou criar um novo índice ao recriar um índice existente na mesma tabela.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.

Operações de índice retomáveisResumable index operations

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2017 (14.x)SQL Server 2017 (14.x)) e Banco de Dados SQLSQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and Banco de Dados SQLSQL Database

Online index rebuild é especificado como retomável usando a opção RESUMABLE=ON.Online index rebuild is specified as resumable using the RESUMABLE = ON option.

  • A opção RESUMABLE não persiste nos metadados para um determinado índice e se aplica somente à duração de uma instrução DDL atual.The RESUMABLE option is not persisted in the metadata for a given index and applies only to the duration of a current DDL statement. Portanto, a cláusula RESUMABLE = ON deve ser especificada explicitamente para habilitar a capacidade de retomada.Therefore, the RESUMABLE = ON clause must be specified explicitly to enable resumability.
  • A opção MAX_DURATION é compatível com a opção RESUMABLE=ON ou com a opção de argumento low_priority_lock_wait.MAX_DURATION option is supported for RESUMABLE = ON option or the low_priority_lock_wait argument option.

    • A opção MAX_DURATION para RESUMABLE especifica o intervalo para um índice que está sendo recompilado.MAX_DURATION for RESUMABLE option specifies the time interval for an index being rebuild. Depois que esse tempo é consumido, a recompilação de índice é colocada em pausa ou conclui sua execução.Once this time is used the index rebuild is either paused or it completes its execution. O usuário decide quando uma recompilação de um índice em pausa pode ser retomada.User decides when a rebuild for a paused index can be resumed. O time em minutos para MAX_DURATION deve ser maior que 0 minutos e menor ou igual uma semana (7 * 24 * 60 = 10.080 minutos).The time in minutes for MAX_DURATION must be greater than 0 minutes and less or equal one week (7 * 24 * 60 = 10080 minutes). Ter uma longa pausa para uma operação de índice pode afetar o desempenho de DML em uma tabela específica, bem como a capacidade de disco de banco de dados, já que tanto o original quanto o recém-criado exigem espaço em disco e precisam ser atualizados durante as operações 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. Se a opção MAX_DURATION for omitida, a operação de índice continuará até sua conclusão ou até que ocorra uma falha.If MAX_DURATION option is omitted, the index operation will continue until its completion or until a failure occurs.
    • A opção de argumento <low_priority_lock_wait > permite que você decida como a operação de índice pode continuar quando bloqueada no bloqueio 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.
  • Executar novamente a instrução ALTER INDEX REBUILD original com os mesmos parâmetros retoma uma operação de recompilação de índice em pausa.Re-executing the original ALTER INDEX REBUILD statement with the same parameters resumes a paused index rebuild operation. Você também pode retomar uma operação de recompilação de índice em pausa executando a instrução ALTER INDEX RESUME.You can also resume a paused index rebuild operation by executing the ALTER INDEX RESUME statement.

  • A opção SORT_IN_TEMPDB=ON não é compatível com índice retomávelThe SORT_IN_TEMPDB=ON option is not supported for resumable index
  • O comando DDL com RESUMABLE=ON não pode ser executado em uma transação explícita (não pode fazer parte do bloco de confirmaçãoThe DDL command with RESUMABLE=ON cannot be executed inside an explicit transaction (cannot be part of begin tran … begin tran…).commit block).
  • Apenas operações de índice em pausa estão retomáveis.Only index operations that are paused are resumable.
  • Ao retomar uma operação de índice em pausa, você pode alterar o valor MAXDOP para um novo valor.When resuming an index operation that is paused, you can change the MAXDOP value to a new value. Se MAXDOP não for especificado ao retomar uma operação de índice que está em pausa, o último valor MAXDOP será usado.If MAXDOP is not specified when resuming an index operation that is paused, the last MAXDOP value is taken. Se a opção MAXDOP não for especificada para a operação de recompilação de índice, o valor padrão será usado.IF the MAXDOP option is not specified at all for index rebuild operation, the default value is taken.
  • Para pausar imediatamente a operação de índice, você pode interromper o comando em andamento (Ctrl-C) ou executar o comando ALTER INDEX PAUSE ou o comando 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. Depois que o comando for colocado em pausa, ele poderá ser retomado usando a opção RESUME.Once the command is paused it can be resumed using RESUME option.
  • O comando ABORT elimina a sessão que hospedava a recompilação de índice original e elimina a operação de índiceThe ABORT command kills the session that hosted the original index rebuild and aborts the index operation
  • Não são necessários recursos extras para recompilação de índice retomáveis exceto paraNo extra resources are required for resumable index rebuild except for
    • Espaço adicional necessário para manter o índice que está sendo criado, incluindo o tempo em que o índice está em pausaAdditional space required to keep the index being built, including the time when index is being paused
    • Um estado DDL que impede qualquer modificação de DDLA DDL state preventing any DDL modification
  • A limpeza duplicada será executada durante a fase de pausa do índice, mas ficará em pausa durante a execução de índiceThe ghost cleanup will be running during the index pause phase, but it will be paused during index run
    A seguinte funcionalidade está desabilitada para operações de recompilação do índice retomáveisThe following functionality is disabled for resumable index rebuild operations
    • Não é possível recompilar um índice desabilitado com RESUMABLE=ONRebuilding an index that is disabled is not supported with RESUMABLE=ON
    • Comando ALTER INDEX REBUILD ALLALTER INDEX REBUILD ALL command
    • ALTER TABLE com recompilação de índiceALTER TABLE using index rebuild
    • O comando DDL com "RESUMEABLE = ON" não pode ser executado em uma transação explícita (não pode fazer parte do bloco de confirmaçãoDDL command with “RESUMEABLE = ON” cannot be executed inside an explicit transaction (cannot be part of begin tran … begin tran…)commit block)
    • Recompile um índice que tenha colunas TIMESTAMP ou computadas como colunas chave.Rebuild an index that has computed or TIMESTAMP column(s) as key columns.
  • Caso a tabela base contenha colunas LOB retomáveis clusterizadas, a recompilação do índice clusterizado exigirá um bloqueio Sch-M no início desta operaçãoIn case the base table contains LOB column(s) resumable clustered index rebuild requires a Sch-M lock in the Starting of this operation
    • A opção SORT_IN_TEMPDB=ON não é compatível com índice retomávelThe SORT_IN_TEMPDB=ON option is not supported for resumable index

Observação

O comando DDL é executado até ser concluído, pausar ou falhar.The DDL command runs until it completes, pauses or fails. Caso o comando pause, será emitido um erro indicando que a operação foi colocada em pausa e que a criação de índice não foi concluída.In case the command pauses, an error will be issued indicating that the operation was paused and that the index creation did not complete. Para obter mais informações sobre o status atual do índice, veja sys.index_resumable_operations.More information about the current index status can be obtained from sys.index_resumable_operations. Como antes, no caso de uma falha, um erro será emitido também.As before in case of a failure an error will be issued as well.

Para obter mais informações, consulte Perform Index Operations Online.For more information, see Perform Index Operations Online.

WAIT_AT_LOW_PRIORITY com operações de índice onlineWAIT_AT_LOW_PRIORITY with online index operations

Para executar a instrução DDL de uma recompilação de índice online, todas as transações de bloqueio ativas em execução em uma tabela específica devem ser concluídas.In order to execute the DDL statement for an online index rebuild, all active blocking transactions running on a particular table must be completed. Quando a recompilação de índice online for executada, ela bloqueará todas as novas transações que estão prontas para iniciar a execução nessa tabela.When the online index rebuild executes, it blocks all new transactions that are ready to start execution on this table. Embora a duração do bloqueio da recompilação de índice online seja muito curta, é possível que a espera pela conclusão de todas as transações abertas em uma tabela específica e o bloqueio das novas transações a serem iniciadas afetem significativamente a taxa de transferência, diminuindo a velocidade da carga de trabalho ou ocasionando o tempo limite da mesma, e limite consideravelmente o acesso à tabela subjacente.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. A opção WAIT_AT_LOW_PRIORITY permite que os DBAs gerenciem o bloqueio S e os bloqueios Sch-M necessários para recompilações de índice online, e permite que selecionem uma das três opções.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. Nos três casos, se, durante o tempo de espera ( (MAX_DURATION = n [minutes]) ), não houver nenhuma atividade de bloqueio, a recompilação de índice online será executada imediatamente sem aguardar e a instrução DDL será concluída.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.

Restrições em índices espaciaisSpatial Index Restrictions

Quando você recria um índice espacial, a tabela de usuário subjacente não está disponível durante a operação do índice porque o índice espacial mantém um bloqueio de esquema.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.

Não é possível modificar a restrição PRIMARY KEY na tabela de usuário quando um índice espacial está definido em uma coluna dessa tabela.The PRIMARY KEY constraint in the user table cannot be modified while a spatial index is defined on a column of that table. Para alterar a restrição PRIMARY KEY, primeiro descarte todos os índices espaciais da tabela.To change the PRIMARY KEY constraint, first drop every spatial index of the table. Depois de modificar a restrição PRIMARY KEY, é possível recriar cada um dos índices espaciais.After modifying the PRIMARY KEy constraint, you can re-create each of the spatial indexes.

Em uma única operação de recriação de partição, não é possível especificar nenhum índice espacial.In a single partition rebuild operation, you cannot specify any spatial indexes. Entretanto, você pode especificar índices espaciais em uma recriação de partição completa.However, you can specify spatial indexes in a complete partition rebuild.

Para alterar opções específicas a um índice espacial, como BOUNDING_BOX ou GRID, é possível usar uma instrução CREATE SPATIAL INDEX que especifique DROP_EXISTING = ON ou descartar o índice espacial e criar um novo.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. Para obter um exemplo, consulte CREATE SPATIAL INDEX (Transact-SQL).For an example, see CREATE SPATIAL INDEX (Transact-SQL).

Data CompressionData Compression

Para obter mais informações sobre compactação de dados, veja Compactação de dados.For a more information about data compression, see Data Compression.

Para avaliar como a alteração da compactação PAGE e ROW afetará uma tabela, um índice ou uma partição, use o procedimento armazenado 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.

As restrições a seguir se aplicam a índices particionados:The following restrictions apply to partitioned indexes:

  • Ao usar ALTER INDEX ALL ..., não será possível alterar a configuração de compactação de uma única partição se a tabela tiver índices não alinhados.When you use ALTER INDEX ALL ..., you cannot change the compression setting of a single partition if the table has nonaligned indexes.
  • O ALTER INDEX <index>... REBUILD PARTITION ... recria a partição especificada do índice.The ALTER INDEX <index> ... REBUILD PARTITION ... syntax rebuilds the specified partition of the index.
  • O ALTER INDEX <index>... REBUILD WITH... recria todas as partições do índice.The ALTER INDEX <index> ... REBUILD WITH ... syntax rebuilds all partitions of the index.

EstatísticasStatistics

Quando você executar ALTER INDEX ALL…When you execute ALTER INDEX ALL … em uma tabela, somente as estatísticas associadas a índices serão atualizadas.on a table, only the statistics associates with indexes are updated. As estatísticas automáticas ou manuais criadas na tabela (em vez de um índice) não são atualizadas.Automatic or manual statistics created on the table (instead of an index) are not updated.

PermissõesPermissions

Para executar ALTER INDEX, no mínimo, a permissão ALTER na tabela ou exibição é necessária.To execute ALTER INDEX, at a minimum, ALTER permission on the table or view is required.

Notas de versãoVersion Notes

  • Banco de Dados SQLSQL Database não usa opções filegroup nem filestream. does not use filegroup and filestream options.
  • Índices Columnstore não estão disponíveis antes de 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).
  • Operações de índice retomáveis estão disponíveis começando com SQL Server 2017 (14.x)SQL Server 2017 (14.x) e Banco de Dados SQLSQL DatabaseResumable index operations are available Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x) and Banco de Dados SQLSQL Database

Exemplo de sintaxe básica:Basic syntax example:

ALTER INDEX index1 ON table1 REBUILD;  

ALTER INDEX ALL ON table1 REBUILD;  

ALTER INDEX ALL ON dbo.table1 REBUILD;  

Exemplos: índices ColumnstoreExamples: Columnstore Indexes

Estes exemplos se aplicam a índices columnstore.These examples apply to columnstore indexes.

A.A. Demonstração de REORGANIZEREORGANIZE demo

Este exemplo demonstra como funciona o comando ALTER INDEX REORGANIZE.This example demonstrates how the ALTER INDEX REORGANIZE command works. Ele cria uma tabela que tem vários rowgroups e, em seguida, demonstra como REORGANIZE mescla os rowgroups.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;  
```sql
CREATE CLUSTERED COLUMNSTORE INDEX idxcci_cci_target ON cci_target;  

Use a opção TABLOCK para inserir linhas em paralelo.Use the TABLOCK option to insert rows in parallel. Começando com o SQL Server 2016 (13.x)SQL Server 2016 (13.x), a operação INSERT INTO pode ser executada em paralelo quando TABLOCK for usado.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;  

Execute este comando para ver os rowgroups delta OPEN.Run this command to see the OPEN delta rowgroups. O número de rowgroups depende do grau de paralelismo.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');  

Execute este comando para forçar todos os rowgroups CLOSED e OPEN para o 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);  

Execute este comando novamente e verá que os rowgroups menores são mesclados em um rowgroup compactado.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.B. Compactar rowgroups delta CLOSED para o columnstoreCompress CLOSED delta rowgroups into the columnstore

Este exemplo usa a opção REORGANIZE para compactar cada rowgroup delta CLOSED para o columnstore como um rowgroup compactado.This example uses the REORGANIZE option to compresses each CLOSED delta rowgroup into the columnstore as a compressed rowgroup. Isso não é necessário, mas é útil quando o motor de tupla não está compactando rowgroups CLOSED com rapidez suficiente.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.C. Compactar todos os rowgroups delta OPEN AND CLOSED para o columnstoreCompress all OPEN AND CLOSED delta rowgroups into the columnstore

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2016 (13.x)SQL Server 2016 (13.x)) e Banco de Dados SQLSQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x)) and Banco de Dados SQLSQL Database

O comando REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON) compacta cada rowgroup delta OPEN e CLOSED para o columnstore como um rowgroup compactado.The command REORGANIZE WITH ( COMPRESS_ALL_ROW_GROUPS = ON ) compreses each OPEN and CLOSED delta rowgroup into the columnstore as a compressed rowgroup. Isso esvazia o deltastore e força todas as linhas a serem compactadas no columnstore.This empties the deltastore and forces all rows to get compressed into the columnstore. Isso é útil principalmente depois de executar várias operações de inserção, já que essas operações armazenam as linhas em um ou mais rowgroups delta.This is useful especially after performing many insert operations since these operations store the rows in one or more delta rowgroups.

REORGANIZE combina rowgroups para preencher rowgroups até um número máximo de linhas <= 1.024.576.REORGANIZE combines rowgroups to fill rowgroups up to a maximum number of rows <= 1,024,576. Portanto, ao compactar todos os rowgroups OPEN e CLOSED, você não acabará com vários rowgroups compactados que tenham apenas algumas linhas neles.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. Você deseja que rowgroups sejam tão completos quanto possível para reduzir o tamanho compactado e melhorar o desempenho da consulta.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.D. Desfragmentar um índice columnstore onlineDefragment a columnstore index online

Não se aplica a: SQL Server 2012 (11.x)SQL Server 2012 (11.x) e 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).

Começando com o SQL Server 2016 (13.x)SQL Server 2016 (13.x), REORGANIZE faz mais que compactar rowgroups delta para o columnstore.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), REORGANIZE does more than compress delta rowgroups into the columnstore. Ele também executa a desfragmentação online.It also performs online defragmentation. Primeiro, reduz o tamanho do columnstore removendo fisicamente linhas excluídas quando 10% ou mais linhas em um grupo de linhas foram excluídos.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. Em seguida, ele combina rowgroups para formar rowgroups maiores que tenham até o máximo de 1.024.576 linhas por rowgroup.Then, it combines rowgroups together to form larger rowgroups that have up to the maximum of 1,024,576 rows per rowgroups. Todos os rowgroups que são alterados são recompactados.All rowgroups that are changed get re-compressed.

Observação

Começando com o SQL Server 2016 (13.x)SQL Server 2016 (13.x), recompilar um índice columnstore não é mais necessário na maioria das situações, já que REORGANIZE remove fisicamente linhas excluídas e mescla rowgroups.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. A opção COMPRESS_ALL_ROW_GROUPS força todos os rowgroups delta OPEN ou CLOSED para o columnstore, o que antes só podia ser feito com uma recompilação.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 está online e ocorre em segundo plano para que consultas possam continuar conforme a operação ocorre.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.E. Recompilar um índice columnstore clusterizado offlineRebuild a clustered columnstore index offline

Aplica-se a: SQL ServerSQL Server (começando com 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))

Dica

Começando com o SQL Server 2016 (13.x)SQL Server 2016 (13.x) e no Banco de dados SQL do AzureAzure SQL Database, é recomendável usar ALTER INDEX REORGANIZE, em vez de ALTER INDEX REBUILD.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) and in Banco de dados SQL do AzureAzure SQL Database, we recommend using ALTER INDEX REORGANIZE instead of ALTER INDEX REBUILD.

Observação

Em SQL Server 2012 (11.x)SQL Server 2012 (11.x) e SQL Server 2014 (12.x)SQL Server 2014 (12.x), REORGANIZE só é usado para compactar rowgroups CLOSED para o 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. É a única maneira de realizar operações de desfragmentação e forçar todos os rowgroups delta para o columnstore é recompilar o índice.The only way to perform defragmentation operations and to force all delta rowgroups into the columnstore is to rebuild the index.

Este exemplo mostra como recompilar um índice columnstore clusterizado e forçar todos os rowgroups delta para o columnstore.This example shows how to rebuild a clustered columnstore index and force all delta rowgroups into the columnstore. A primeira etapa prepara uma tabela FactInternetSales2 com um índice columnstore clusterizado e insere dados das quatro primeiras colunas.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;  

Os resultados mostram que há um rowgroup OPEN, o que significa que o SQL ServerSQL Server aguardará mais linhas serem adicionadas antes de fechar o rowgroup e mover os dados para o 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. A próxima instrução recompila o índice columnstore clusterizado, o que força todas as linhas para o 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;  

Os resultados da instrução SELECT mostram que o rowgroup está COMPACTADO, o que significa que os segmentos de coluna do rowgroup agora estão compactados e armazenados no 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.F. Recompilar uma partição de um índice columnstore clusterizado offlineRebuild a partition of a clustered columnstore index offline

Aplica-se a: SQL ServerSQL Server (começando com 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))

Para recompilar uma partição de um índice columnstore clusterizado grande, use ALTER INDEX REBUILD com a opção de partição.To rebuild a partition of a large clustered columnstore index, use ALTER INDEX REBUILD with the partition option. Este exemplo recompila a partição 12.This example rebuilds partition 12. Começando com o SQL Server 2016 (13.x)SQL Server 2016 (13.x), é recomendável substituir a REBUILD por 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.G. Alterar um índice clusterizado columnstore para usar a compactação de arquivamentoChange a clustered columstore index to use archival compression

Não se aplica a: SQL Server 2012 (11.x)SQL Server 2012 (11.x)Does not apply to: SQL Server 2012 (11.x)SQL Server 2012 (11.x)

Você pode optar por reduzir o tamanho de um índice columnstore clusterizado ainda mais usando a opção de compactação de dados COLUMNSTORE_ARCHIVE.You can choose to reduce the size of a clustered columnstore index even further by using the COLUMNSTORE_ARCHIVE data compression option. Isso é prático para dados mais antigos que você deseja manter em um armazenamento mais econômico.This is practical for older data that you want to keep on cheaper storage. É recomendável usar isso apenas em dados que não são acessados com frequência, já que descompactar é mais lento do que a compactação COLUMNSTORE normal.We recommend only using this on data that is not accessed often since decompress is slower than with the normal COLUMNSTORE compression.

O exemplo a seguir recompila um índice columnstore clusterizado para usar a compactação de arquivamento e, em seguida, mostra como remover essa compactação.The following example rebuilds a clustered columnstore index to use archival compression, and then shows how to remove the archival compression. O resultado final usará apenas a compactação 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  

Exemplos: índices RowstoreExamples: Rowstore indexes

A.A. Recriando um índiceRebuilding an index

O exemplo a seguir recompila um único índice na tabela Employee do banco de dados 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.B. Recriando todos os índices de uma tabela e especificando opçõesRebuilding all indexes on a table and specifying options

O exemplo a seguir especifica a palavra-chave ALL.The following example specifies the keyword ALL. Isso recompila todos os índices associados à tabela Production.Product no banco de dados AdventureWorks2012AdventureWorks2012.This rebuilds all indexes associated with the table Production.Product in the AdventureWorks2012AdventureWorks2012 database. Três opções são especificadas.Three options are specified.

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2008SQL Server 2008) e Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Banco de Dados SQLSQL Database.

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

O exemplo a seguir adiciona a opção ONLINE que inclui a opção de bloqueio de baixa prioridade e adiciona a opção de compactação de linha.The following example adds the ONLINE option including the low priority lock option, and adds the row compression option.

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2014 (12.x)SQL Server 2014 (12.x)) e Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2014 (12.x)SQL Server 2014 (12.x)) and Banco de Dados SQLSQL 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.C. Reorganizando um índice com a compactação LOBReorganizing an index with LOB compaction

O exemplo a seguir reorganiza um único índice clusterizado no banco de dados AdventureWorks2012AdventureWorks2012.The following example reorganizes a single clustered index in the AdventureWorks2012AdventureWorks2012 database. Como o índice contém um tipo de dados LOB no nível folha, a instrução também compacta todas as páginas que contêm dados de objeto grande.Because the index contains a LOB data type in the leaf level, the statement also compacts all pages that contain the large object data. Observe que não é necessário especificar a opção WITH (LOB_COMPACTION) porque o valor padrão é ON.Note that specifying the WITH (LOB_COMPACTION) option is not required because the default value is ON.

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

D.D. Definindo opções em um índiceSetting options on an index

O exemplo a seguir define várias opções no índice AK_SalesOrderHeader_SalesOrderNumber no banco de dados AdventureWorks2012AdventureWorks2012.The following example sets several options on the index AK_SalesOrderHeader_SalesOrderNumber in the AdventureWorks2012AdventureWorks2012 database.

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2008SQL Server 2008) e Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Banco de Dados SQLSQL Database.

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

E.E. Desabilitando um índiceDisabling an index

O exemplo a seguir desabilita um índice não clusterizado na tabela Employee do banco de dados 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.F. Desabilitando restriçõesDisabling constraints

O exemplo a seguir desabilita uma restrição PRIMARY KEY desabilitando o índice PRIMARY KEY no banco de dados AdventureWorks2012AdventureWorks2012.The following example disables a PRIMARY KEY constraint by disabling the PRIMARY KEY index in the AdventureWorks2012AdventureWorks2012 database. A restrição FOREIGN KEY na tabela subjacente é automaticamente desabilitada e a mensagem de aviso é exibida.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;  

O conjunto de resultados retorna esta mensagem de aviso.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.G. Habilitando restriçõesEnabling constraints

O exemplo a seguir habilita as restrições PRIMARY KEY e FOREIGN KEY que foram desabilitadas no exemplo F.The following example enables the PRIMARY KEY and FOREIGN KEY constraints that were disabled in Example F.

A restrição PRIMARY KEY é habilitada com a recriação do índice PRIMARY KEY.The PRIMARY KEY constraint is enabled by rebuilding the PRIMARY KEY index.

ALTER INDEX PK_Department_DepartmentID ON HumanResources.Department REBUILD;  

Em seguida, a restrição FOREIGN KEY é habilitada.The FOREIGN KEY constraint is then enabled.

ALTER TABLE HumanResources.EmployeeDepartmentHistory  
CHECK CONSTRAINT FK_EmployeeDepartmentHistory_Department_DepartmentID;  
GO  

H.H. Recriando um índice particionadoRebuilding a partitioned index

O exemplo a seguir recompila uma única partição, número de partição 5, do índice particionado IX_TransactionHistory_TransactionDate do banco de dados AdventureWorks2012AdventureWorks2012.The following example rebuilds a single partition, partition number 5, of the partitioned index IX_TransactionHistory_TransactionDate in the AdventureWorks2012AdventureWorks2012 database. A partição 5 é recriada online e os 10 minutos do tempo de espera para o bloqueio de baixa prioridade se aplica separadamente a cada bloqueio pela operação de recriação de índice.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. Se durante esse tempo o bloqueio não puder ser obtido para recriação de índice completo, a instrução da operação de recriação será anulada.If during this time the lock cannot be obtained to complete index rebuild, the rebuild operation statement is aborted.

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2014 (12.x)SQL Server 2014 (12.x)) e Banco de Dados SQLSQL Database.Applies to: SQL ServerSQL Server (Starting with SQL Server 2014 (12.x)SQL Server 2014 (12.x)) and Banco de Dados SQLSQL 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.I. Alterando a configuração de compactação de um índiceChanging the compression setting of an index

O exemplo a seguir recompila um índice em uma tabela rowstore não particionada.The following example rebuilds an index on a nonpartitioned rowstore table.

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

Para obter exemplos de compactação de dados adicionais, consulte Compactação de dados.For additional data compression examples, see Data Compression.

J.J. Recompilação de índice online retomávelOnline resumable index rebuild

Aplica-se a: SQL ServerSQL Server (começando com SQL Server 2017 (14.x)SQL Server 2017 (14.x)) e Banco de Dados SQLSQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x)) and Banco de Dados SQLSQL Database

Os exemplos a seguir mostram como usar a recompilação de índice online de retomável.The following examples show how to use online resumable index rebuild.

  1. Executar uma recompilação de índice online como uma operação retomável com 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. Executar o mesmo comando novamente (veja acima) após uma operação de índice ter sido colocada em pausa retoma automaticamente a operação de recompilação de índice.Executing the same command again (see above) after an index operation was paused, resumes automatically the index rebuild operation.

  3. Execute uma recompilação de índice online como uma operação retomável com MAX_DURATION definido como 240 minutos.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 uma recompilação de índice online retomável em execução.Pause a running resumable online index rebuild.

    ALTER INDEX test_idx on test_table PAUSE ;
    
  5. Retome uma recompilação de índice online para uma recompilação de índice executada como operação retomável especificando um novo valor de MAXDOP definido como 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. Retome uma operação de recompilação de índice online para uma recompilação de índice online executada como retomável.Resume an online index rebuild operation for an index online rebuild that was executed as resumable. Defina MAXDOP como 2, defina o tempo de execução para o índice que está sendo executando como retomável para 240 minutos e, no caso de um índice que está sendo bloqueado no bloqueio, aguarde 10 minutos e depois encerre todos os bloqueadores.Set MAXDOP to 2, set the execution time for the index being running as resmumable 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. Anule a operação de recompilação de índice retomável que está em execução ou em pausa.Abort resumable index rebuild operation which is running or paused.

    ALTER INDEX test_idx on test_table ABORT ;
    

Consulte TambémSee Also

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)
Desabilitar índices e restrições Disable Indexes and Constraints
Índices XML (SQL Server) XML Indexes (SQL Server)
Executar operações de índice online Perform Index Operations Online
Reorganizar e recompilar índices 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)