Partilhar via


Índices agrupados e não agrupados

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

Um índice é uma estrutura em disco associada a uma tabela ou exibição que acelera a recuperação de linhas da tabela ou exibição. Um índice contém chaves criadas a partir de uma ou mais colunas na tabela ou exibição. Essas chaves são armazenadas em uma estrutura (árvore B) que permite que o SQL Server localize a linha ou linhas associadas aos valores de chave de forma rápida e eficiente.

Note

A documentação usa o termo árvore B geralmente em referência a índices. Em índices de armazenamento em linha, o Mecanismo de Base de Dados implementa uma árvore B+. Isso não se aplica a índices de armazenamento em colunas ou a índices em tabelas com otimização de memória. Para obter mais informações, consulte o guia de arquitetura e design de índices do SQL Server e Azure SQL .

Uma tabela ou exibição pode conter os seguintes tipos de índices:

  • Clustered

    • Os índices agrupados classificam e armazenam as linhas de dados na tabela ou exibição com base em seus valores de chave. Esses valores-chave são as colunas incluídas na definição do índice. Pode haver apenas um índice clusterizado por tabela, porque as próprias linhas de dados podem ser armazenadas em apenas uma ordem.
    • A única vez que as linhas de dados em uma tabela são armazenadas em ordem ordenada é quando a tabela contém um índice clusterizado. Quando uma tabela tem um índice clusterizado, a tabela é chamada de tabela clusterizada. Se uma tabela não tiver nenhum índice clusterizado, suas linhas de dados serão armazenadas em uma estrutura não ordenada chamada heap.
  • Nonclustered

    • Os índices não agrupados têm uma estrutura separada das linhas de dados. Um índice não clusterizado contém os valores de chave de índice não clusterizados e cada entrada de valor de chave tem um ponteiro para a linha de dados que contém o valor da chave.

    • O ponteiro de uma linha de índice em um índice não clusterizado para uma linha de dados é chamado de localizador de linha. A estrutura do localizador de linhas depende se as páginas de dados são armazenadas em uma pilha ou em uma tabela clusterizada. Para uma pilha, um localizador de linha é um ponteiro para a linha. Para uma tabela clusterizada, o localizador de linha é a chave de índice clusterizada.

    • Você pode adicionar colunas não-chave ao nível folha do índice não clusterizado para ignorar os limites de chave de índice existentes e executar consultas totalmente cobertas. Para obter mais informações, consulte Criar índices com colunas incluídas. Para obter detalhes sobre limites de chave de índice, consulte Especificações de capacidade máxima para o SQL Server.

Os índices agrupados e não agrupados podem ser exclusivos. Com um índice exclusivo, nenhuma linha pode ter o mesmo valor para a chave de índice. Caso contrário, o índice não é exclusivo e várias linhas podem compartilhar o mesmo valor de chave. Para obter mais informações, consulte Criar um índice exclusivo.

Os índices são mantidos automaticamente para uma tabela ou exibição sempre que os dados da tabela são modificados.

Consulte Índices para obter mais tipos de índices para fins especiais.

Índices e restrições

O SQL Server cria automaticamente índices quando PRIMARY KEY e UNIQUE restrições são definidas em colunas de tabela. Por exemplo, quando você cria uma tabela com uma UNIQUE restrição, o Mecanismo de Banco de Dados cria automaticamente um índice não clusterizado. Se você configurar um PRIMARY KEY, o Mecanismo de Banco de Dados criará automaticamente um índice clusterizado, a menos que já exista um índice clusterizado. Quando você tenta impor uma PRIMARY KEY restrição em uma tabela existente e um índice clusterizado já existe nessa tabela, o SQL Server impõe a chave primária usando um índice não clusterizado.

Para obter mais informações, consulte Criar chaves primárias e Criar restrições exclusivas.

Como os índices são usados pelo otimizador de consulta

Índices bem projetados podem reduzir as operações de E/S de disco e consumir menos recursos do sistema. Portanto, esses índices melhoram o desempenho da consulta. Os índices podem ser úteis para várias consultas que contêm SELECT, UPDATE, DELETE ou MERGE declarações. Considere a consulta SELECT JobTitle, HireDate FROM HumanResources.Employee WHERE BusinessEntityID = 250 no banco de dados AdventureWorks2025. Quando essa consulta é executada, o otimizador de consulta avalia cada método disponível para recuperar os dados e seleciona o método mais eficiente. O método pode ser uma verificação de tabela ou pode estar verificando um ou mais índices, se eles existirem.

Durante uma verificação de tabela, o otimizador de consulta lê todas as linhas da tabela e extrai as linhas que atendem aos critérios da consulta. Uma verificação de tabela gera muitas operações de E/S de disco e pode exigir bastantes recursos. No entanto, uma verificação de tabela pode ser o método mais eficiente se, por exemplo, o conjunto de resultados da consulta for uma elevada percentagem de linhas da tabela.

Quando o otimizador de consulta usa um índice, ele pesquisa as colunas da chave de índice, localiza o local de armazenamento das linhas necessárias para a consulta e extrai as linhas correspondentes desse local. Geralmente, pesquisar o índice é muito mais rápido do que pesquisar a tabela. Ao contrário de uma tabela, um índice frequentemente contém muito poucas colunas por linha e as linhas estão em ordem ordenada.

O otimizador de consulta normalmente seleciona o método mais eficiente ao executar consultas. No entanto, se nenhum índice estiver disponível, o otimizador de consulta deve usar uma verificação de tabela. Sua tarefa é projetar e criar índices que sejam mais adequados ao seu ambiente para que o otimizador de consulta tenha uma seleção de índices eficientes a partir dos quais selecionar. O SQL Server fornece o Orientador de Otimização do Mecanismo de Banco de Dados para ajudar na análise do seu ambiente de banco de dados e na seleção dos índices apropriados.

Important

Para obter mais informações sobre diretrizes de design de índice e internas, consulte o guia de arquitetura e design de índice SQL do SQL Server e do Azure.