Estruturas de índice não clusterizado

Os índices não clusterizados têm a mesma estrutura de árvore B que os índices clusterizados, com exceção das seguintes diferenças significativas:

  • As linhas de dados da tabela subjacente não são classificadas nem armazenadas em ordem com base nas suas chaves não clusterizadas.

  • A camada de folha de um índice não clusterizado é constituída de páginas de índice, em vez de páginas de dados.

Os índices não clusterizados podem ser definidos em uma tabela ou uma exibição com um índice clusterizado ou heap. Cada linha no índice não clusterizado contém o valor de chave não clusterizado e um localizador de linha. Esse localizador aponta para a linha de dados no índice clusterizado ou no heap que possui o valor de chave.

Os localizadores de linha, em linhas de índice não clusterizado, são um ponteiro para uma linha ou uma chave de índice clusterizado para uma linha, como descrito a seguir.

  • Se a tabela for um heap, ou seja, se não tiver um índice clusterizado, o localizador de linha será um ponteiro para a linha. O ponteiro é criado a partir do ID (identificador), do número da página e do número da linha na página do arquivo. O ponteiro inteiro é conhecido como RID (Identificação de Linha).

  • Se a tabela tiver um índice clusterizado, ou o índice estiver em uma exibição indexada, o localizador de linha será a chave de índice clusterizado da linha. Se o índice clusterizado não for um índice exclusivo, o SQL Server tornará quaisquer chaves duplicadas exclusivas ao adicionar um valor gerado internamente chamado indicador de exclusividade. Esse valor de quatro bytes não é visível aos usuários. Ele é adicionado somente quando há necessidade de tornar a chave clusterizada exclusiva para uso em índices não clusterizados. O SQL Server recupera a linha de dados pesquisando o índice clusterizado que usa a chave de índice clusterizado armazenada na linha de folha do índice não clusterizado.

Os índices não clusterizados têm uma linha em sys.partitions com index_id >0 para cada partição usada pelo índice. Por padrão, um índice não clusterizado tem uma única partição. Quando um índice não clusterizado tem várias partições, cada partição tem uma estrutura de árvore B que contém linhas de índice para aquela partição específica. Por exemplo, se um índice não clusterizado tiver quatro partições, haverá quatro estruturas de árvore B, uma em cada partição.

Dependendo dos tipos de dados no índice não clusterizado, cada estrutura de índice não clusterizado terá uma ou mais unidades de alocação para armazenar e gerenciar os dados de uma partição específica. No mínimo, cada índice não clusterizado terá uma unidade de alocação IN_ROW_DATA por partição que armazena as páginas de árvore B do índice. O índice não clusterizado também terá uma unidade de alocação LOB_DATA por partição se contiver colunas LOB (objetos grandes). Além disso, terá uma unidade de alocação ROW_OVERFLOW_DATA por partição se contiver colunas de comprimento variável que excedem o limite de tamanho de linha de 8.060 bytes. Para obter mais informações sobre unidades de alocação, consulte Organização de tabela e índice. As coleções de páginas da árvore B são ancoradas por ponteiros root_page na exibição do sistema sys.system_internals_allocation_units.

Observação importanteImportante

A exibição do sistema sys.system_internals_allocation_units é reservada somente para uso interno do Microsoft SQL Server. A compatibilidade futura não está garantida.

A ilustração a seguir mostra a estrutura de um índice não clusterizado em uma única partição.

Níveis de um índice não clusterizado

Índices de coluna incluídos

A funcionalidade de índices não clusterizados pode ser estendida adicionando colunas incluídas, chamadas colunas não-chave, ao nível folha do índice. Enquanto as colunas de chave são armazenadas em todos os níveis do índice não clusterizado, as colunas não-chave são armazenadas apenas no nível folha. Para obter mais informações, consulte Índice com colunas incluídas.