Compartilhar via


Como funcionam as 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

Este artigo define as estruturas que existem durante uma operação de índice online e mostra as atividades associadas a essas estruturas.

Estruturas de índice online

Para permitir a atividade simultânea do usuário durante uma operação de DDL (linguagem de definição de dados de índice), as seguintes estruturas são usadas durante a operação de índice online: índices de origem e pré-existentes, destino e para recriar um heap ou remover um índice clusterizado online, um índice de mapeamento temporário.

  • Índices de origem e pré-existentes

    A origem é a tabela original ou os dados do índice clusterizado. Índices preexistidos são quaisquer índices não clusterizados associados à estrutura de origem. Por exemplo, se a operação de índice online estiver recriando um índice clusterizado com quatro índices não clusterizados associados, a origem será o índice clusterizado existente e os índices preexistente serão os índices não clusterizados.

    Os índices preexistentes estão disponíveis para usuários simultâneos para operações de seleção, inserção, atualização e exclusão. Isso inclui inserções em massa (com suporte, mas não recomendado durante uma operação de índice online) e atualizações implícitas por gatilhos e restrições de integridade referencial. Todos os índices preexistentes estão disponíveis para consultas. Isso significa que eles podem ser selecionados pelo otimizador de consulta e, se necessário, especificados em dicas de índice.

  • Target

    O destino (ou destinos) é o novo índice (ou heap) ou um conjunto de novos índices sendo criados ou recompilados. As operações de inserção, atualização e exclusão do usuário na origem são aplicadas pelo Mecanismo de Banco de Dados ao destino durante a operação de índice. Por exemplo, se a operação de índice online estiver recriando um índice clusterizado, o destino será o índice clusterizado recriado; O Mecanismo de Banco de Dados não recria índices não clusterizados quando um índice clusterizado é recriado.

    O índice de destino só é utilizado depois que a operação de indexação é confirmada. Internamente, o índice é marcado como somente leitura.

  • Índice de mapeamento temporário

    As operações de índice online que criam, removem ou recompilam um índice clusterizado também requerem um índice de mapeamento temporário. Esse índice temporário é usado por transações simultâneas para determinar quais registros excluir nos novos índices que estão sendo criados quando as linhas na tabela de origem são atualizadas ou excluídas. Esse índice não clusterizado é criado na mesma etapa que o novo índice clusterizado (ou heap) e não requer uma operação de classificação separada. As transações simultâneas mantêm o índice de mapeamento temporário em todas as operações de inserção, atualização e exclusão.

Atividades de índice online

Durante uma operação de índice online, como a criação de um índice clusterizado em uma tabela não desindexada (heap), a origem e o destino passam por três fases: preparação, compilação e final.

Para monitorar o progresso de uma operação de índice online, você pode usar o evento estendido .

A ilustração a seguir mostra o processo para criar um índice clusterizado online inicial. O objeto de origem (o heap) não tem outros índices. As atividades de estrutura de origem e de destino são mostradas para cada fase; operações do usuário simultâneo SELECT, INSERT, UPDATE e DELETE também são mostradas. As fases de preparação, compilação e finalização são indicadas junto com os modos de bloqueio usados em cada fase.

Diagrama mostrando as atividades executadas durante a operação de índice online.

Atividades de estrutura do código-fonte

A tabela a seguir lista as atividades envolvendo as estruturas de origem durante cada fase da operação de índice e a estratégia de bloqueio correspondente.

Phase Atividade de origem Bloqueios de fonte
Preparation

Fase curta
Preparação dos metadados do sistema para criar uma nova estrutura de índice vazia.

Um instantâneo da tabela é definido. Ou seja, o controle de versão de linha é usado para fornecer uma consistência de leitura em nível de transação.

As operações de gravação de usuário simultâneas na origem são bloqueadas por um período curto.

Operações DLL não simultâneas são permitidas, exceto na criação de múltiplos índices não clusterizados.
Compartilhado (S) na tabela1

Intenção compartilhada (IS)

Bloqueio de objeto de modificação de esquema (Sch-M) com o recurso de subtipo INDEX_OPERATION2
Build

Fase principal
Os dados são escaneados, classificados, mesclados e inseridos no destino usando operações de carga em massa.

As operações simultâneas de INSERT, UPDATE, DELETE e MERGE são aplicadas tanto aos índices preexistentes quanto a quaisquer novos índices que estão sendo criados.
Intenção compartilhada (IS)

Sch-M bloqueio de objeto com o subtipo INDEX_OPERATIONde recurso 2
Final

Fase curta
Todas as transações de escrita não confirmadas devem ser concluídas antes que esta fase comece. Dependendo do bloqueio adquirido, todas as novas transações de leitura ou gravação do usuário serão bloqueadas por um curto período até que essa fase seja concluída.

Os metadados do sistema estão atualizados para substituir a origem pelo destino.

A origem será removida se necessário, por exemplo, depois de recompilar ou remover um índice clusterizado.
Sch-M bloqueio de objeto com o subtipo INDEX_OPERATIONde recurso 2

Compartilhado (S) na tabela se estiver criando um índice não clusterizado.1

Sch-M se qualquer estrutura de origem (índice ou tabela) for descartada. 1

1 A operação de índice aguarda a conclusão de todas as transações de gravação não confirmadas antes de adquirir o S bloqueio ou o Sch-M bloqueio na tabela. Se uma consulta de execução prolongada estiver ocorrendo, a operação de índice online aguardará até que a consulta seja concluída. A menos que bloqueios de baixa prioridade sejam usados, isso pode formar uma cadeia de bloqueio.

2 Um Sch-M bloqueio de objeto com o subtipo INDEX_OPERATION de recurso impede a execução de operações de DDL (linguagem de definição de dados) simultâneas nas estruturas de origem e pré-existentes enquanto a operação de índice está em andamento. Por exemplo, esse bloqueio evita a recompilação simultânea de dois índices na mesma tabela. Embora seja um Sch-M bloqueio, ele não impede instruções de manipulação de dados.

A tabela anterior mostra um único bloqueio compartilhado (S) adquirido durante a fase de construção de uma operação de índice realizada online que envolve um único índice. Quando índices clusterizados e não clusterizados são criados ou recriados, em uma única operação de índice online (por exemplo, durante a criação inicial de índice clusterizado em uma tabela que contém um ou mais índices não clusterizados) dois bloqueios de curto prazo S são adquiridos durante a fase de build seguidos por bloqueios compartilhados (IS) de intenção de longo prazo. Um S bloqueio é adquirido primeiro para a criação do índice clusterizado. Quando o índice agrupado é criado, um segundo bloqueio de curto prazo S é adquirido para criar os índices não agrupados. Depois que os índices não clusterizados são criados, o S bloqueio é rebaixado para um IS bloqueio até a fase final da operação de índice online.

Para obter mais informações sobre como os bloqueios são usados e como você pode gerenciá-los, consulte WAIT_AT_LOW_PRIORITY com operações de índice online.

Atividades relacionadas à estrutura-alvo

A tabela a seguir lista as atividades que envolvem as estruturas destino durante cada fase da operação de índice e a estratégia de bloqueio correspondente.

Phase Atividade de destino Bloqueios de destino
Preparation Um novo índice é criado e definido como somente gravação. Intenção compartilhada (IS)
Build Os dados são inseridos a partir da origem.

As modificações do usuário (inserções, atualizações, exclusões) aplicadas à origem também são aplicadas ao destino.

Esta atividade é transparente ao usuário.
Intenção compartilhada (IS)
Final Os metadados do índice são atualizados.

O índice está configurado para o modo de leitura/gravação.
Compartilhado (S) ou modificação de esquema (Sch-M)

O destino não é acessado por consultas de usuário até que a operação de índice seja concluída.

Depois que a preparação ou a fase final for concluída, os planos de consulta armazenados no cache do plano poderão ser invalidados.

O tempo de vida de um cursor declarado em uma tabela que está envolvida em uma operação de índice online é limitado pelas fases de índice online. Os cursores de atualização são invalidados em cada fase. Os cursores somente leitura são invalidados somente após a fase final.