Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Sistema de Plataforma de Análise (PDW)
Base de dados SQL no Microsoft Fabric
Modifica uma tabela ou índice de exibição existente (rowstore, columnstore ou XML) desabilitando, reconstruindo ou reorganizando o índice; ou definindo opções no índice.
Transact-SQL convenções de sintaxe
Syntax
Sintaxe para SQL Server, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure.
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_option> [ , ...n ] ) ]
| PAUSE
| ABORT
}
[ ; ]
<object> ::=
{
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }
}
<rebuild_index_option> ::=
{
PAD_INDEX = { ON | OFF }
| FILLFACTOR = fillfactor
| SORT_IN_TEMPDB = { ON | OFF }
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| STATISTICS_INCREMENTAL = { ON | OFF }
| ONLINE = { ON [ ( <low_priority_lock_wait> ) ] | OFF }
| RESUMABLE = { ON | OFF }
| MAX_DURATION = <time> [ MINUTES ]
| ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
| MAXDOP = max_degree_of_parallelism
| DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE }
[ ON PARTITIONS ( { <partition_number> [ TO <partition_number> ] } [ , ...n ] ) ]
| XML_COMPRESSION = { ON | OFF }
[ 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 }
| XML_COMPRESSION = { ON | OFF }
| ONLINE = { ON [ ( <low_priority_lock_wait> ) ] | OFF }
}
<reorganize_option> ::=
{
LOB_COMPACTION = { ON | OFF }
| COMPRESS_ALL_ROW_GROUPS = { ON | OFF }
}
<set_index_option> ::=
{
ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
| OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| COMPRESSION_DELAY = { 0 | delay [ Minutes ] }
}
<resumable_index_option> ::=
{
MAXDOP = max_degree_of_parallelism
| MAX_DURATION = <time> [ MINUTES ]
| <low_priority_lock_wait>
}
<low_priority_lock_wait> ::=
{
WAIT_AT_LOW_PRIORITY ( MAX_DURATION = <time> [ MINUTES ] ,
ABORT_AFTER_WAIT = { NONE | SELF | BLOCKERS } )
}
Sintaxe para o Azure Synapse Analytics and Analytics Platform System (PDW).
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 ] ) ]
| XML_COMPRESSION = { ON | OFF }
[ ON PARTITIONS ( { <partition_number> [ TO <partition_number> ] } [ , ...n ] ) ]
}
<single_partition_rebuild_index_option> ::=
{
DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
| XML_COMPRESSION = { ON | OFF }
}
Arguments
index_name
O nome do índice. Os nomes de índice devem ser exclusivos dentro de uma tabela ou exibição, mas não precisam ser exclusivos dentro de um banco de dados. Os nomes de índice devem seguir as regras de identificadores.
ALL
Especifica todos os índices associados à tabela ou exibição, independentemente do tipo de índice. Especificar ALL faz 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. A tabela a seguir lista as operações de índice e os tipos de índice não permitidos.
Usando a palavra-chave ALL com esta operação |
Falha se a tabela tiver um ou mais |
|---|---|
REBUILD WITH ONLINE = ON |
Índice XML Índice espacial Índice Columnstore no SQL Server 2017 (14.x) e somente versões mais antigas. Versões posteriores suportam a reconstrução on-line de índices columnstore. |
REBUILD PARTITION = <partition_number> |
Índice não particionado, índice XML, índice espacial ou índice desativado |
REORGANIZE |
Índices com ALLOW_PAGE_LOCKS definidos como OFF |
REORGANIZE PARTITION = <partition_number> |
Índice não particionado, índice XML, índice espacial ou índice desativado |
IGNORE_DUP_KEY = ON |
Índice XML Índice espacial Índice Columnstore |
ONLINE = ON |
Índice XML Índice espacial Índice Columnstore |
RESUMABLE = ON |
Índices retomáveis não suportados com a palavra-chave ALL |
Se ALL for especificado com PARTITION = <partition_number>, todos os índices deverão estar alinhados. Isso significa que eles são particionados com base em funções de partição equivalentes. O uso do ALL com PARTITION faz com que todas as partições de índice com o mesmo <partition_number> sejam reconstruídas ou reorganizadas. Para obter mais informações sobre índices particionados, consulte Tabelas e índices particionados.
Para obter mais informações sobre operações de índice online, consulte Diretrizes para operações de índice online.
database_name
O nome do banco de dados.
schema_name
O nome do esquema ao qual a tabela ou exibição pertence.
table_or_view_name
O nome da tabela ou exibição associada ao índice. Para exibir os detalhes do índice de uma tabela ou exibição, use o sys.indexes exibição de catálogo.
O Banco de Dados SQL do Azure dá suporte ao formato de nome de três partes <database_name>.<schema_name>.<object_name> quando <database_name> é o nome do banco de dados atual ou <database_name> é tempdb e <object_name> começa com # ou ##. Se o nome do esquema for dbo, <schema_name> poderá ser omitido.
RECONSTRUIR [ COM ( <rebuild_index_option> [ ,... n ] ) ]
Aplica-se a: SQL Server 2012 (11.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure
Especifica que o índice é reconstruído usando as mesmas colunas, tipo de índice, atributo de exclusividade e ordem de classificação.
REBUILD habilita um índice desabilitado. A reconstrução de um índice clusterizado não recria índices não clusterizados associados, a menos que a palavra-chave ALL seja especificada. Se as opções de índice não forem especificadas, os valores de opção de índice existentes em sys.indexes serão aplicados. Para qualquer opção de índice cujo valor não apareça em sys.indexes, aplica-se o padrão indicado na definição de argumento da opção.
Se ALL for especificado e a tabela subjacente for um heap, a operação de reconstrução não terá efeito sobre o heap. Todos os índices não clusterizados associados à tabela são reconstruídos.
A operação REBUILD pode ser minimamente registrada se o modelo de recuperação de banco de dados for bulk-logged ou simples.
Quando você recria um índice XML primário, a tabela de usuário subjacente não está disponível durante a operação de índice.
Para índices columnstore, a operação de reconstrução:
- Recompacta todos os dados no columnstore. Duas cópias do índice columnstore existem enquanto a operação de reconstrução está em andamento. Quando a reconstrução estiver concluída, o Mecanismo de Banco de Dados excluirá o índice columnstore original.
- Não preserva a ordem de classificação, se houver. Para reconstruir um índice columnstore e preservar ou introduzir uma ordem de classificação, use a instrução
CREATE [CLUSTERED] COLUMNSTORE INDEX ... ORDER (...) ... WITH (DROP_EXISTING = ON).
Para obter mais informações, consulte Otimizar a manutenção do índice para melhorar o desempenho da consulta e reduzir o consumo de recursos.
PARTITION
Especifica que apenas uma partição de um índice é reconstruída ou reorganizada.
PARTITION não pode ser especificado se index_name não for um índice particionado.
PARTITION = ALL reconstrói todas as partições.
Warning
Criar e reconstruir índices não alinhados em uma tabela com mais de 1.000 partições é possível, mas não é suportado. Isso pode causar desempenho degradado ou consumo excessivo de memória durante essas operações. A Microsoft recomenda usar apenas índices alinhados quando o número de partições exceder 1.000.
partition_number
O número de partição de um índice particionado que deve ser reconstruído ou reorganizado. partition_number é uma expressão constante que pode fazer referência a variáveis. Isso inclui variáveis ou funções de tipo definidas pelo usuário e funções definidas pelo usuário, mas não podem fazer referência a uma instrução Transact-SQL. partition_number deve existir ou a instrução falha.
COM ( <single_partition_rebuild_index_option> )
SORT_IN_TEMPDB,MAXDOP,DATA_COMPRESSIONeXML_COMPRESSIONsão as opções que podem ser especificadas quando você reconstrói uma única partição usando a sintaxe(PARTITION = partition_number). Os índices XML não podem ser especificados em uma única operação de reconstrução de partição.
DISABLE
Marca o índice como desabilitado e indisponível para uso pelo Mecanismo de Banco de Dados. Qualquer índice pode ser desativado. A definição de índice de um índice desativado permanece no catálogo do sistema sem dados de índice subjacentes. A desativação de um índice clusterizado impede o acesso do usuário aos dados da tabela subjacente. Para habilitar um índice, use ALTER INDEX REBUILD ou CREATE INDEX WITH DROP_EXISTING. Para obter mais informações, consulte Desabilitar índices e restrições e Habilitar índices e restrições.
REORGANIZAR um índice rowstore
Para índices rowstore, REORGANIZE especifica para reorganizar o nível da folha de índice. A operação REORGANIZE é:
- Sempre realizado online. Isso significa que os bloqueios de tabela de bloqueio de longo prazo não são mantidos e as consultas ou atualizações dos dados na tabela subjacente podem continuar durante a transação
ALTER INDEX REORGANIZE. - Não permitido para um índice desativado.
- Não permitido quando
ALLOW_PAGE_LOCKSestá definido comoOFF. - Não revertida quando executada dentro de uma transação e a transação é revertida.
Note
Quando ALTER INDEX REORGANIZE usa transações explícitas (por exemplo, ALTER INDEX dentro de um BEGIN TRAN ... COMMIT/ROLLBACK) em vez do modo de transação implícita padrão, o comportamento de bloqueio de REORGANIZE se torna mais restritivo, potencialmente causando bloqueio. Para obter mais informações sobre transações implícitas, consulte SET IMPLICIT_TRANSACTIONS.
Para obter mais informações, consulte Otimizar a manutenção do índice para melhorar o desempenho da consulta e reduzir o consumo de recursos.
REORGANIZAR COM ( LOB_COMPACTION = { ON | DESLIGADO } )
Aplica-se a índices de armazenamento de linha.
ON
- Especifica para compactar todas as páginas que contêm dados desses tipos de dados de objeto grande (LOB): imagem, texto, ntext, varchar(max), nvarchar(max), varbinary(max)e xml. A compactação desses dados pode reduzir o tamanho dos dados no disco.
- Para um índice clusterizado, isso compacta todas as colunas LOB contidas na tabela.
- Para um índice não clusterizado, isso compacta todas as colunas LOB que são colunas não-chave (incluídas) no índice.
-
REORGANIZE ALLexecuta a compactação LOB em todos os índices. 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.
OFF
- As páginas que contêm dados de objetos grandes não são compactadas.
- OFF não tem efeito sobre uma pilha.
REORGANIZAR um índice columnstore
Para índices columnstore, REORGANIZE compacta cada grupo de linhas delta fechado no columnstore como um grupo de linhas compactado. A operação REORGANIZE é sempre realizada online. Isso significa que os bloqueios de tabela de bloqueio de longo prazo não são mantidos e as consultas ou atualizações da tabela subjacente podem continuar durante a transação ALTER INDEX REORGANIZE.
Para obter mais informações, consulte Otimizar a manutenção do índice para melhorar o desempenho da consulta e reduzir o consumo de recursos.
-
REORGANIZEnão é necessário para mover os grupos de linhas delta fechados para grupos de linhas compactados. O processo de movimentação de tupla em segundo plano (TM) é ativado periodicamente para comprimir os grupos de linhas delta fechados. Recomendamos o uso deREORGANIZEquando o tuple-mover está ficando para trás.REORGANIZEpode comprimir grupos de linhas de forma mais agressiva. - Para compactar todos os grupos de linhas abertos e fechados, consulte o REORGANIZAR COM (COMPRESS_ALL_ROW_GROUPS).
Para índices columnstore no SQL Server 2016 (13.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure, REORGANIZE executa as seguintes otimizações de desfragmentação extra online:
Remove fisicamente linhas excluídas de um grupo de linhas quando 10% ou mais das linhas foram excluídas logicamente. Os bytes excluídos são recuperados na mídia física. Por exemplo, se um grupo de linhas compactadas de 1 milhão de linhas tiver 100.000 linhas excluídas, o Mecanismo de Banco de Dados removerá as linhas excluídas e recompactará o grupo de linhas com 900.000 linhas.
Combina um ou mais grupos de linhas compactados para aumentar as linhas por grupo de linhas até o máximo de 1.048.576 linhas. Por exemplo, se você importar em massa 5 lotes de 102.400 linhas, obterá 5 grupos de linhas compactados. Se você executar
REORGANIZE, esses grupos de linhas serão mesclados em 1 grupo de linhas compactado com 512.000 linhas. Isso pressupõe que não há limitações de tamanho de dicionário ou memória.Para grupos de linhas nos quais 10% ou mais das linhas foram excluídas logicamente, o Mecanismo de Banco de Dados tenta combinar esse grupo de linhas com um ou mais grupos de linhas. Por exemplo, o grupo de linhas 1 é compactado com 500.000 linhas e o grupo de linhas 21 é compactado com o máximo de 1.048.576 linhas. O grupo de linhas 21 tem 60% das linhas excluídas, o que deixa 409.830 linhas. O Mecanismo de Banco de Dados favorece a combinação desses dois grupos de linhas para compactar um novo grupo de linhas que tenha 909.830 linhas.
REORGANIZAR COM ( COMPRESS_ALL_ROW_GROUPS = { ON | DESLIGADO } )
Aplica-se a índices columnstore.
Aplica-se a: SQL Server 2016 (13.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure
COMPRESS_ALL_ROW_GROUPS fornece uma maneira de forçar grupos de linhas delta abertos ou fechados no columnstore. Com essa opção, não é necessário reconstruir o índice columnstore para esvaziar os grupos de linhas delta. Combinado com os outros recursos de desfragmentação de remoção e mesclagem, isso faz com que não seja mais necessário reconstruir um índice columnstore na maioria das situações.
ON
Força todos os grupos de linhas para o columnstore, independentemente do tamanho e do estado (fechado ou aberto).
OFF
Força todos os grupos de linhas fechados para o columnstore.
Para obter mais informações, consulte Otimizar a manutenção do índice para melhorar o desempenho da consulta e reduzir o consumo de recursos.
SET ( <set_index opção> [ ,... n ] )
Modifica as opções de índice sem reconstruir ou reorganizar o índice.
SET não pode ser especificado para um índice desativado.
PAD_INDEX = { EM | DESLIGADO }
Especifica o preenchimento do índice. O padrão é OFF.
ON
A porcentagem de espaço livre especificada pelo fator de preenchimento é aplicada às páginas de nível intermediário do índice. Se
FILLFACTORnão for especificado ao mesmo tempoPAD_INDEXestiver definido comoON, o valor do fator de preenchimento em sys.indexes será usado.OFF
As páginas de nível intermediário são preenchidas até perto da capacidade, deixando espaço suficiente para pelo menos uma linha do tamanho máximo que o índice pode ter, considerando o conjunto de teclas nas páginas intermediárias. Isso também ocorre se
PAD_INDEXestiver definido comoONmas o fator de preenchimento não for especificado.
Para obter mais informações, consulte CREATE INDEX.
FILLFACTOR = fator de enchimento
Especifica uma porcentagem que indica o quão cheio o Mecanismo de Banco de Dados deve tornar o nível de folha de cada página de índice durante a criação ou alteração do índice. O valor para de fator de preenchimento deve ser um valor inteiro de 1 a 100. O padrão é 0. Os valores de fator de preenchimento 0 e 100 são os mesmos em todos os aspetos.
Uma configuração de FILLFACTOR explícita se aplica somente quando o índice é criado ou reconstruído pela primeira vez. O Mecanismo de Banco de Dados não mantém dinamicamente a porcentagem especificada de espaço vazio nas páginas. Para obter mais informações, consulte CREATE INDEX.
Para exibir a configuração do fator de preenchimento, use fill_factor em sys.indexes.
Important
Criar um índice com um FILLFACTOR inferior a 100 aumenta a quantidade de espaço de armazenamento que os dados ocupam porque o Mecanismo de Banco de Dados redistribui os dados de acordo com o fator de preenchimento quando cria ou reconstrói um índice.
SORT_IN_TEMPDB = { EM | DESLIGADO }
Especifica se os resultados de classificação temporários devem ser armazenados em tempdb. O padrão é OFF exceto para o Azure SQL Database Hyperscale. Para todas as operações de compilação de índice no Hyperscale, SORT_IN_TEMPDB é sempre ON a menos que uma compilação de índice retomável seja usada. Para compilações de índice retomáveis, SORT_IN_TEMPDB é sempre OFF.
ON
Os resultados de classificação intermediária usados para criar o índice são armazenados em
tempdb. Isso pode reduzir o tempo necessário para criar um índice. No entanto, isso aumenta a quantidade de espaço em disco que é usado durante a compilação do índice.OFF
Os resultados da classificação intermediária são armazenados no mesmo banco de dados que o índice.
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.
Para obter mais informações, consulte SORT_IN_TEMPDB opção para índices.
IGNORE_DUP_KEY = { EM | DESLIGADO }
Especifica a resposta de erro quando uma operação de inserção tenta inserir valores de chave duplicados em um índice exclusivo. A opção IGNORE_DUP_KEY aplica-se apenas a operações de inserção depois que o índice é criado ou reconstruído. O padrão é OFF.
ON
Uma mensagem de aviso ocorre quando valores de chave duplicados são inseridos em um índice exclusivo. Apenas as linhas que violam a restrição de exclusividade não são inseridas.
OFF
Uma mensagem de erro ocorre quando valores de chave duplicados são inseridos em um índice exclusivo. Toda a operação
INSERTé revertida.
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.
Para exibir a configuração de IGNORE_DUP_KEY de um índice, use a coluna ignore_dup_key no sys.indexes exibição de catálogo.
Na sintaxe compatível com versões anteriores, WITH IGNORE_DUP_KEY é equivalente a WITH IGNORE_DUP_KEY = ON.
STATISTICS_NORECOMPUTE = { LIGADO | DESLIGADO }
Desative ou habilite a opção de atualização automática de estatísticas, AUTO_STATISTICS_UPDATE, para as estatísticas no índice. O padrão é OFF.
ON
As atualizações automáticas de estatísticas são desativadas depois que o índice é reconstruído.
OFF
As atualizações automáticas de estatísticas são ativadas depois que o índice é reconstruído.
Para restaurar a atualização automática de estatísticas, defina o STATISTICS_NORECOMPUTE como OFFou execute-UPDATE STATISTICS sem a cláusula NORECOMPUTE.
Warning
Se você desabilitar a recomputação automática de estatísticas definindo STATISTICS_NORECOMPUTE = ON, poderá impedir que o otimizador de consultas escolha planos de execução ideais para consultas que envolvam a tabela.
Definir STATISTICS_NORECOMPUTE como ON não impede a atualização das estatísticas de índice que ocorre durante a operação de reconstrução do índice.
STATISTICS_INCREMENTAL = { LIGADO | DESLIGADO }
Aplica-se a: SQL Server 2014 (12.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure
Quando ON, as estatísticas criadas no índice são estatísticas por partição. Quando OFF, as estatísticas existentes são descartadas e o Mecanismo de Banco de Dados recalcula as estatísticas. O padrão é OFF.
Se as estatísticas por partição não forem suportadas, a opção será ignorada e um aviso será gerado. As estatísticas incrementais não são suportadas nos seguintes casos:
- Estatísticas criadas com índices que não estão alinhados com a tabela base
- Estatísticas criadas em bases de dados secundárias legíveis do grupo de disponibilidade
- Estatísticas criadas em bases de dados só de leitura
- Estatísticas criadas em índices filtrados
- Estatísticas criadas em visualizações
- Estatísticas criadas em quadros internos
- Estatísticas criadas com índices espaciais ou índices XML
ONLINE = { LIGADO | DESLIGADO }
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. O padrão é OFF.
Para um índice XML ou índice espacial, apenas ONLINE = OFF é suportado e, se ONLINE estiver definido como ON um erro é gerado.
Important
As operações de índice online não estão disponíveis em todas as edições do Microsoft SQL Server. Para obter uma lista de recursos suportados pelas edições do SQL Server, consulte edições e recursos com suporte do SQL Server 2022.
ON
Os bloqueios de tabela de longo prazo não são mantidos durante a operação de índice. Durante a fase principal da operação de índice, apenas um bloqueio de intenção compartilhada (
IS) é mantido na tabela de origem. Isso permite que as consultas ou atualizações da tabela e dos índices subjacentes prossigam. No início da operação, um bloqueio compartilhado (S) é mantido no objeto de origem por um curto período de tempo. No final da operação, por um curto período de tempo, um bloqueio compartilhado (S) é adquirido no objeto se um índice não clusterizado estiver sendo criado. Um bloqueio de modificação de esquema (Sch-M) é adquirido quando um índice clusterizado é criado ou descartado online e quando um índice clusterizado ou não clusterizado está sendo reconstruído.ONLINEnão pode ser definido comoONquando um índice está sendo criado em uma tabela temporária local.Note
Você pode usar a opção
WAIT_AT_LOW_PRIORITYpara reduzir ou evitar o bloqueio durante as operações de índice online. Para obter mais informações, consulte WAIT_AT_LOW_PRIORITY com operações de índice online.OFF
Os bloqueios de tabela são aplicados durante a operação de índice. Uma operação de índice offline que cria, reconstrói ou descarta um índice clusterizado, espacial ou XML, ou reconstrói ou descarta um índice não clusterizado, adquire um bloqueio de modificação de esquema (
Sch-M) na tabela. Isso impede que todo o usuário acesse a tabela subjacente durante a operação. Uma operação de índice offline que cria um índice não clusterizado inicialmente adquire um bloqueio compartilhado (S) na tabela. Isso impede modificações da definição de tabela subjacente, mas permite ler e modificar os dados na tabela enquanto a compilação do índice está em andamento.
Para obter mais informações, consulte Executar operações de índice online e Diretrizes para operações de índice online.
Os índices, incluindo índices em tabelas temporárias globais, podem ser reconstruídos online, exceto nos seguintes casos:
- Índice XML
- Índice em uma tabela temporária local
- Índice clusterizado exclusivo inicial em um modo de exibição
- Índices clusterizados desativados
- Índices columnstore clusterizados no SQL Server 2017 (14.x)) e versões anteriores
- Índices columnstore não clusterizados no SQL Server 2016 (13.x)) e versões anteriores
- Índice agrupado, se a tabela subjacente contiver tipos de dados LOB (imagem, ntext, texto) e tipos de dados espaciais
-
colunas varchar(max) e varbinary(max) não podem fazer parte de uma chave de índice. No SQL Server (começando com o SQL Server 2012 (11.x)), no Banco de Dados SQL do Azure e na Instância Gerenciada do SQL do Azure, quando uma tabela contém varchar(max) ou colunas de varbinary(max), um índice clusterizado contendo outras colunas pode ser criado ou reconstruído usando a opção
ONLINE.
Para obter mais informações, consulte Como funcionam as operações de índice online.
RESUMÍVEL = { EM | DESLIGADO}
Aplica-se a: SQL Server 2017 (14.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure
Especifica se uma operação de índice online é retomável.
ON
A operação de índice é retomável.
OFF
A operação de índice não é retomável.
MAX_DURATION = tempo [ MINUTOS ] usado com RESUMABLE = ON (requer ONLINE = ON)
Aplica-se a: SQL Server 2017 (14.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure
Especifica por quanto tempo, em minutos inteiros, uma operação de índice retomável é executada antes de ser pausada.
ALLOW_ROW_LOCKS = { EM | DESLIGADO }
Especifica se os bloqueios de linha são permitidos. O padrão é ON.
ON
Bloqueios de linha são permitidos ao acessar o índice. O Mecanismo de Banco de Dados determina quando os bloqueios de linha são usados.
OFF
Os bloqueios de linha não são usados.
ALLOW_PAGE_LOCKS = { EM | DESLIGADO }
Especifica se os bloqueios de página são permitidos. O padrão é ON.
ON
Os bloqueios de página são permitidos quando você acessa o índice. O Mecanismo de Banco de Dados determina quando os bloqueios de página são usados.
OFF
Os bloqueios de página não são usados.
OTIMIZE_FOR_SEQUENTIAL_KEY = { EM | DESLIGADO }
Aplica-se a: SQL Server 2019 (15.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure
Especifica se a otimização deve ou não ser otimizada para evitar a contenção de inserção na última página. O padrão é OFF. Para obter mais informações, consulte Chaves sequenciais.
MAXDOP = max_degree_of_parallelism
Substitui o grau máximo de paralelismo opção de configuração para a operação de índice. Para obter mais informações, consulte Configurar o grau máximo de paralelismo Opção de configuração do servidor. Use MAXDOP para limitar o grau de paralelismo e o consumo de recursos resultante para uma operação de compilação de índice.
Embora a opção MAXDOP seja sintaticamente suportada para todos os índices XML e índices espaciais, ALTER INDEX atualmente usa apenas um único processador.
max_degree_of_parallelism pode ser:
1
Suprime a geração de planos paralelos.
>1
Restringe o grau máximo de paralelismo usado em uma operação de índice paralelo ao número especificado ou menos com base na carga de trabalho atual do sistema.
0 (padrão)
Usa o grau de paralelismo especificado no nível do servidor, banco de dados ou grupo de carga de trabalho, a menos que seja reduzido com base na carga de trabalho atual do sistema.
Para obter mais informações, consulte Configurar operações de índice paralelo.
Note
As operações de índice paralelo não estão disponíveis em todas as edições do SQL Server. Para obter uma lista de recursos suportados pelas edições do SQL Server, consulte edições e recursos com suporte do SQL Server 2022.
COMPRESSION_DELAY = { 0 | duração [ minutos ] }
Aplica-se a: SQL Server (a partir do SQL Server 2016 (13.x)), Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure
Para uma tabela baseada em disco com um índice columnstore, especifica o número mínimo de minutos que um grupo de linhas delta no estado fechado deve permanecer no repositório delta antes que o Mecanismo de Banco de Dados possa compactá-lo em um grupo de linhas compactado. Como as tabelas baseadas em disco não controlam os tempos de inserção e atualização em linhas individuais, o Mecanismo de Banco de Dados aplica esse atraso apenas aos grupos de linhas de armazenamento delta no estado fechado.
O padrão é 0 minutos.
Para obter recomendações sobre quando usar COMPRESSION_DELAY, consulte Introdução ao columnstore para análises operacionais em tempo real.
DATA_COMPRESSION
Especifica a opção de compactação de dados para o índice, número de partição ou intervalo de partições especificado. As opções são as seguintes:
NONE
As partições de índice ou especificadas não são compactadas. Isso não se aplica aos índices columnstore.
ROW
As partições de índice ou especificadas são compactadas usando a compactação de linha. Isso não se aplica aos índices columnstore.
PAGE
As partições de índice ou especificadas são compactadas usando a compactação de página. Isso não se aplica aos índices columnstore.
COLUMNSTORE
Aplica-se a: SQL Server 2014 (12.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure
Aplica-se somente a índices columnstore, incluindo índices columnstore não clusterizados e columnstore clusterizados. Especificar
COLUMNSTOREremove todas as outras compactações de dados, incluindoCOLUMNSTORE_ARCHIVE.COLUMNSTORE_ARCHIVE
Aplica-se a: SQL Server 2014 (12.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure
Aplica-se somente a índices columnstore, incluindo índices columnstore não clusterizados e columnstore clusterizados.
COLUMNSTORE_ARCHIVEcompacta ainda mais a partição especificada para um tamanho menor. Isso pode ser usado para arquivamento ou para outras situações que exigem um tamanho de armazenamento menor e podem dar mais tempo para armazenamento e recuperação.
Para obter mais informações sobre compactação, consulte Compactação de dados.
XML_COMPRESSION
Aplica-se a: SQL Server 2022 (16.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure
Especifica a opção de compactação XML para o índice especificado que contém uma ou mais colunas xml tipo de dados. As opções são as seguintes:
ON
As partições de índice ou especificadas são compactadas usando a compactação XML.
OFF
As partições de índice ou especificadas não são compactadas.
EM PARTIÇÕES ( { <partition_number_expression> | <intervalo> } [ ,... n ] )
Especifica as partições às quais as configurações de DATA_COMPRESSION ou XML_COMPRESSION se aplicam. Se o índice não estiver particionado, o argumento ON PARTITIONS gerará um erro. Se a cláusula ON PARTITIONS não for fornecida, a opção DATA_COMPRESSION ou XML_COMPRESSION se aplicará a todas as partições de um índice particionado.
<partition_number_expression> podem ser especificados das seguintes formas:
- Forneça o número de uma partição, por exemplo:
ON PARTITIONS (2). - Forneça os números de partição para várias partições individuais separadas por vírgulas, por exemplo:
ON PARTITIONS (1, 5). - Forneça intervalos e partições individuais:
ON PARTITIONS (2, 4, 6 TO 8).
<range> podem ser especificados como números de partição separados pela palavra TO, por exemplo: ON PARTITIONS (6 TO 8).
Para definir diferentes tipos de compactação de dados para partições diferentes, especifique a opção DATA_COMPRESSION mais de uma vez, por exemplo:
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)
);
Você também pode especificar a opção XML_COMPRESSION mais de uma vez, por exemplo:
REBUILD WITH
(
XML_COMPRESSION = OFF ON PARTITIONS (1),
XML_COMPRESSION = ON ON PARTITIONS (2, 4, 6 TO 8),
XML_COMPRESSION = OFF ON PARTITIONS (3, 5)
);
RESUME
Aplica-se a: SQL Server 2017 (14.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure
Retoma uma operação de índice que é pausada manualmente, porque a duração máxima é atingida ou devido a uma falha.
MAX_DURATION
Especifica por quanto tempo, em minutos inteiros, uma operação de índice retomável é executada depois de ser retomada antes de ser pausada novamente.
WAIT_AT_LOW_PRIORITY
Retomar uma operação de compilação de índice após uma pausa precisa adquirir os bloqueios necessários.
WAIT_AT_LOW_PRIORITYindica que a operação de compilação de índice adquire bloqueios de baixa prioridade, que permitem que outras operações prossigam enquanto a operação de compilação de índice está aguardando. Omitir a opçãoWAIT_AT_LOW_PRIORITYé equivalente aWAIT_AT_LOW_PRIORITY (MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE). Para obter mais informações, consulte WAIT_AT_LOW_PRIORITY.
PAUSE
Aplica-se a: SQL Server 2017 (14.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure
Pausa uma operação de compilação de índice retomável.
ABORT
Aplica-se a: SQL Server 2017 (14.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure
Anula uma operação de compilação de índice em execução ou pausada que foi iniciada como retomável. Você deve executar explicitamente um comando ABORT para encerrar uma operação de compilação de índice retomável. Uma falha ou uma pausa em uma operação de índice retomável não encerra sua execução; em vez disso, deixa a operação em um estado de pausa indefinido.
Remarks
ALTER INDEX não pode ser usado para reparticionar um índice ou movê-lo para um grupo de arquivos diferente. 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. Use CREATE INDEX com a cláusula DROP_EXISTING para executar essas operações.
Quando uma opção não é especificada explicitamente, a configuração atual é aplicada. Por exemplo, se uma configuração de 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 reconstrução. Para exibir as configurações atuais da opção de índice, use sys.indexes.
Os valores de ONLINE, MAXDOPe SORT_IN_TEMPDB não são armazenados no catálogo do sistema. A menos que especificado na instrução index, o valor padrão para a opção é usado.
Em computadores com vários processadores, assim como outras consultas, o ALTER INDEX REBUILD usa automaticamente mais processadores para executar as operações de verificação e classificação associadas à modificação do índice. Por outro lado, ALTER INDEX REORGANIZE é uma operação de thread único. Para obter mais informações, consulte Configurar operações de índice paralelo.
Na base de dados SQL no Microsoft Fabric, ALTER INDEX ALL não é suportado, mas ALTER INDEX <index name> é.
Reconstruir índices
A reconstrução de um índice cai e recria o índice. Isso remove a fragmentação, recupera espaço em disco compactando as páginas com base na configuração de fator de preenchimento especificada ou existente e reordena as linhas de índice em páginas contíguas. Quando ALL é especificado, todos os índices na tabela são descartados e reconstruídos em uma única transação. As restrições de chave estrangeira não precisam ser eliminadas antecipadamente. Quando índices com 128 extensões ou mais são reconstruídos, o Mecanismo de Banco de Dados adia os deallocations de página reais e seus bloqueios associados até que a transação seja confirmada. Para obter mais informações, consulte Desalocação adiada.
Para obter mais informações, consulte Otimizar a manutenção do índice para melhorar o desempenho da consulta e reduzir o consumo de recursos.
Reorganizar índices
A reorganização de um índice usa recursos mínimos do sistema. Ele desfragmenta o nível de folha de índices agrupados e não agrupados em tabelas e visualizações reordenando fisicamente as páginas de nível de folha para corresponder à ordem lógica, da esquerda para a direita, dos nós de folha. A reorganização também compacta as páginas de índice. A compactação é baseada no valor do fator de preenchimento existente.
Quando ALL é especificado, os índices relacionais, agrupados e não agrupados, e os índices XML na tabela são reorganizados. Algumas restrições se aplicam ao especificar ALL.
Para obter mais informações, consulte Otimizar a manutenção do índice para melhorar o desempenho da consulta e reduzir o consumo de recursos.
Note
Para uma tabela com um índice columnstore ordenado, ALTER INDEX REORGANIZE não reclassifica os dados. Para recorrer aos dados use CREATE [CLUSTERED] COLUMNSTORE INDEX ... ORDER (...) ... WITH (DROP_EXISTING = ON).
Desativar índices
A desativação de um índice impede o acesso do usuário ao índice e, para índices clusterizados, aos dados da tabela subjacente. A definição do índice permanece no catálogo do sistema. A desativação de um índice não clusterizado ou de um índice clusterizado em um modo de exibição exclui fisicamente os dados do índice. A desativação de um índice clusterizado impede o acesso aos dados, mas os dados permanecem sem manutenção na árvore B até que o índice seja descartado ou reconstruído. Para ver se um índice está desativado, use a coluna is_disabled no sys.indexes exibição de catálogo.
Note
A documentação usa o termo árvore B geralmente em referência a índices. Em índices de armazenamento de linha, o Mecanismo de Banco de Dados implementa uma árvore B+. Isso não se aplica a índices columnstore ou índices em tabelas com otimização de memória. Para obter mais informações, consulte o SQL Server e o guia de design de arquitetura e design de índice SQL do Azure.
Se uma tabela estiver em uma publicação de replicação transacional, não será possível desabilitar um índice associado a uma restrição de chave primária. Esses índices são exigidos pela replicação. Para desativar esse índice, você deve primeiro soltar a tabela da publicação. Para obter mais informações, consulte Publicar dados e objetos de banco de dados.
Use a instrução ALTER INDEX REBUILD ou a instrução CREATE INDEX WITH DROP_EXISTING para habilitar o índice. A reconstrução de um índice clusterizado desativado não pode ser executada com a opção ONLINE definida como ON. Para obter mais informações, consulte Desabilitar índices e restrições.
Definir opções
Você pode definir as opções ALLOW_ROW_LOCKS, ALLOW_PAGE_LOCKS, OPTIMIZE_FOR_SEQUENTIAL_KEY, IGNORE_DUP_KEYe STATISTICS_NORECOMPUTE para um índice especificado sem reconstruir ou reorganizar esse índice. Os valores modificados são imediatamente aplicados ao índice. Para exibir essas configurações, use sys.indexes. Para obter mais informações, consulte Definir opções de índice.
Opções de bloqueios de linha e página
Quando ALLOW_ROW_LOCKS = ON e ALLOW_PAGE_LOCK = ON, bloqueios de nível de linha, nível de página e nível de tabela são permitidos quando você acessa o índice. O Mecanismo de Banco de Dados escolhe o bloqueio apropriado e pode escalá-lo de um bloqueio de linha ou página para um bloqueio de tabela.
Quando ALLOW_ROW_LOCKS = OFF e ALLOW_PAGE_LOCK = OFF, apenas um bloqueio no nível da tabela é permitido quando você acessa o índice.
Se ALL for especificado quando as opções de bloqueio de linha ou página forem definidas, as configurações serão aplicadas a todos os índices. Quando a tabela subjacente é um heap, as configurações são aplicadas das seguintes maneiras:
| Option | Aplica-se a |
|---|---|
ALLOW_ROW_LOCKS = ON ou OFF |
A pilha e todos os índices não agrupados associados. |
ALLOW_PAGE_LOCKS = ON |
A pilha e todos os índices não agrupados associados. |
ALLOW_PAGE_LOCKS = OFF |
Os índices não clusterizados, onde todos os bloqueios de página não são permitidos. Para a pilha, apenas os bloqueios de página compartilhados (S), atualização (U) e exclusivos (X) não são permitidos. O Mecanismo de Banco de Dados ainda pode adquirir bloqueios de página de intenção (IS, IUou IX) para fins internos. |
Warning
Não é recomendável desativar bloqueios de linha ou página em um índice. Problemas relacionados à simultaneidade podem ocorrer e certas funcionalidades podem não estar disponíveis. Por exemplo, um índice não pode ser reorganizado quando ALLOW_PAGE_LOCKS está definido como OFF.
Operações de índice online
Ao reconstruir um índice e a opção ONLINE é definida como ON, os dados no índice, sua tabela associada e outros índices na mesma tabela estão disponíveis para consultas e modificação. Você também pode reconstruir online uma parte de um índice residente em uma única partição. Os bloqueios de tabela exclusivos são mantidos apenas por um curto período de tempo no final da reconstrução do índice.
A reorganização de um índice é sempre realizada online. O processo mantém bloqueios apenas por curtos períodos de tempo e é improvável que bloqueie consultas ou atualizações.
Você pode executar operações simultâneas de índice online na mesma tabela ou partição de tabela somente ao executar as seguintes operações:
- Criação de vários índices não clusterizados.
- Reorganizar diferentes índices na mesma tabela.
- Reorganizar diferentes índices enquanto reconstrói índices não sobrepostos na mesma tabela.
Todas as outras operações de índice online executadas ao mesmo tempo falham. Por exemplo, não é possível reconstruir dois ou mais índices na mesma tabela simultaneamente ou criar um novo índice enquanto reconstrói um índice existente na mesma tabela.
Para obter mais informações, consulte Executar operações de índice online.
Operações de índice retomáveis
Aplica-se a: SQL Server 2017 (14.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure
Você pode fazer uma reconstrução de índice on-line retomável. Isso significa que a reconstrução do índice pode ser interrompida e, posteriormente, reiniciada a partir do ponto em que parou. Para executar uma reconstrução de índice como retomável, especifique a opção RESUMABLE = ON.
As seguintes diretrizes se aplicam a operações de índice retomáveis:
- Para usar a opção
RESUMABLEvocê também deve usar a opçãoONLINE. - A opção
RESUMABLEnão persiste nos metadados de um determinado índice e aplica-se apenas à duração da instrução DDL atual. Portanto, a cláusulaRESUMABLE = ONdeve ser especificada explicitamente para permitir a retomabilidade. - A opção
MAX_DURATIONpode ser especificada em dois contextos:-
MAX_DURATIONpara a opçãoRESUMABLEespecifica o intervalo de tempo para um índice que está sendo criado. Após esse tempo, e se a compilação de índice ainda estiver em execução, ela será pausada. Você decide quando a compilação para um índice pausado pode ser retomada. O tempo em minutos paraMAX_DURATIONdeve ser superior a 0 minutos e inferior ou igual a uma semana (7 * 24 * 60 = 10080 minutos). Uma longa pausa em uma operação de índice pode afetar visivelmente o desempenho do DML em uma tabela específica, bem como a capacidade do disco do banco de dados, uma vez que tanto o índice original quanto o índice recém-criado exigem espaço em disco e precisam ser atualizados pelas operações DML. SeMAX_DURATIONopção for omitida, a operação de índice continuará até a conclusão ou até que ocorra uma falha. -
MAX_DURATIONpara a opçãoWAIT_AT_LOW_PRIORITYespecifica o tempo de espera usando bloqueios de baixa prioridade se a operação de índice estiver bloqueada, antes de tomar medidas. Para obter mais informações, consulte WAIT_AT_LOW_PRIORITY com operações de índice online.
-
- Para pausar a operação de índice imediatamente, você pode executar o comando
ALTER INDEX PAUSEou executar o comandoKILL <session_id>. - A nova execução da instrução
ALTER INDEX REBUILDoriginal com os mesmos parâmetros retoma uma operação de reconstrução de índice pausada. Você também pode retomar uma operação de reconstrução de índice pausada executando a instruçãoALTER INDEX RESUME. - O comando
ABORTmata a sessão que está executando uma compilação de índice e cancela a operação de índice. Não é possível retomar uma operação de índice que foi anulada. - Ao retomar uma operação de reconstrução de índice pausada, você pode alterar o valor
MAXDOPpara um novo valor. SeMAXDOPnão for especificado ao retomar uma operação de índice pausada, o valor deMAXDOPusado para a última retomada será usado. Se a opçãoMAXDOPnão for especificada para uma operação de reconstrução de índice, o valor padrão será usado.
Uma operação de índice retomável é executada até ser concluída, pausada ou falhar. Caso a operação seja pausada, um erro é emitido indicando que a operação foi pausada e que a reconstrução do índice não foi concluída. Caso a operação falhe, um erro também é emitido.
Para ver se uma operação de índice é executada como uma operação retomável e para verificar seu estado de execução atual, use o sys.index_resumable_operations exibição de catálogo.
Resources
Os seguintes recursos são necessários para operações de índice retomáveis:
- Espaço adicional necessário para manter o índice sendo construído, incluindo o tempo em que a compilação é pausada.
- Taxa de transferência de log adicional durante a fase de classificação. O uso geral do espaço de log para índice retomável é menor em comparação com a reconstrução regular do índice on-line e permite o truncamento de log durante essa operação.
- Não são permitidas instruções DDL que tentem modificar um índice que está sendo reconstruído ou sua tabela associada enquanto a operação de índice está pausada.
- A limpeza fantasma é bloqueada no índice de compilação durante a operação durante a pausa e enquanto a operação está em execução.
- Se a tabela contiver colunas LOB, uma compilação de índice clusterizado retomável exigirá um bloqueio de modificação de esquema (
Sch-M) no início da operação.
Limitações funcionais atuais
As operações de reconstrução de índice retomável têm as seguintes limitações:
- A opção
SORT_IN_TEMPDB = ONnão é suportada para operações de índice retomáveis. - O comando DDL com
RESUMABLE = ONnão pode ser executado dentro de uma transação explícita. - Não é possível criar um índice retomável que contenha:
- Carimbo de data/hora computado ou /linhaversão colunas como colunas chave.
- Coluna LOB como uma coluna incluída.
- Não há suporte para operações de índice retomáveis para:
- O comando
ALTER INDEX REBUILD ALL - O comando
ALTER TABLE REBUILD - Índices de Columnstore
- Índices filtrados
- Índices desativados
- O comando
WAIT_AT_LOW_PRIORITY com operações de índice on-line
Aplica-se a: SQL Server 2014 (12.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure
Quando você não usa a opção WAIT_AT_LOW_PRIORITY, todas as transações de bloqueio ativas que mantêm bloqueios na tabela ou no índice devem ser concluídas para que a operação de reconstrução do índice seja iniciada e concluída. Quando a operação de índice online é iniciada e antes de ser concluída, ela precisa adquirir um bloqueio compartilhado (S) ou uma modificação de esquema (Sch-M) na tabela e mantê-lo por um curto período de tempo. Embora o bloqueio seja mantido apenas por um curto período de tempo, ele pode afetar significativamente a taxa de transferência da carga de trabalho, aumentar a latência da consulta ou causar tempos limite de execução.
Para evitar esses problemas, a opção WAIT_AT_LOW_PRIORITY permite gerenciar o comportamento de S ou Sch-M bloqueios necessários para iniciar e concluir uma operação de índice online, selecionando entre três opções. Em todos os casos, se durante o tempo de espera especificado por MAX_DURATION = n [minutes] não houver nenhum bloqueio que envolva a operação de índice, a operação de índice prossegue imediatamente.
WAIT_AT_LOW_PRIORITY faz com que a operação de índice on-line aguarde usando bloqueios de baixa prioridade, permitindo que outras operações usando bloqueios de prioridade normal prossigam enquanto isso. Omitir a opção WAIT_AT_LOW_PRIORITY é equivalente a WAIT_AT_LOW_PRIORITY (MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).
MAX_DURATION
=
tempo [MINUTES]
O tempo de espera (um valor inteiro especificado em minutos) que a operação de índice online aguarda usando bloqueios de baixa prioridade. Se a operação for bloqueada pelo MAX_DURATION tempo, a ação ABORT_AFTER_WAIT especificada será executada.
MAX_DURATION tempo é sempre em minutos, e a palavra MINUTES pode ser omitida.
ABORT_AFTER_WAIT= [NONE | SELF | BLOCKERS ]
-
NONE: Continue aguardando o cadeado com prioridade normal. -
SELF: Saia da operação de índice online que está sendo executada, sem tomar nenhuma ação. A opçãoSELFnão pode ser usada quandoMAX_DURATIONé 0. -
BLOCKERS: Mate todas as transações do usuário que bloqueiam a operação de índice on-line para que a operação possa continuar. A opçãoBLOCKERSrequer que a entidade que executa a instruçãoCREATE INDEXouALTER INDEXtenha a permissãoALTER ANY CONNECTION.
Você pode usar os seguintes eventos estendidos para monitorar operações de índice que aguardam bloqueios com baixa prioridade:
lock_request_priority_stateprocess_killed_by_abort_blockersddl_with_wait_at_low_priority
Restrições do índice espacial
Quando você reconstrói um índice espacial, a tabela de usuário subjacente não está disponível durante a operação de índice.
A restrição de PRIMARY KEY na tabela do usuário não pode ser modificada enquanto um índice espacial é definido em uma coluna dessa tabela. Para alterar a restrição de PRIMARY KEY, primeiro solte todos os índices espaciais da tabela. Depois de modificar a restrição PRIMARY KEY, você pode recriar cada um dos índices espaciais.
Em uma única operação de reconstrução de partição, não é possível especificar nenhum índice espacial. No entanto, você pode especificar índices espaciais em uma reconstrução de tabela.
Para alterar opções específicas de um índice espacial, como BOUNDING_BOX ou GRID, você pode usar uma instrução CREATE SPATIAL INDEX que especifique DROP_EXISTING = ONou descartar o índice espacial e criar um novo. Para obter um exemplo, consulte CREATE SPATIAL INDEX.
Compressão de dados
Para obter mais informações sobre compactação de dados, consulte Compactação de dados.
A seguir estão os pontos-chave a serem considerados no contexto de operações de compilação de índice quando a compactação de dados é usada:
- A compactação pode permitir que mais linhas sejam armazenadas em uma página, mas não altera o tamanho máximo da linha.
- As páginas que não são folhas de um índice não são comprimidas por página, mas podem ser comprimidas por linha.
- Cada índice não clusterizado tem uma configuração de compactação individual e não herda a configuração de compactação da tabela subjacente.
- Quando um índice clusterizado é criado em um heap, o índice clusterizado herda o estado de compactação do heap, a menos que um estado de compactação alternativo seja especificado.
As seguintes considerações se aplicam à reconstrução de índices particionados:
- Não é possível alterar a configuração de compactação de uma única partição se a tabela tiver índices não alinhados.
- A sintaxe
ALTER INDEX <index> ... REBUILD PARTITION ... WITH DATA_COMPRESSION = ...reconstrói a partição especificada do índice com a opção de compactação especificada. Se a cláusulaWITH DATA_COMPRESSIONfor omitida, a opção de compressão existente será usada. - A sintaxe
ALTER INDEX <index> ... REBUILD PARTITION = ALLreconstrói todas as partições do índice usando as opções de compactação existentes. - A sintaxe
ALTER INDEX <index> ... REBUILD PARTITION = ALL (WITH ...)reconstrói todas as partições do índice. Você pode escolher diferentes compactações para diferentes partições usando a cláusulaDATA_COMPRESSION = ... ON PARTITIONS ( ...).
Para avaliar como a alteração da PAGE e da compactação de ROW afeta uma tabela, um índice ou uma partição, use o procedimento armazenado sp_estimate_data_compression_savings.
Estatísticas
Quando você recria um índice, as estatísticas sobre o índice são atualizadas com a verificação completa para índices não particionados e com a taxa de amostragem padrão para índices particionados. Nenhuma outra estatística na tabela é atualizada como parte da reconstrução do índice.
Permissions
A permissão ALTER na tabela ou exibição é necessária.
Notas de versão
- O Banco de Dados SQL do Azure não oferece suporte a grupos de arquivos diferentes
PRIMARY. - O Banco de Dados SQL do Azure e a Instância Gerenciada SQL do Azure não oferecem suporte a opções de
FILESTREAM. - Os índices Columnstore não estão disponíveis antes do SQL Server 2012 (11.x).
- As operações de índice retomáveis estão disponíveis no SQL Server 2017 (14.x) e versões posteriores, no Banco de Dados SQL do Azure e na Instância Gerenciada SQL do Azure.
Exemplo de sintaxe básica
ALTER INDEX index1 ON table1 REBUILD;
ALTER INDEX ALL ON table1 REBUILD;
ALTER INDEX ALL ON dbo.table1 REBUILD;
Exemplos: índices Columnstore
Estes exemplos se aplicam a índices columnstore.
A. Demo REORGANIZE
Este exemplo demonstra como o comando ALTER INDEX REORGANIZE funciona. Ele cria uma tabela que tem vários grupos de linhas e, em seguida, demonstra como REORGANIZE mescla os grupos de linhas.
-- 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 TRANSACTION
WHILE (@loop < 300000)
BEGIN
SELECT @AccountKey = CAST(RAND() * 10000000 AS INT);
SELECT @AccountDescription = 'accountdesc ' + CONVERT(VARCHAR(20), @AccountKey);
SELECT @AccountType = 'AccountType ' + CONVERT(VARCHAR(20), @AccountKey);
SELECT @AccountCode = CAST(RAND() * 10000000 AS INT);
INSERT INTO staging
VALUES (
@AccountKey,
@AccountDescription,
@AccountType,
@AccountCode
);
SELECT @loop = @loop + 1;
END
COMMIT
-- Create a table for the clustered columnstore index
CREATE TABLE cci_target (
AccountKey INT NOT NULL,
AccountDescription NVARCHAR(50),
AccountType NVARCHAR(50),
AccountCodeAlternateKey INT
);
-- Convert the table to a clustered columnstore index named inxcci_cci_target;
CREATE CLUSTERED COLUMNSTORE INDEX idxcci_cci_target ON cci_target;
Use a opção TABLOCK para inserir linhas em paralelo. A partir do SQL Server 2016 (13.x), a operação INSERT INTO pode ser executada em paralelo quando TABLOCK é usada.
INSERT INTO cci_target WITH (TABLOCK)
SELECT TOP 300000 * FROM staging;
Execute este comando para ver os OPEN grupos de linhas delta. O número de grupos de linhas depende do grau de paralelismo.
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 CLOSED e OPEN grupos de linhas no columnstore.
ALTER INDEX idxcci_cci_target ON cci_target REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);
Execute este comando novamente e você verá que grupos de linhas menores são mesclados em um grupo de linhas compactado.
ALTER INDEX idxcci_cci_target ON cci_target REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);
B. Compactar grupos de linhas delta FECHADOS no columnstore
Este exemplo usa a opção REORGANIZE para compactar cada CLOSED grupo de linhas delta no columnstore como um grupo de linhas compactado. Isso não é necessário, mas é útil quando o tuple-mover não está comprimindo CLOSED grupos de linhas rápido o suficiente.
Você pode executar ambos os exemplos no banco de dados de exemplo AdventureWorksDW2025.
Este exemplo é executado REORGANIZE em todas as partições.
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE;
Este exemplo é executado REORGANIZE em uma partição específica.
-- REORGANIZE a specific partition
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE PARTITION = 0;
C. Comprima todos os grupos de linhas delta ABERTOS E FECHADOS no columnstore
Aplica-se a: SQL Server 2016 (13.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure
O comando REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON) compacta cada OPEN e CLOSED grupo de linhas delta no columnstore como um grupo de linhas compactado. Isso esvazia o deltastore e força todas as linhas a serem compactadas no columnstore. Isso é útil especialmente depois de executar muitas operações de inserção, uma vez que essas operações armazenam as linhas em um ou mais grupos de linhas delta.
REORGANIZE combina grupos de linhas para preencher grupos de linhas até um número máximo de linhas <= 1.024.576. Portanto, quando você compacta todos os OPEN e CLOSED grupos de linhas, você não acaba com muitos grupos de linhas compactados que têm apenas algumas linhas neles. Você deseja que os grupos de linhas estejam o mais completos possível para reduzir o tamanho compactado e melhorar o desempenho da consulta.
Os exemplos a seguir usam o banco de dados AdventureWorksDW2025.
Este exemplo move todos os OPEN e CLOSED grupos de linhas delta para o índice columnstore.
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);
Este exemplo move todos os OPEN e CLOSED grupos de linhas delta para o índice columnstore de uma partição específica.
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE PARTITION = 0 WITH (COMPRESS_ALL_ROW_GROUPS = ON);
D. Desfragmentar um índice columnstore online
Não se aplica a: SQL Server 2012 (11.x) e SQL Server 2014 (12.x).
A partir do SQL Server 2016 (13.x), REORGANIZE faz mais do que compactar grupos de linhas delta no columnstore. Também realiza a desfragmentação online. Primeiro, ele reduz o tamanho do columnstore removendo fisicamente as linhas excluídas quando 10% ou mais das linhas em um grupo de linhas foram excluídas. Em seguida, ele combina grupos de linhas para formar grupos de linhas maiores que têm até o máximo de 1.024.576 linhas por grupos de linhas. Todos os grupos de linhas que são alterados são recompactados.
Note
A partir do SQL Server 2016 (13.x), a reconstrução de um índice columnstore não é mais necessária na maioria das situações, pois o REORGANIZE remove fisicamente linhas excluídas e mescla grupos de linhas. A opção COMPRESS_ALL_ROW_GROUPS força todos os OPEN ou CLOSED grupos de linhas delta para o columnstore, o que anteriormente só podia ser feito com uma reconstrução.
REORGANIZE está online e ocorre em segundo plano para que as consultas possam continuar à medida que a operação acontece.
O exemplo a seguir executa um REORGANIZE para desfragmentar o índice removendo fisicamente linhas que foram excluídas logicamente da tabela e mesclando grupos de linhas.
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE;
E. Reconstruir um índice columnstore clusterizado offline
Aplica-se a: SQL Server, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure
Tip
A partir do SQL Server 2016 (13.x) e no Banco de Dados SQL do Azure, recomendamos usar ALTER INDEX REORGANIZE em vez de ALTER INDEX REBUILD para índices columnstore.
Note
No SQL Server 2012 (11.x) e no SQL Server 2014 (12.x), REORGANIZE é usado apenas para compactar CLOSED grupos de linhas no columnstore. A única maneira de executar operações de desfragmentação e forçar todos os grupos de linhas delta no columnstore é reconstruir o índice.
Este exemplo mostra como reconstruir um índice columnstore clusterizado e forçar todos os grupos de linhas delta no columnstore. Esta primeira etapa prepara um FactInternetSales2 de tabela no banco de dados AdventureWorksDW2025 com um índice columnstore clusterizado e insere dados das quatro primeiras colunas.
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 um OPEN grupo de linhas, o que significa que o SQL Server aguarda a adição de mais linhas antes de fechar o grupo de linhas e mover os dados para o columnstore. Esta próxima instrução reconstrói o índice columnstore clusterizado, que força todas as linhas no columnstore.
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REBUILD;
SELECT * FROM sys.column_store_row_groups;
Os resultados da instrução SELECT mostram que o grupo de linhas é COMPRESSED, o que significa que os segmentos de coluna do grupo de linhas agora são compactados e armazenados no columnstore.
F. Reconstruir uma partição de um índice columnstore clusterizado offline
Aplica-se a: SQL Server 2012 (11.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure
Para reconstruir uma partição de um grande índice columnstore clusterizado, use ALTER INDEX REBUILD com a opção partition. Este exemplo reconstrói a partição 12. A partir do SQL Server 2016 (13.x), recomendamos substituir REBUILD por REORGANIZE.
ALTER INDEX cci_fact3
ON fact3
REBUILD PARTITION = 12;
G. Alterar um índice columnstore clusterizado para usar compactação de arquivamento
Não se aplica ao: SQL Server 2012 (11.x)
Você pode optar por reduzir ainda mais o tamanho de um índice columnstore clusterizado usando a opção de compactação de dados COLUMNSTORE_ARCHIVE. Isso é prático para dados mais antigos que você deseja manter em um armazenamento mais barato. Recomendamos usar isso apenas em dados que não são acessados com frequência, pois a descompactação é mais lenta do que com a compactação COLUMNSTORE normal.
O exemplo a seguir recria um índice columnstore clusterizado para usar a compactação de arquivo e, em seguida, mostra como remover a compactação de arquivamento. O resultado final usa apenas a compactação columnstore.
Primeiro, prepare o exemplo criando uma tabela com um índice columnstore clusterizado. Em seguida, compacte ainda mais a tabela usando a compactação de arquivo.
--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);
GO
Este exemplo remove a compactação de arquivo morto e usa apenas a compactação columnstore.
ALTER INDEX cci_SimpleTable ON SimpleTable
REBUILD
WITH (DATA_COMPRESSION = COLUMNSTORE);
GO
Exemplos: índices de armazenamento de linhas
A. Reconstruir um índice
O exemplo a seguir recria um único índice na tabela Employee no banco de dados AdventureWorks2025.
ALTER INDEX PK_Employee_EmployeeID ON HumanResources.Employee REBUILD;
B. Reconstruir todos os índices em uma tabela e especificar opções
O exemplo a seguir especifica a palavra-chave ALL. Isso recria todos os índices associados ao Production.Product de tabela no banco de dados AdventureWorks2025. São especificadas três opções.
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, incluindo a opção de bloqueio de baixa prioridade, e adiciona a opção de compactação de linha.
Aplica-se a: SQL Server 2014 (12.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure
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. Reorganizar um índice com compactação de LOB
O exemplo a seguir reorganiza um único índice clusterizado no banco de dados AdventureWorks2025. 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 os dados de objeto grande. Especificar a opção WITH (LOB_COMPACTION = ON) não é necessário porque o valor padrão é ON.
ALTER INDEX PK_ProductPhoto_ProductPhotoID ON Production.ProductPhoto REORGANIZE WITH (LOB_COMPACTION = ON);
D. Definir opções em um índice
O exemplo a seguir define várias opções no AK_SalesOrderHeader_SalesOrderNumber de índice no banco de dados AdventureWorks2025.
ALTER INDEX AK_SalesOrderHeader_SalesOrderNumber ON
Sales.SalesOrderHeader
SET (
STATISTICS_NORECOMPUTE = ON,
IGNORE_DUP_KEY = ON,
ALLOW_PAGE_LOCKS = ON
) ;
GO
E. Desativar um índice
O exemplo a seguir desabilita um índice não clusterizado na tabela Employee no banco de dados AdventureWorks2025.
ALTER INDEX IX_Employee_ManagerID ON HumanResources.Employee DISABLE;
F. Desativar restrições
O exemplo a seguir desabilita uma restrição de PRIMARY KEY desabilitando o índice de PRIMARY KEY no banco de dados AdventureWorks2025. A restrição de FOREIGN KEY na tabela subjacente é automaticamente desativada e a mensagem de aviso é exibida.
ALTER INDEX PK_Department_DepartmentID ON HumanResources.Department DISABLE;
O conjunto de resultados retorna essa mensagem de aviso.
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. Ativar restrições
O exemplo a seguir habilita as restrições de PRIMARY KEY e FOREIGN KEY que foram desabilitadas no Exemplo F.
A restrição PRIMARY KEY é ativada reconstruindo o índice PRIMARY KEY.
ALTER INDEX PK_Department_DepartmentID ON HumanResources.Department REBUILD;
A restrição FOREIGN KEY é então ativada.
ALTER TABLE HumanResources.EmployeeDepartmentHistory
CHECK CONSTRAINT FK_EmployeeDepartmentHistory_Department_DepartmentID;
GO
H. Reconstruir um índice particionado
O exemplo a seguir reconstrói uma única partição, número de partição 5, do índice particionado IX_TransactionHistory_TransactionDate no banco de dados AdventureWorks2025. A partição 5 é reconstruída com ONLINE=ON e o tempo de espera de 10 minutos para o bloqueio de baixa prioridade aplica-se separadamente a cada bloqueio adquirido pela operação de reconstrução do índice. Se durante esse tempo o bloqueio não puder ser obtido para concluir a reconstrução do índice, a instrução da operação de reconstrução em si será abortada, devido a ABORT_AFTER_WAIT = SELF.
Aplica-se a: SQL Server 2014 (12.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure
-- 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. Alterar a configuração de compactação de um índice
O exemplo a seguir recria um índice em uma tabela de armazenamento de linhas não particionada.
ALTER INDEX IX_INDEX1
ON T1
REBUILD
WITH (DATA_COMPRESSION = PAGE);
GO
J. Alterar a configuração de um índice com compactação XML
Aplica-se a: SQL Server 2022 (16.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure.
O exemplo a seguir recria um índice em uma tabela de armazenamento de linhas não particionada.
ALTER INDEX IX_INDEX1
ON T1
REBUILD
WITH (XML_COMPRESSION = ON);
GO
Para obter mais exemplos de compactação de dados, consulte de compactação de dados.
K. Reconstrução de índice retomável on-line
Aplica-se a: SQL Server 2017 (14.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure
Os exemplos a seguir mostram como usar a reconstrução de índice retomável online.
Execute uma reconstrução de índice on-line como operação retomável com MAXDOP = 1. Executar o mesmo comando novamente depois que uma operação de índice foi pausada, retoma automaticamente a operação de reconstrução de índice.
ALTER INDEX test_idx on test_table REBUILD WITH (ONLINE = ON, MAXDOP = 1, RESUMABLE = ON);
Execute uma reconstrução de índice online como operação retomável com MAX_DURATION definido como 240 minutos.
ALTER INDEX test_idx on test_table REBUILD WITH (ONLINE = ON, RESUMABLE = ON, MAX_DURATION = 240);
Pause uma reconstrução de índice online retomável em execução.
ALTER INDEX test_idx on test_table PAUSE;
Retomar uma reconstrução de índice online para uma reconstrução de índice que foi executada como operação retomável especificando um novo valor para MAXDOP definido como 4.
ALTER INDEX test_idx on test_table RESUME WITH (MAXDOP = 4);
Retome uma operação de reconstrução de índice online para uma reconstrução online de índice que foi executada como retomável. Defina MAXDOP como 2, defina o tempo de execução do índice que está sendo executado como retomável para 240 minutos e, se um índice estiver sendo bloqueado no bloqueio, aguarde 10 minutos e depois disso mate todos os bloqueadores.
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));
Anule a operação de reconstrução de índice retomável em execução ou pausada.
ALTER INDEX test_idx on test_table ABORT;
Conteúdo relacionado
- de arquitetura e design do índice SQL Server e do Azure
- Executar operações de índice on-line
- CRIAR ÍNDICE (Transact-SQL)
- CRIAR ÍNDICE ESPACIAL (Transact-SQL)
- CRIAR ÍNDICE XML (Transact-SQL)
- ÍNDICE DE QUEDA (Transact-SQL)
- Desativar índices e restrições
- índices XML (SQL Server)
- Otimize a manutenção do índice para melhorar o desempenho da consulta e reduzir o consumo de recursos
- sys.dm_db_index_physical_stats (Transact-SQL)
- EVENTDATA (Transact-SQL)