Partilhar via


Diretrizes para operações de índice on-line

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

Quando você executa operações de índice online, as seguintes diretrizes se aplicam:

  • Os índices clusterizados devem ser criados, reconstruídos ou eliminados offline quando a tabela subjacente contiver os seguintes tipos de dados de objeto grande (LOB): imagem , ntext e texto .

  • Índices não exclusivos e não clusterizados podem ser criados online quando a tabela tem colunas usando os tipos de dados LOB, mas nenhuma dessas colunas é usada na definição de índice como coluna chave ou incluída.

  • Os índices em tabelas temporárias locais não podem ser criados, reconstruídos ou descartados online. Essa restrição não se aplica a índices em tabelas temporárias globais.

  • Você pode iniciar uma operação de índice online como uma operação retomável usando a cláusula RESUMABLE de CREATE INDEX ou ALTER INDEX. Uma operação de índice retomável pode ser reiniciada após uma falha inesperada, troca de banco de dados ou um comando ALTER INDEX PAUSE e continuar de onde foi interrompida.

Note

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 funcionalidades suportadas pelas edições do SQL Server, consulte Edições e funcionalidades suportadas do SQL Server 2022.

A tabela a seguir mostra as operações de índice que podem ser executadas online, os índices excluídos dessas operações online e as restrições de índice retomáveis. Restrições adicionais também estão incluídas.

Operação de índice online Índices excluídos Outras restrições
ALTER INDEX REBUILD Índice clusterizado desativado ou modo de exibição indexado desabilitado

Índice XML

Índice numa tabela temporária local
Especificar a palavra-chave ALL pode fazer com que a operação falhe quando a tabela contém um índice excluído.

Aplicam-se restrições adicionais à reconstrução de índices desativados. Para obter mais informações, consulte Desabilitar índices e restrições.
CREATE INDEX Índice XML

Índice agrupado exclusivo inicial numa vista

Índice numa tabela temporária local
CREATE INDEX WITH DROP_EXISTING Índice clusterizado desativado ou modo de exibição indexado desabilitado

Índice numa tabela temporária local

Índice XML
DROP INDEX Índice desativado

Índice XML

Índice não agrupado

Índice numa tabela temporária local
Vários índices não podem ser especificados em uma única instrução.
ALTER TABLE ADD CONSTRAINT (PRIMARY KEY ou UNIQUE) Índice numa tabela temporária local

Índice agrupado
Só é permitida uma subcláusula de cada vez. Por exemplo, não é possível adicionar e remover restrições PRIMARY KEY ou UNIQUE na mesma instrução ALTER TABLE.
ALTER TABLE DROP CONSTRAINT (PRIMARY KEY ou UNIQUE) Índice agrupado

A tabela subjacente não pode ser modificada, truncada ou descartada enquanto uma operação de índice online estiver em andamento.

A configuração de opção online (ON ou OFF) especificada quando você cria ou solta um índice clusterizado é aplicada a quaisquer índices não clusterizados que devem ser reconstruídos. Por exemplo, se o índice clusterizado for criado online usando CREATE INDEX WITH DROP_EXISTING, ONLINE = ON, todos os índices não clusterizados associados também serão recriados online.

Quando você cria ou reconstrói um índice de UNIQUE online, o construtor de índices e uma transação de usuário simultânea podem tentar inserir a mesma chave, violando assim a exclusividade. Se uma linha inserida por um usuário for inserida no novo índice (destino) antes que a linha original da tabela de origem seja movida para o novo índice, a operação de índice online falhará.

Embora não seja comum, a operação de índice online pode causar um impasse quando interage com atualizações de banco de dados devido a atividades de usuários ou aplicativos. Nesses casos raros, a atividade do usuário ou do aplicativo é selecionada como a vítima do deadlock.

Você pode executar operações DDL de índice online simultâneas na mesma tabela ou exibir somente quando estiver criando vários novos índices não clusterizados ou reorganizando índices não clusterizados. Todas as outras operações de índice online executadas ao mesmo tempo falham. Por exemplo, não é possível criar um novo índice online enquanto reconstrói um índice existente online na mesma tabela.

Uma operação online não pode ser executada quando um índice contém uma coluna do tipo de objeto grande e a mesma transação faz modificações de dados antes que a operação de índice online seja iniciada. Para contornar esse problema, mova a operação de índice online para fora da transação ou mova-a antes de quaisquer modificações de dados na mesma transação.

Considerações sobre espaço em disco

As operações de índice online exigem mais espaço em disco do que as operações de índice offline.

  • Durante as operações de criação e reconstrução do índice, é necessário espaço adicional para o índice que está sendo criado (ou reconstruído). Comumente, esse espaço adicional é o mesmo que o espaço atual ocupado pelo índice, mas pode ser maior ou menor dependendo da compressão usada no índice atual ou reconstruído.

  • Além disso, é necessário espaço em disco para o índice de mapeamento temporário. Esse índice temporário é usado em operações de índice online que criam, recriam ou descartam um índice clusterizado.

  • Descartar um índice clusterizado online requer tanto espaço quanto criar (ou reconstruir) um índice clusterizado online.

Para obter mais informações, consulte Requisitos de espaço em disco para operações DDL de índice.

Considerações sobre desempenho

Embora as operações de índice online permitam a atividade de atualização simultânea do usuário, as operações de índice podem levar mais tempo se a atividade de atualização for pesada. Normalmente, as operações de índice online são mais lentas do que as operações de índice offline equivalentes, independentemente do nível de atividade de atualização simultânea.

Como as estruturas de origem e de destino são mantidas durante a operação de índice online, o uso de recursos para transações de inserção, atualização e exclusão é aumentado, que podem até mesmo dobrar. Isso pode causar uma diminuição no desempenho e maior uso de recursos, especialmente o tempo da CPU, durante a operação do índice. As operações de índice on-line são totalmente registradas.

Embora recomendemos operações on-line, você deve avaliar seu ambiente e requisitos específicos. Pode ser ideal executar operações de índice offline. Ao fazer isso, o acesso do usuário aos dados é restrito durante a operação, mas a operação termina mais rápido e usa menos recursos.

Em computadores multiprocessador que executam o SQL Server 2016 (13.x) e versões posteriores, as operações de índice podem usar paralelismo para executar as operações de verificação e classificação associadas à instrução index. Você pode usar a opção de índice MAXDOP para controlar o grau de paralelismo da operação de índice online. Dessa forma, você pode equilibrar os recursos que são usados pela operação de índice com os recursos dos usuários simultâneos. Para obter mais informações, consulte Configurar operações de índice paralelo. Para obter mais informações sobre as edições do SQL Server que oferecem suporte a operações de índice paralelo, consulte Edições e recursos com suporte do SQL Server 2022.

Como um bloqueio compartilhado (S) ou um bloqueio de modificação de esquema (Sch-M) é mantido na fase final da operação de índice, tenha cuidado ao executar uma operação de índice em linha dentro de uma transação explícita do utilizador, como um bloco BEGIN TRANSACTION ... COMMIT. Isso faz com que os bloqueios sejam mantidos até o final da transação, potencialmente bloqueando outras cargas de trabalho.

Se os bloqueios de página de índice forem desabilitados usando ALLOW_PAGE_LOCKS = OFF, a reconstrução de índice online poderá aumentar a fragmentação do índice quando for executada com MAXDOP maior que 1. Para obter mais informações, consulte Como Funciona: Reconstrução de Índice Online - Pode Causar Aumento da Fragmentação.

Considerações sobre o log de transações

Operações de índice em grande escala realizadas offline ou online podem gerar grandes quantidades de log de transações. Isso ocorre porque as operações de reconstrução de índice offline e online são totalmente registradas. Para garantir que a operação de índice possa ser revertida, o log de transações não pode ser truncado até que a operação de índice seja concluída; no entanto, é possível fazer backup do log durante a operação de índice.

Portanto, o log de transações deve ter espaço suficiente para armazenar as transações da operação de índice e quaisquer transações de usuário simultâneas durante a operação de índice. Para obter mais informações, consulte Espaço em disco do log de transações para operações de índice.

As operações de índice online não causam um grande aumento no log de transações se a recuperação acelerada de base de dados (ADR) estiver ativada.

Considerações sobre armazenamento de versão persistente

Se o ADR estiver habilitado, criar ou reconstruir um grande índice on-line pode aumentar substancialmente o tamanho do armazenamento de versão persistente (PVS) enquanto a operação de índice está em andamento. Certifique-se de que o banco de dados tenha espaço livre suficiente para o PVS crescer. Para obter mais informações, consulte Monitorizar e resolver problemas de recuperação acelerada de banco de dados.

Considerações sobre índices retomáveis

A opção de índice RESUMABLE para CREATE INDEX e ALTER INDEX se aplica ao SQL Server (ALTER INDEX começando com o SQL Server 2017 (14.x) e CREATE INDEX começando com o SQL Server 2019 (15.x)), o Banco de Dados SQL do Azure e a Instância Gerenciada do SQL do Azure. Para obter mais informações, consulte CREATE INDEX e ALTER INDEX.

Para usar a opção RESUMABLE, você também deve usar a opção ONLINE. Quando você executa a criação ou reconstrução de índice retomável, as seguintes diretrizes se aplicam:

  • Tem um melhor controlo sobre a gestão, o planeamento e a ampliação das janelas de manutenção do índice. Você pode pausar e reiniciar uma operação de criação ou reconstrução de índice várias vezes para se ajustar às suas janelas de manutenção.

  • Você pode se recuperar de falhas de criação ou reconstrução de índice (como failovers de banco de dados ou falta de espaço em disco) sem ter que reiniciar a operação de índice desde o início.

  • Quando uma operação de índice é pausada, tanto o índice original quanto o recém-criado exigem espaço em disco e precisam ser atualizados durante as operações DML.

  • A opção SORT_IN_TEMPDB = ON não é suportada.

  • Não há suporte para índices desabilitados.

Tip

As operações de índice retomáveis não exigem uma transação grande, permitindo o truncamento frequente do log durante essa operação e evitando um grande crescimento do log. Os dados necessários para retomar e concluir uma operação de índice são armazenados nos arquivos de dados de um banco de dados.

Geralmente, não há diferença de desempenho entre operações de índice online retomáveis e não retomáveis. Para CREATE INDEXretomáveis, há uma sobrecarga constante que pode causar operações visivelmente mais lentas para tabelas menores.

Quando uma operação de índice retomável é pausada:

  • Para cargas de trabalho predominantemente de leitura, a degradação do desempenho é insignificante.
  • Para cargas de trabalho com muitas atualizações, você pode enfrentar alguma degradação da taxa de transferência, dependendo das especificidades da carga de trabalho.

Geralmente, não há diferença na qualidade da desfragmentação entre a criação ou reconstrução de índices online retomáveis e não retomáveis.

Enquanto uma operação de índice online é pausada, qualquer transação que exija um bloqueio exclusivo (X) no nível da tabela que contém o índice pausado falha. Por exemplo, isso pode ocorrer com as operações INSERT ... WITH (TABLOCK). Nesse caso, você recebe o erro 10637:

Cannot perform this operation on '<object name>' with ID (<object ID>) as one or more indexes are currently in resumable index rebuild state. Please refer to sys.index_resumable_operations for more details.

Para resolver o erro 10637, remova o indicador TABLOCK da sua transação ou retome a operação de índice e aguarde a conclusão antes de tentar a sua transação novamente.

Opções padrão online

Você pode definir operações de índice online e retomáveis como as opções padrão no nível do banco de dados definindo as configurações de escopo de banco de dados ELEVATE_ONLINE ou ELEVATE_RESUMABLE. Com essas opções padrão, você pode evitar iniciar acidentalmente uma operação de índice offline que torna uma tabela ou índice inacessível enquanto está em execução. Ambas as opções fazem com que o mecanismo de banco de dados eleve automaticamente determinadas operações de índice para execução online ou retomável.

Você pode definir qualquer opção como FAIL_UNSUPPORTED, WHEN_SUPPORTEDou OFF. Você pode definir valores diferentes para ELEVATE_ONLINE e ELEVATE_RESUMABLE. Para obter mais informações, consulte ALTER DATABASE SCOPED CONFIGURATION.

Tanto ELEVATE_ONLINE quanto ELEVATE_RESUMABLE se aplicam apenas a instruções DDL que suportam a sintaxe online e retomável, respectivamente. Por exemplo, se você tentar criar um índice XML com ELEVATE_ONLINE = FAIL_UNSUPPORTED, a operação será executada offline, pois os índices XML não oferecem suporte à opção ONLINE. As opções afetam apenas os comandos DDL que são enviados sem especificar uma opção ONLINE ou RESUMABLE. Por exemplo, ao enviar uma instrução com ONLINE = OFF ou RESUMABLE = OFF, o utilizador pode sobrepor uma configuração de FAIL_UNSUPPORTED e executar uma instrução offline e/ou sem possibilidade de retoma.

Note

ELEVATE_ONLINE e ELEVATE_RESUMABLE não se aplicam a operações de índice XML.