Como funcionam as operações de índice online

Esse tópico define as estruturas que existem durante uma operação de índice online, e mostra as atividades unidas a essas estruturas..

Estruturas de Índice Online

Para permitir atividade de usuário simultânea durante uma operação de linguagem de definição de dados (DLL) de índice, as seguintes estruturas são usadas durante a operação de índice online: índices fonte e preexistentes, alvo, e para os índices clusterizados, um índice de mapeamento temporário.

  • Índices de fonte e preexistentes

    A fonte é a tabela original ou os dados de índice de clusterizado. Índices preexistentes são quaisquer índices não-clusterizados associados a estrutura de fonte. Por exemplo, se a operação de índice online estiver recriando um índice clusterizado que tenha quatro índices não-clusterizados associados, a fonte será o índice clusterizado existente e os índices preexistentes serão os índices não-clusterizados.

    Os índices preexistentes estão disponíveis a usuários simultâneos para operações de seleção, inserção, atualização, e exclusão. Isto inclui inserções em massa (aceitas mas não recomendadas) e atualizações implícitas por gatilhos e restrições de integridade referenciais. Todos os índices preexistentes estão disponíveis para consultas e pesquisas. Isto significa eles podem ser selecionados pelo otimizador de consulta e, se necessário, especificados pelas dicas de índice.

  • Destino

    O destino ou destinos são o novo índice (ou heap) ou um conjunto de novos índices sendo criados ou recriados. As operações de inserção, atualização, e exclusão do destino são aplicadas pelo Mecanismo de Banco de Dados do SQL Server no destino durante a operação de índice. Por exemplo, se a operação de índice online estiver recriando um índice online, o alvo é 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 enquanto as instruções SELECT são processadas, até que a operação de índice esteja confirmada. Internamente, o índice é marcado como somente leitura.

  • Índice de mapeamento temporário

    As operações de índice online que criam, soltam, ou recriam um índice clusterizado também requerem um índice de mapeamento temporário. Este índice temporário é usado por transações simultâneas para determinar quais registros devem ser exclusos nos novos índices sendo criados, quando as linhas na tabela subjacente são atualizadas ou exclusas. Este índice não-clusterizado é criado no mesmo passo do 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 do Índice Online

Durante uma operação de índice online simples, como por exemplo a criação de um índice clusterizado em uma tabela não indexada (heap), a fonte e destino passam por essas três fases: preparação, criação, e finalização.

A seguinte ilustração mostra o processo para criar um índice clusterizado online inicial. O objeto fonte, o heap, não tem nenhum outro índice. As atividades de estrutura de fonte e destino são mostradas para cada uma das fazes, e as operações de inserção, atualização, e exclusão simultâneas do usuário, também são mostradas. As fases de preparação, criação, e de finalização são indicadas juntas com os modos de bloqueio usados em cada fase.

Atividades executadas durante a operação de indexação online

Atividades da estrutura fonte

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

Fase

Atividade fonte

Bloqueios fonte

Preparação

Fase muito curta

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

Um instantâneo da tabela é definido. O que significa que o controle de versão de linha é usado para fornecer uma consistência de leitura de nível de transação. Para obter mais informações, consulte Compreendendo níveis de isolamento com base em controle de versão de linha.

As operações de leitura de usuário simultâneo na fonte, são bloqueadas por um período muito curto.

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

S (Shared) na tabela *

IS (Intent Shared)

INDEX_BUILD_INTERNAL_RESOURCE**

Criar

Fase principal

Os dados são digitalizados, classificados, mesclados e inseridos no destino nas operações de carregamento em massa.

As operações de exclusão, atualização, inserção, e seleção por usuário simultâneos,são aplicadas aos índices preexistentes e quaisquer outros novos índices em criação.

IS (Intent Shared)

INDEX_BUILD_INTERNAL_RESOURCE**

Final

Fase muito curta

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

Os metadados do sistema estão atualizados para substituir a fonte com o destino.

A fonte é solta se for requerido. Por exemplo, após recriar ou soltar um índice clusterizado.

INDEX_BUILD_INTERNAL_RESOURCE**

S (Shared) na tabela se estiver criando um índice não-clusterizado. *

SCH-M (Schema Modification) se qualquer estrutura de fonte (índice ou tabela) for solta.*

* A operação de índice irá esperar que qualquer transação atualizada não confirmada seja concluída, antes de adquirir o bloqueio S-lock ou SCH-M na tabela.

** O bloqueio de recurso INDEX_BUILD_INTERNAL_RESOURCE evita a execução de operações DLL simultâneas na fonte e em estruturas preexistentes, enquanto a operação de índice está em progresso. Por exemplo, esse bloqueio evita a criação simultânea de dois índices na mesma tabela. Embora esse bloqueio de recurso esteja associado ao bloqueio Sch-M, ele não evita as instruções de manipulação de dados.

A tabela anterior mostra um único bloqueio Shared (S) adquirido durante a fase de criação 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 de índice clusterizado inicial em uma tabela que contém um ou mais índices não-cluster), dois bloqueios Shared (S) de curta duração, são adquiridos durante a fase de criação, sendo seguido por bloqueios IS de longa duração. Um bloqueio S é adquirido primeiramente para a criação de índice clusterizado, e quando a criação do índice clusterizado esteja terminada, um bloqueio S de curta duração é adquirido para a criação dos índices não-clusterizados. Depois que os índices não-clusterizados são criados, o bloqueio S fechadura é desatualizado para um bloqueio IS até a fase final da operação de índice online.

Atividades da estrutura de destino

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

Fase

Atividade de destino

Bloqueios de destino

Preparação

Um novo índice é criado e configurado para apenas gravação.

IS (Intent Shared)

Criar

Os dados são inseridos a partir da fonte.

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

Esta atividade é transparente ao usuário.

IS (Intent Shared)

Final

Os metadados de índice são atualizados.

O índice é configurado para o status leitura/gravação.

S (Shared)

ou

SCH-M (Schema Modification)

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

Após a preparação e fase final estarem concluídas, os planos de consulta e atualização armazenados no cache de procedimento são invalidados. Consultas subseqüentes usarão o novo índice.

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