Compartilhar via


Como funcionam as operações de índice online

Este tópico 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 dados de índice clusterizados. Í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) e atualizações implícitas por gatilhos e restrições de integridade referencial. Todos os índices preexistentes estão disponíveis para consultas e pesquisas. Isso significa que eles podem ser selecionados pelo otimizador de consulta e, se necessário, especificados em dicas de índice.

  • Target (destino)

    O destino ou os alvos são o novo índice (ou heap) ou um conjunto de novos índices que está sendo criado ou reconstruído. 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 do SQL Server ao destino durante a operação de indexação. 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 não é pesquisado durante o processamento de instruções SELECT até que a operação de índice seja confirmada. Internamente, o índice é marcado como somente gravação.

  • Índice de mapeamento temporário

    As operações de índice online que criam, descartam ou recompilam um índice clusterizado também exigem 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 subjacente 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 também 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 simples, como a criação de um índice clusterizado em uma tabela sem índice (heap), a origem e o destino passam por três fases: preparação, construção e final.

A ilustração a seguir mostra o processo de criação de um índice clusterizado inicial online. 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; As operações de seleção, inserção, atualização e exclusão simultâneas do usuário também são mostradas. As fases de preparação, build e final são indicadas junto com os modos de bloqueio usados em cada fase.

Atividades executadas durante a operação de índice online

Atividades da estrutura de origem

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

Fase Atividade de origem Bloqueios de fonte
Preparação

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

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

As operações de escrita simultânea por usuários na origem são bloqueadas por um período muito curto.

Nenhuma operação DDL simultânea é permitida, exceto a criação de vários índices não clusterizados.
S (Compartilhado) na tabela*

IS (Intenção Compartilhada)

INDEX_BUILD_INTERNAL_RESOURCE**
Construir

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

As operações de seleção, inserção, atualização e exclusão simultâneas do usuário são aplicadas aos índices preexistentes e a todos os novos índices que estão sendo criados.
É

INDEX_BUILD_INTERNAL_RESOURCE**
Final

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

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

A origem será removida se for necessária. Por exemplo, depois de recriar ou remover um índice clusterizado.
INDEX_BUILD_INTERNAL_RESOURCE**

S na tabela se estiver criando um índice não clusterizado.*

SCH-M (Modificação de Esquema) se qualquer estrutura de origem (índice ou tabela) for descartada.*

* A operação de índice aguardará a conclusão de todas as transações de atualização pendentes antes de adquirir o bloqueio S ou o bloqueio SCH-M na tabela.

** O bloqueio de recursos INDEX_BUILD_INTERNAL_RESOURCE 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 impede a recompilação simultânea de dois índices na mesma tabela. Embora esse bloqueio de recurso esteja associado ao bloqueio de Sch-M, 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 build de uma operação de índice 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 S de curto prazo são adquiridos durante a fase de build seguida por bloqueios is (Intent Shared) de longo prazo. Um bloqueio S é adquirido primeiro para a criação de índice clusterizado e, ao criar o índice clusterizado, um segundo bloqueio S de curto prazo é adquirido para criar os índices não clusterizados. Depois que os índices não-clusterizados são criados, o bloqueio S é rebaixado para um bloqueio IS até a fase final da operação de índice online.

Atividades da Estrutura Alvo

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

Fase Atividade alvo Travamento de alvo
Preparação O novo índice é criado e definido como apenas para gravação. É
Construir Os dados são inseridos da origem.

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

Essa atividade é transparente para o usuário.
É
Final Os metadados de índice são atualizados.

O índice é definido como status de leitura/gravação.
S

ou

SCH-M

O destino não é acessado por instruções SELECT emitidas pelo usuário até que a operação de índice seja concluída.

Depois que a preparação e a fase final forem concluídas, os planos de consulta e atualização armazenados no cache de procedimentos serão invalidados. As consultas subsequentes usarão o novo índice.

O tempo de vida de um cursor declarado em uma tabela 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.

Executar operações de índice online

Diretrizes para operações de índice online