Índices clusterizados e não clusterizados descritosClustered and Nonclustered Indexes Described

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure nãoSQL Data Warehouse do Azure nãoParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Um índice é uma estrutura em disco associada a uma tabela ou exibição, que agiliza a recuperação das linhas de uma tabela ou exibição.An index is an on-disk structure associated with a table or view that speeds retrieval of rows from the table or view. Um índice contém chaves criadas de uma ou mais colunas da tabela ou exibição.An index contains keys built from one or more columns in the table or view. Essas chaves são armazenadas em uma estrutura (árvore B) que habilita o SQL ServerSQL Server a localizar a linha ou as linhas associadas aos valores de chave de forma rápida e eficaz.These keys are stored in a structure (B-tree) that enables SQL ServerSQL Server to find the row or rows associated with the key values quickly and efficiently.

Tabelas ou exibições podem conter os seguintes tipos de índices:A table or view can contain the following types of indexes:

  • ClusterizadoClustered

    •   Os índices clusterizados classificam e armazenam as linhas de dados da tabela ou exibição com base em seus valores de chave.Clustered indexes sort and store the data rows in the table or view based on their key values. Essas são as colunas incluídas na definição do índice.These are the columns included in the index definition. Pode haver apenas um índice clusterizado por tabela, pois as linhas de dados podem ser classificadas somente em uma única ordem.There can be only one clustered index per table, because the data rows themselves can be stored in only one order.  

    • O único momento em que as linhas de dados de uma tabela são armazenadas na ordem de classificação é quando a tabela contém um índice clusterizado.The only time the data rows in a table are stored in sorted order is when the table contains a clustered index. Se a tabela contiver um índice clusterizado, será denominada tabela clusterizada.When a table has a clustered index, the table is called a clustered table. Se a tabela não possuir nenhum índice clusterizado, suas linhas de dados ficarão armazenadas em uma estrutura não ordenada denominada heap.If a table has no clustered index, its data rows are stored in an unordered structure called a heap.

  • Não clusterizadoNonclustered

    • Os índices não clusterizados têm uma estrutura distinta das linhas de dados.Nonclustered indexes have a structure separate from the data rows. O índice não clusterizado contém os valores de chave de índice não clusterizado e cada entrada de valor de chave tem um ponteiro para a linha de dados que contém o valor de chave.A nonclustered index contains the nonclustered index key values and each key value entry has a pointer to the data row that contains the key value.

    • O ponteiro de uma linha de índice em um índice não clusterizado de uma linha de dados é denominado localizador de linhas.The pointer from an index row in a nonclustered index to a data row is called a row locator. A estrutura do localizador de linhas depende de as páginas de dados serem armazenadas em um heap ou em uma tabela clusterizada.The structure of the row locator depends on whether the data pages are stored in a heap or a clustered table. Para o heap, o localizador de linhas é um ponteiro para a linha.For a heap, a row locator is a pointer to the row. Para a tabela clusterizada, o localizador de linhas é a chave de índice clusterizado.For a clustered table, the row locator is the clustered index key.

    • Você pode adicionar colunas não chave ao nível folha do índice não clusterizado para ignorar os limites de chave de índice existente e executar consultas completamente abrangidas e indexadas.You can add nonkey columns to the leaf level of the nonclustered index to by-pass existing index key limits, and execute fully covered, indexed, queries. Para obter mais informações, consulte Create Indexes with Included Columns.For more information, see Create Indexes with Included Columns. Para obter detalhes sobre os limites do índice de chave, consulte Especificações de capacidade máxima do SQL Server.For details about index key limits see Maximum Capacity Specifications for SQL Server.

Tanto os índices clusterizados quanto os não clusterizados podem ser exclusivos.Both clustered and nonclustered indexes can be unique. Isso significa que duas linhas não podem ter o mesmo valor que a chave de índice.This means no two rows can have the same value for the index key. Caso contrário, o índice não será exclusivo e várias linhas poderão compartilhar o mesmo valor de chave.Otherwise, the index is not unique and multiple rows can share the same key value. Para obter mais informações, confira Criar índices exclusivos.For more information, see Create Unique Indexes.

Os índices são mantidos automaticamente para uma tabela ou exibição sempre que os dados da tabela são modificados.Indexes are automatically maintained for a table or view whenever the table data is modified.

Veja Índices para obter mais tipos de índices de uso geral.See Indexes for additional types of special purpose indexes.

Índices e restriçõesIndexes and Constraints

Os índices são criados automaticamente quando as restrições PRIMARY KEY e UNIQUE são definidas em colunas de tabelas.Indexes are automatically created when PRIMARY KEY and UNIQUE constraints are defined on table columns. Por exemplo, quando você criar uma tabela com uma restrição UNIQUE, Mecanismo de Banco de DadosDatabase Engine criará automaticamente um índice não clusterizado.For example, when you create a table with a UNIQUE constraint, Mecanismo de Banco de DadosDatabase Engine automatically creates a non-clustered index. Se você configurar uma PRIMARY KEY, Mecanismo de Banco de DadosDatabase Engine criará automaticamente um índice clusterizado, a menos que já exista um.If you configure a PRIMARY KEY, Mecanismo de Banco de DadosDatabase Engine automatically creates a clustered index, unless a clustered index already exists. Quando você tentar impor uma restrição PRIMARY KEY em uma tabela existente e já houver um índice clusterizado nessa tabela, o SQL Server irá impor a chave primária usando um índice não clusterizado.When you try to enforce a PRIMARY KEY constraint on an existing table and a clustered index already exists on that table, SQL Server enforces the primary key using a nonclustered index.

Para obter mais informações, veja Criar chaves primárias e Criar restrições exclusivas.For more information, see Create Primary Keys and Create Unique Constraints.

Como os índices são usados pelo Otimizador de ConsultaHow Indexes are used by the Query Optimizer

Índices bem projetados podem reduzir as operações de E/S de disco e consumir menos recursos de sistema, aprimorando o desempenho das consultas.Well-designed indexes can reduce disk I/O operations and consume fewer system resources therefore improving query performance. Os índices podem ser úteis para uma série de consultas que contêm instruções SELECT, UPDATE, DELETE ou MERGE.Indexes can be helpful for a variety of queries that contain SELECT, UPDATE, DELETE, or MERGE statements. Considere a consulta SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250 no banco de dados AdventureWorks2012AdventureWorks2012 .Consider the query SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250 in the AdventureWorks2012AdventureWorks2012 database. Quando essa consulta é executada, o otimizador de consulta avalia cada método disponível para recuperar os dados e seleciona o mais eficaz.When this query is executed, the query optimizer evaluates each available method for retrieving the data and selects the most efficient method. O método pode ser uma verificação de tabela ou verificação de um ou mais índices, se houver.The method may be a table scan, or may be scanning one or more indexes if they exist.

Ao executar uma verificação de tabela, o otimizador de consulta lê todas as linhas da tabela e extrai as linhas que atendem os critérios da consulta.When performing a table scan, the query optimizer reads all the rows in the table, and extracts the rows that meet the criteria of the query. Uma verificação de tabela gera várias operações de E/S de disco e pode utilizar muitos recursos.A table scan generates many disk I/O operations and can be resource intensive. No entanto, a verificação de tabela poderá ser o método mais eficaz se, por exemplo, o conjunto de resultados da consulta contiver um alto percentual de linhas da tabela.However, a table scan could be the most efficient method if, for example, the result set of the query is a high percentage of rows from the table.

Quando o otimizador de consulta utiliza um índice, ele pesquisa as colunas de chave do índice, encontra o local de armazenamento das linhas necessárias à consulta e extrai as linhas que correspondem àquele local.When the query optimizer uses an index, it searches the index key columns, finds the storage location of the rows needed by the query and extracts the matching rows from that location. Em geral, fazer pesquisas no índice é muito mais rápido do que na tabela, porque diferentemente da tabela, o índice contém, com frequência, poucas colunas por linha e as linhas ficam na ordem de classificação.Generally, searching the index is much faster than searching the table because unlike a table, an index frequently contains very few columns per row and the rows are in sorted order.

Normalmente, o otimizador de consulta seleciona o método mais eficaz ao executar consultas.The query optimizer typically selects the most efficient method when executing queries. No entanto, se não houver índices disponíveis, o otimizador de consulta precisará usar uma verificação de tabela.However, if no indexes are available, the query optimizer must use a table scan. Sua tarefa é criar índices mais adequados ao seu ambiente, para que o otimizador de consulta tenha uma seleção de índices eficientes da qual selecionar.Your task is to design and create indexes that are best suited to your environment so that the query optimizer has a selection of efficient indexes from which to select. SQL ServerSQL Server fornece o Orientador de Otimização do Mecanismo de Banco de Dados para ajudar com a análise de seu ambiente de banco de dados e na seleção de índices apropriados.provides the Database Engine Tuning Advisor to help with the analysis of your database environment and in the selection of appropriate indexes.

Importante

Para obter mais informações sobre as diretrizes de design de índice e operações internas, consulte o Guia de design de índice do SQL Server.For more information about index design guidelines and internals, refer to the SQL Server Index Design Guide.

Guia de criação de índice do SQL Server SQL Server Index Design Guide
Criar índices clusterizadosCreate Clustered Indexes
Criar índices não clusterizadosCreate Nonclustered Indexes