Compartilhar via


Diretrizes para operações de índice online

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureBanco de dados SQL no Microsoft Fabric

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

  • Os índices clusterizados devem ser criados, recriados ou descartados offline quando a tabela subjacente contiver estes tipos de dados LOB (objeto grande): image, ntexte text.

  • Índices não clusterizados não específicos 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 chave ou colunas incluídas.

  • Os índices em tabelas temporárias locais, não podem ser criados, recriados ou soltos offline. Esta 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 RESUMABLE cláusula CREATE INDEX ou ALTER INDEX. Uma operação de índice retomável pode ser reiniciada após uma falha inesperada, failover de banco de dados ou um ALTER INDEX PAUSE comando e continuar de onde foi interrompida.

Note

As operações de índice online não estão disponíveis em todas as edições de Microsoft SQL Server. Para obter uma lista de recursos com suporte nas edições do SQL Server, confira Edições e recursos com suporte no SQL Server 2022.

A tabela seguinte mostra os operações de índice que podem ser executadas online e os índices que são excluídos destas operações online, além das restrições de índice resumí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 desabilitado ou exibição indexada desabilitada

Índice XML

Índice em uma tabela temporária local
Especificar a palavra-chave ALL pode fazer com que a operação falhe, quando a tabela contiver um índice excluído.

Se aplicam as restrições adicionais na reconstrução de índices desabilitados. Para obter mais informações, consulte Desabilitar índices e restrições.
CREATE INDEX Índice XML

Índice clusterizado exclusivo inicial em uma exibição

Índice em uma tabela temporária local
CREATE INDEX WITH DROP_EXISTING Índice clusterizado desabilitado ou exibição indexada desabilitada

Índice em uma tabela temporária local

Índice XML
DROP INDEX Índice desabilitado

Índice XML

Índice não clusterizado

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

Índice clusterizado
Somente um subcláusula por vez é permitida. Por exemplo, você não pode adicionar e excluir restrições PRIMARY KEY ou UNIQUE na mesma instrução ALTER TABLE.
ALTER TABLE DROP CONSTRAINT (PRIMARY KEY ou UNIQUE) Índice clusterizado

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

A configuração especificada de opção online (ON ou OFF) quando você cria ou solta um índice clusterizado é aplicada a qualquer índice não clusterizado que deva ser reconstruído. 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 UNIQUE online, o construtor de índice e uma transação de usuário simultânea podem tentar inserir a mesma chave, e, portanto, violando a singularidade. Se uma linha digitada por um usuário é inserida no índice novo (destino) antes que a linha original da tabela de destino seja movida para o índice novo, a operação de índice online falhará.

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

Você pode executar operações DDL simultâneas de índice online na mesma tabela ou apenas exibi-las quando estiver criando vários índices não clusterizados novos, ou reorganizando índices não clusterizados. Todas as outras operações de índice online executadas ao mesmo tempo falham. Por exemplo, você não pode criar um novo índice online enquanto estiver reconstruindo um índice online existente 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 do início da operação de índice online. Para contornar esse problema, mova a operação de índice online para fora da transação ou mova-a antes de qualquer modificação de dados na mesma transação.

Considerações do espaço em disco

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

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

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

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

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

Considerações sobre desempenho

Embora as operações de índice online permitam 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 que as operações de índice offline equivalentes, independentemente do nível de atividade de atualização simultâneo.

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, potencialmente dobrado. Isto poderia causar uma diminuição no desempenho e maior uso de recurso, especialmente tempo de CPU, durante a operação de índice. As operações de índice online estão em log completo.

Embora recomendemos as operações online , você deve avaliar o seu ambiente e os requisitos específicos. Pode ser melhor executar as operações de índice offline. Fazendo isto, o usuário tem acesso restrito aos dados durante a operação, mas a operação termina mais rapidamente e usa menos recursos.

Em computadores multiprocessadores que executam o SQL Server 2016 (13.x) e versões posteriores, as operações de índice podem usar o paralelismo para executar as operações de verificação e classificação associadas à instrução index. Você pode usar a opção MAXDOP de índice para controlar o grau de paralelismo da operação de índice online. Desse modo, é possível equilibrar os recursos usados por uma operação de índice com os recursos dos usuários simultâneos. Para obter mais informações, consulte Configurar operações de índice paralelo. Veja mais informações sobre as edições do SQL Server que oferecem suporte a operações de índice paralelas, em Edições e recursos compatíveis 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 online dentro de uma transação de usuário explícita, como o 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 estiverem desabilitados usando ALLOW_PAGE_LOCKS = OFF, a reconstrução de índice online poderá aumentar a fragmentação do índice quando for executada com MAXDOP superior a 1. Para obter mais informações, consulte Como funciona: recriação de índice online - pode causar maior fragmentação.

Considerações do log de transações

Operações de índice em larga escala executadas 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 assegurar 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. Durante a operação de índice, no entanto, poderá ser feito backup do log.

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 simultâneas de usuário durante a operação de índice. Para obter mais informações, consulte Espaço em disco de log de transações para operações de índice.

As operações de índice online não causarão um alto crescimento do log de transações se a ADR (recuperação acelerada de banco de dados) estiver habilitada.

Considerações do repositório de versão persistente

Se a ADR estiver habilitada, criar ou recompilar um índice grande online poderá aumentar substancialmente o tamanho do repositório de versões persistentes (PVS) enquanto a operação de índice estiver em andamento. Verifique se o banco de dados tem espaço livre suficiente para que a PVS cresça. Para obter mais informações, confira Monitorar e solucionar problemas da Recuperação Acelerada de Banco de Dados.

Considerações sobre índice retomável

A RESUMABLE opção de índice para CREATE INDEX e ALTER INDEX aplica-se 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 de 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 recompilação de índice retomável, as seguintes diretrizes se aplicam:

  • Você tem um controle mais eficaz sobre o gerenciamento, o planejamento e a extensão das janelas de manutenção de índices. Você pode pausar e reiniciar uma operação de criação ou recriação de índice várias vezes para adequar-se às janelas de manutenção.

  • Você pode recuperar-se de falhas na criação ou recompilação de índice (como alternâncias de banco de dados ou falta de espaço em disco) sem precisar reiniciar a operação de criação do índice desde o início.

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

  • A opção SORT_IN_TEMPDB = ON não é compatível.

  • 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 de 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 retomável CREATE INDEX, 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 de leitura principalmente, a degradação do desempenho é insignificante.
  • Para cargas de trabalho com muitas atualizações, você pode experimentar alguma redução no desempenho dependendo das especificações da carga de trabalho.

Em geral, não há nenhuma diferença na qualidade de desfragmentação entre a criação ou a recriação de índice online retomável e não retomável.

Enquanto uma operação de índice online está pausada, qualquer transação que exija um bloqueio exclusivo de nível de tabela (X) na tabela que contém o índice pausado falhará. Por exemplo, isso pode ocorrer durante operações INSERT ... WITH (TABLOCK). Nesse caso, você receberá 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 a dica TABLOCK de sua transação ou retome a operação de índice e aguarde a conclusão antes de tentar a transação novamente.

Opções online padrão

Você pode definir operações de índice online e retomáveis como opções padrão no nível do banco de dados configurando as opçõ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, veja ALTERAR A CONFIGURAÇÃO NO ESCOPO DO BANCO DE DADOS.

ELEVATE_ONLINE e ELEVATE_RESUMABLE são aplicáveis somente a instruções DDL que dão suporte à 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 dão suporte à opção ONLINE . As opções afetam apenas as instruções DDL enviadas sem especificar uma ONLINE ou RESUMABLE opção. Por exemplo, ao enviar uma instrução com ONLINE = OFF ou RESUMABLE = OFF, o usuário pode substituir uma configuração FAIL_UNSUPPORTED e executar uma instrução offline e/ou de modo não retomável.

Note

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