Diretrizes de design de índices clusterizados

Os índices clusterizados classificam e armazenam as linhas de dados da tabela com base em seus valores de chave. Pode haver apenas um índice clusterizado por tabela, porque as próprias linhas de dados podem ser classificadas apenas em uma única ordem. Para obter mais informações sobre a arquitetura de índices clusterizados, consulte Estruturas de índice clusterizado.

Com poucas exceções, toda tabela deveria ter um índice clusterizado definido na coluna ou colunas, o qual proporciona o seguinte:

  • Pode ser usado para consultas freqüentemente usadas.

  • Oferece um alto grau de singularidade.

    ObservaçãoObservação

    Quando você cria uma restrição PRIMARY KEY, um índice exclusivo na coluna, ou colunas, é criado automaticamente. Por padrão, esse índice é clusterizado. Porém, você pode especificar um índice não-clusterizado ao criar a restrição.

  • Pode ser usado em consultas de intervalo.

Se o índice clusterizado não for criado com a propriedade UNIQUE, o Mecanismo de Banco de Dados acrescentará uma coluna uniqueifier de 4 bytes automaticamente à tabela. Quando necessário, o Mecanismo de Banco de Dados acrescenta um valor uniqueifier automaticamente a uma linha para tornar cada chave exclusiva. Essa coluna e seus valores são usados internamente e não podem ser vistos ou avaliados por usuários.

Considerações sobre consultas

Antes de criar índices clusterizados, entenda como seus dados serão acessados. Considere utilizar um índice clusterizado para consultas que façam o seguinte:

  • Retornam um intervalo de valores usando os operadores como BETWEEN >, >= < e <=.

    Depois que a linha com o primeiro valor for encontrada usando o índice clusterizado, garante-se que as linhas com valores indexados subseqüentes estejam fisicamente adjacentes. Por exemplo, se uma consulta recuperar registros entre um intervalo de números de ordem de vendas, um índice clusterizado na coluna SalesOrderNumber poderá localizar rapidamente a linha que contém o número de ordem de vendas inicial e em seguida recuperará todas as linhas sucessivas na tabela, até que o último número de ordem de vendas seja alcançado.

  • Retornam grandes conjuntos de resultados.

  • Use cláusulas JOIN. Normalmente elas são colunas de chave estrangeira.

  • Use cláusulas ORDER BY ou GROUP BY.

    Um índice nas colunas especificadas na cláusula ORDER BY ou GROUP BY pode eliminar a necessidade de o Mecanismo de Banco de Dados classificar os dados, pois as linhas já estão classificadas. Isso melhora o desempenho da consulta.

Considerações sobre colunas

Geralmente, você deve definir a chave de índice clusterizado com o menor número de colunas possível. Considere colunas que tenham um ou mais dos seguintes atributos:

  • Sejam exclusivas ou contenham muitos valores distintos

    Por exemplo, uma ID de funcionário identifica os funcionários de maneira exclusiva. Um índice clusterizado ou restrição PRIMARY KEY na coluna EmployeeID melhoraria o desempenho de consultas que pesquisam informações de funcionário com base no número de ID do funcionário. Como alternativa, um índice clusterizado poderia ser criado em LastName, FirstName, MiddleName porque os registros dos funcionários são agrupados e consultados freqüentemente dessa maneira e a combinação dessas colunas ainda ofereceria um grau alto de diferença.

  • Sejam acessadas seqüencialmente

    Por exemplo, um ID de produto identifica produtos de maneira exclusiva na tabela Production.Product no banco de dados AdventureWorks2008R2. Consultas nas quais uma pesquisa seqüencial seja especificada, tais como WHERE ProductID BETWEEN 980 and 999, se beneficiariam de um índice clusterizado em ProductID. Isso ocorre porque as linhas seriam armazenadas em ordem classificada nessa coluna de chave.

  • Definido como IDENTITY porque a coluna é garantida como sendo exclusiva dentro da tabela.

  • Freqüentemente usado para classificar os dados recuperados de uma tabela.

    Pode ser uma boa idéia agrupar, ou seja, classificar fisicamente, a tabela nessa coluna para economizar o custo de uma operação de classificação toda vez que a coluna for consultada.

Índices clusterizados não são uma boa escolha para os seguintes atributos:

  • Colunas que sofrem mudanças freqüentes

    Isso faz com que uma fila inteira se mova, pois o Mecanismo de Banco de Dados deve manter os valores de dados de uma linha em ordem física. Essa é uma consideração importante em sistemas de processamento de transações de alto volume nos quais os dados sejam normalmente voláteis.

  • Chaves largas

    Chaves largas são uma combinação de várias colunas ou de várias colunas de tamanho grande. Os valores de chave do índice clusterizado são usados por todos os índices não-clusterizados como chaves de pesquisa. Qualquer índice não-clusterizado definido na mesma tabela será significativamente maior porque as entradas de índice não-clusterizado contêm a chave de clustering e também as colunas de chave definidas para aquele índice não-clusterizado.

Opções de índice

Há várias opções de índice que podem ser especificadas quando você cria um índice clusterizado. Como os índices clusterizados são normalmente bastante grandes, você deve considerar com atenção as seguintes opções:

  • SORT_IN_TEMPDB

  • DROP_EXISTING

  • FILLFACTOR

  • ONLINE

Para obter mais informações, consulte Configurando opções de índice.