You are on page 1of 18

Guia de criao de ndice do SQL Server

http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx

Este artigo foi traduzido manualmente. Coloque o ponteiro do mouse sobre as frases do
artigo para ver o texto original. Mais informaes.

Traduo

Original

Guia de criao de ndice do SQL Server


SQL Server 2012

Este tpico ainda no foi avaliado como

Os ndices criados inadequadamente e a falta de ndices so as principais fontes de afunilamentos do aplicativo de banco de
dados. A criao eficiente de ndices muito importante para alcanar um bom desempenho de banco de dados e de
aplicativo. Este guia de criao de ndice do SQL Server contm informaes e prticas recomendadas para ajudar voc a criar
ndices efetivos para atender s necessidades de seu aplicativo.
Aplica-se a: SQL Server 2005 a SQL Server 2012, a menos que indicado em contrrio.
Este guia presume que o leitor tenha uma compreenso geral dos tipos de ndices disponveis no SQL Server. Para obter uma
descrio geral dos tipos de ndices, consulte Tipos de ndice.

Neste guia
Noes bsicas sobre criao de ndice
Diretrizes para criao de ndice geral
Diretrizes de design de ndices clusterizados
Diretrizes de criao de ndice no clusterizado
Diretrizes de design de ndice exclusivo
Diretrizes de criao de ndice filtrado
Leitura adicional

Noes bsicas sobre criao de ndice


Um ndice uma estrutura em disco associada a uma tabela ou exibio, que agiliza a recuperao das linhas de uma tabela
ou exibio. Um ndice contm chaves criadas de uma ou mais colunas da tabela ou exibio. Essas chaves so armazenadas
em uma estrutura (rvore B) que habilita o SQL Server a localizar a linha ou as linhas associadas aos valores de chave de
forma rpida e eficaz.
A seleo dos ndices certos para um banco de dados e sua carga de trabalho um ato de balanceamento complexo entre a
velocidade de consulta e o custo de atualizao. ndices limitados ou com poucas colunas na chave de ndice exigem menos
espao em disco e sobrecarga de manuteno. Por outro lado, ndices amplos cobrem mais consultas. Talvez voc precise
experimentar vrios projetos diferentes antes de encontrar o ndice mais eficiente. Os ndices podem ser adicionados,
modificados e descartados sem afetar o esquema de banco de dados ou o design do aplicativo. Portanto, voc no deve
hesitar em experimentar ndices diferentes.
O otimizador de consulta no SQL Server escolhe o ndice mais eficaz de forma confivel na grande maioria dos casos. Sua
estratgia geral de criao de ndice deveria fornecer uma variedade de opes de ndices para o otimizador de consulta
escolher e confiar durante a tomada de deciso correta. Isso reduz o tempo de anlise e atinge um bom desempenho em
vrias situaes. Para consultar quais ndices o otimizador de consulta usa em uma consulta especfica, no SQL Server
Management Studio, no menu Consulta, selecione Incluir Plano de Execuo Real.
No equipare sempre o uso de ndice com bom desempenho e bom desempenho com uso de ndice eficiente. Se o uso de
um ndice sempre ajudasse a produzir o melhor desempenho, a tarefa do otimizador de consulta seria simples. Na realidade,
a escolha incorreta de um ndice pode causar um desempenho insatisfatrio. Portanto, a tarefa do otimizador de consulta
selecionar um ndice ou uma combinao de ndices apenas quando isso gerar melhoria de desempenho e evitar a

1 de 18

21/09/2014 09:39

Guia de criao de ndice do SQL Server

2 de 18

http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx

recuperao indexada quando isso atrapalhar o desempenho.

Tarefas de criao de ndice


As seguintes tarefas compem a estratgia recomendada para criao de ndices:

1. Entenda as caractersticas do banco de dados. Por exemplo, trata-se de um banco de dados OLTP (transao online)
com modificaes frequentes de dados, um DSS (sistema de apoio deciso) ou um banco de dados OLAP de data
warehouse que contm principalmente dados somente leitura e deve processar conjuntos de dados muito grandes
rapidamente. No SQL Server 2012, o columnstore xVelocity de memria otimizada especialmente apropriado para
conjuntos de dados de data warehouse tpicos. Os ndices columnstore podem transformar a experincia com data
warehouse para usurios proporcionando um desempenho mais rpido para consultas de data warehouse comuns,
como filtragem, agregao, agrupamento ou consultas de juno em estrela. Para obter mais informaes, consulte
ndices columnstore.
2. Entenda as caractersticas das consultas mais usadas. Por exemplo, saber que uma consulta usada frequentemente
associa duas ou mais tabelas o ajudar a determinar o melhor tipo de ndice a ser usado.
3. Entenda as caractersticas das colunas usadas nas consultas. Por exemplo, um ndice ideal para colunas que tenham
um tipo de dados de inteiro e, tambm, colunas exclusivas ou no nulas. Para colunas que tm subconjuntos bem
definido de dados, possvel usar um ndice filtrado no SQL Server 2008 e verses posteriores. Para obter mais
informaes, consulte Diretrizes de criao de ndice filtrado neste guia.
4. Determine quais opes de ndice poderiam aumentar o desempenho na criao ou manuteno do ndice. Por
exemplo, a criao de um ndice clusterizado em uma tabela grande existente se beneficiaria da opo de ndice
ONLINE. A opo ONLINE permite que atividade simultnea nos dados subjacentes continue enquanto o ndice est
sendo criado ou reconstrudo. Para obter mais informaes, consulte Opes Set Index.
5. Determine o melhor local de armazenamento para o ndice. Um ndice no clusterizado pode ser armazenado no
mesmo grupo de arquivos que a tabela subjacente ou em um grupo de arquivos diferente. O local de
armazenamento de ndices pode melhorar o desempenho de consulta aumentando desempenho de E/S do disco.
Por exemplo, o armazenamento de um ndice no clusterizado em um grupo de arquivos que est em um disco
diferente do grupo de arquivos de tabela pode melhorar o desempenho porque vrios discos podem ser lidos ao
mesmo tempo.
Alternativamente, os ndices clusterizados e no clusterizados podem usar um esquema de partio em vrios grupos
de arquivos. O particionamento facilita o gerenciamento de tabelas ou ndices grandes permitindo o acesso ou o
gerenciamento de subconjuntos de dados de forma rpida e eficaz, enquanto mantm a integridade geral da
coleo. Para obter mais informaes, consulte Tabelas e ndices particionados. Quando voc pensar em
particionamento, determine se o ndice deve ser alinhado; isto , particionado essencialmente da mesma maneira
que a tabela ou particionado de forma independente.

Diretrizes para criao de ndice geral


Administradores de banco de dados experientes podem projetar um bom conjunto de ndices, mas essa tarefa muito
complexa, demorada e propensa a erros at mesmo para bancos de dados e cargas de trabalho moderadamente
complexos. Compreender as caractersticas de seu banco de dados, consultas e colunas de dados pode lhe ajudar a projetar
ndices melhores.

Consideraes sobre banco de dados


Quando voc projeta um ndice, considere as seguintes diretrizes para banco de dados:

Nmeros grandes de ndices em uma tabela afetam o desempenho das instrues INSERT, UPDATE, DELETE e MERGE
porque todos os ndices precisam ser ajustados adequadamente medida que os dados so alterados na tabela. Por
exemplo, se uma coluna for usada em vrios ndices e voc executar uma instruo UPDATE que modifica os dados
dessa coluna, cada ndice que contm essa coluna dever ser atualizado, bem como a coluna na tabela base
subjacente (heap ou ndice clusterizado).
Evite tabelas fortemente atualizadas em cima desindexaes e mantenha os ndices estreitos, ou seja, com o

21/09/2014 09:39

Guia de criao de ndice do SQL Server

3 de 18

http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx

mnimo de colunas possvel.


Use muitos ndices para aperfeioar o desempenho da consulta em tabelas com baixos requisitos de
atualizao, mas com grandes volumes de dados. Grandes nmeros de ndices podem ajudar o desempenho
de consultas que no modificam dados, como instrues SELECT, porque o otimizador de consulta tem mais
ndices para escolher para determinar o mtodo de acesso mais rpido.
Indexar tabelas pequenas pode no ser bom porque pode fazer o otimizador de consulta levar mais tempo para
atravessar o ndice procurando dados do que executar uma simples varredura de tabela. Portanto, os ndices em
tabelas pequenas talvez nunca sejam usados, mas ainda devem ser mantidos como dados nas alteraes de tabela.
ndices em exibies pode prover ganhos de desempenho significantes quando a exibio contiver agregaes,
junes de tabela ou uma combinao de agregaes e junes. A exibio no precisa estar explicitamente
referenciada na consulta para o otimizador de consulta us-la.
Use o Orientador de Otimizao do Mecanismo de Banco de Dados para analisar seu banco de dados e fazer
recomendaes de ndice. Para obter mais informaes, consulte Orientador de Otimizao do Mecanismo de Banco
de Dados.

Consideraes sobre consultas


Quando voc projeta um ndice, considere as seguintes diretrizes para consultas:

Crie ndices no clusterizados nas colunas frequentemente usadas em predicados e condies de juno em
consultas. No entanto, evite adicionar colunas desnecessrias. Acrescentar muitas colunas de ndice pode afetar
adversamente o espao em disco e o desempenho de manuteno de ndice.
Cobrindo ndices pode melhorar desempenho de consulta porque todos os dados precisaram satisfazer os requisitos
da consulta existe dentro do prprio ndice. Ou seja, apenas as pginas de ndice, e no as pginas de dados da
tabela ou do ndice clusterizado, so necessrias para recuperar os dados solicitados, portanto reduzindo as
operaes de E/S gerais do disco. Por exemplo, uma consulta de colunas a e b em uma tabela que tem um ndice
composto criado em colunas a, b e c pode recuperar os dados especificados somente do ndice.
Escreva consultas que insiram ou modifiquem o mximo de filas possvel em uma nica instruo, em vez de usar
consultas mltiplas para atualizar essas mesmas filas. Ao usar apenas uma instruo, pode-se explorar uma
manuteno otimizada do ndice.
Avalie o tipo da consulta e como as colunas so usadas na consulta. Por exemplo, uma coluna usada em uma
consulta de correspondncia exata seria uma boa candidata para um ndice clusterizado ou no clusterizado.

Consideraes sobre colunas


Quando voc projeta um ndice, considere as seguintes diretrizes para as colunas:

Mantenha o comprimento da chave de ndice curto para os ndices clusterizados. Alm disso, os ndices clusterizados
se beneficiam de serem criados em colunas exclusivas ou no nulas.
As colunas que forem do tipo de dados ntext, text, image, varchar(max), nvarchar(max), e varbinary(max) no
podem ser especificadas como colunas de chave de ndice. Entretanto, os tipos de dados, varchar(max),
nvarchar(max), varbinary(max), e xml podem participar em um ndice no clusterizados como colunas de ndice
no chave. Para obter mais informaes, consulte a seo 'ndice com colunas includas' neste guia.
Um tipo de dados xml s pode ser uma coluna de chave em um ndice XML. Para obter mais informaes, consulte
ndices XML (SQL Server). O SQL Server 2012 SP1 apresenta um novo tipo de ndice XML conhecido como um ndice
XML seletivo. Esse novo ndice pode melhorar o desempenho da consulta dos dados armazenados como XML no
SQL Server, permitir uma indexao muito mais rpida de cargas de trabalho de dados XML grandes e melhorar a
escalabilidade ao reduzir os custos de armazenamento do prprio ndice. Para obter mais informaes, consulte SXI
(ndices XML seletivos).
Examine a singularidade da coluna. Um ndice exclusivo em vez de um ndice no exclusivo na mesma combinao
de colunas, prov informaes adicional para o otimizador de consulta, o que torna o ndice mais til. Para obter
mais informaes, consulte Diretrizes de design de ndice exclusivo neste guia.

21/09/2014 09:39

Guia de criao de ndice do SQL Server

4 de 18

http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx

Examine a distribuio de dados na coluna. Frequentemente, uma consulta longa causada ao se indexar uma
coluna com poucos valores exclusivos, ou ao executar uma juno em tal coluna. Isto um problema fundamental
com dados e consulta, e geralmente no pode ser resolvido sem identificar esta situao. Por exemplo, uma lista
telefnica fsica ordenada alfabeticamente pelo ltimo nome no ser rpida em localizar uma pessoa, se todas as
pessoas na cidade tiverem nomes de Smith ou Jones. Para obter mais informaes sobre distribuio de dados,
consulte Estatsticas.
Considere o uso de ndices filtrados em colunas com subconjuntos bem definidos, por exemplo, colunas esparsas,
colunas com grande a maioria dos valores NULL, colunas com categorias de valores e colunas com intervalos
diferentes de valores. Um ndice filtrado bem projetado pode melhorar o desempenho da consulta e reduzir os
custos de manuteno de ndice e de armazenamento.
Considere a ordem das colunas se o ndice contiver colunas mltiplas. A coluna usada na clusula WHERE em uma
igual a (=), maior que (>), menor que (<), ou critrio de consulta BETWEEN, ou se participar em uma juno, deve ser
usada primeiro. Colunas adicionais devem ser ordenadas com base em seu nvel de distino, ou seja, do mais
distinto ao menos distinto.
Por exemplo, se o ndice for definido como LastName, FirstName o ndice ser til quando o critrio de consulta for
WHERE LastName = 'Smith' ou WHERE LastName = Smith AND FirstName LIKE 'J%'. Porm, o otimizador de
consulta no usaria o ndice para uma consulta que tivesse pesquisado apenas em FirstName (WHERE FirstName
= 'Jane').
Considere indexar as colunas computadas. Para obter mais informaes, consulte ndices em colunas computadas.

Caractersticas do ndice
Depois de ter determinado que um ndice apropriado para uma consulta, voc pode selecionar o tipo de ndice que
melhor se adque a sua situao. Caractersticas de ndice incluem o seguinte:

Clusterizado X no clusterizado.
Exclusivo X no exclusivo
nica coluna X multicoluna
Ordem crescente ou decrescente em colunas no ndice
Tabela completa versus filtrada para ndices no clusterizados

Voc tambm pode personalizar as caractersticas de armazenamento inicial do ndice para aperfeioar seu desempenho ou
manuteno definindo uma opo como FILLFACTOR. Alm disso, voc pode determinar o local de armazenamento de
ndice usando grupos de arquivos ou esquemas de partio para aperfeioar o desempenho.

Posio do ndice em grupos de arquivos ou esquemas de partio


medida que desenvolve sua estratgia de design de ndices, considere a colocao dos ndices nos grupos de arquivos
associados ao banco de dados. A seleo cuidadosa do grupo de arquivos ou esquema de partio pode melhorar o
desempenho da consulta.
Por padro, os ndices so armazenados no mesmo grupo de arquivos que a tabela base na qual o ndice criado. Um
ndice cluster no particionado e a tabela base sempre residem no mesmo grupo de arquivos. No entanto, voc pode fazer
o seguinte:

Crie ndices no clusterizados em um grupo de arquivos diferente do grupo de arquivos da tabela base ou do ndice
clusterizado.
Particione ndices cluster e no cluster para que ocupem vrios grupos de arquivos.
Mova uma tabela de um grupo de arquivos para outro descartando o ndice cluster e especificando um novo grupo
de arquivos ou esquema de partio na clusula MOVE TO da instruo DROP INDEX ou usando a instruo CREATE
INDEX com a clusula DROP_EXISTING.

21/09/2014 09:39

Guia de criao de ndice do SQL Server

http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx

Ao criar o ndice no cluster em um grupo de arquivos diferente, voc pode obter ganhos de desempenho se os grupos de
arquivos estiverem usando unidades fsicas diferentes com seus prprios controladores. As informaes de ndices e de
dados podem ser lidas em paralelo pelas vrias cabeas de disco. Por exemplo, se Table_A no grupo de arquivos f1 e
Index_A no grupo de arquivos f2 estiverem ambos sendo usados pela mesma consulta, podem-se obter ganhos de
desempenho porque os dois grupos de arquivos esto sendo completamente usados sem conteno. Porm, se Table_A
for verificado pela consulta, mas Index_A no for referenciado, apenas o grupo de arquivos f1 ser usado. Isso no cria
nenhum ganho de desempenho.
Como voc no pode prever que tipo de acesso acontecer e quando ocorrer, pode ser prefervel distribuir suas tabelas e
ndices por todos os grupos de arquivos. Isso garantir que todos os discos estejam sendo acessados, pois todos os dados e
ndices estaro distribudos igualmente por todos os discos, independentemente da maneira como os dados sejam
acessados. Essa tambm uma abordagem mais simples para os administradores do sistema.

Parties em vrios grupos de arquivos


Voc tambm pode considerar o particionamento de ndices cluster e no cluster em vrios grupos de arquivos. Os ndices
particionados so particionados horizontalmente, ou por linha, com base na funo de uma partio. A funo da partio
define como cada linha mapeada para um conjunto de parties, com base nos valores de certas colunas, chamadas
colunas de particionamento. Um esquema de partio especifica o mapeamento das parties para um conjunto de grupos
de arquivos.
O particionamento de um ndice pode proporcionar os seguintes benefcios:

Proporcionar sistemas evolutivos que tornam grandes ndices mais gerenciveis. Sistemas OLTP, por exemplo, podem
implementar aplicativos que reconhecem partio que tratam de ndices grandes.
Fazer as consultas serem executadas de maneira mais rpida e eficiente. Quando as consultas acessarem vrias
parties de um ndice, o otimizador de consulta pode processar parties individuais ao mesmo tempo e pode
excluir parties que no sejam afetadas pela consulta.

Para obter mais informaes, consulte Tabelas e ndices particionados.

Diretrizes de criao de ordem de classificao de ndice


Ao definir ndices, confirme se os dados da coluna de chave de ndice devero ser armazenados em ordem crescente ou
decrescente. Ordem crescente o padro e assegura a compatibilidade com as verses anteriores do SQL Server. A sintaxe
das instrues CREATE INDEX, CREATE TABLE e ALTER TABLE d suporte s palavras-chave ASC (crescente) e DESC
(decrescente) em colunas individuais de ndices e restries.
A especificao da ordem de armazenamento dos valores de chave em um ndice til quando as consultas que fazem
referncia tabela contm clusulas ORDER BY que especificam direcionamentos diferentes para a coluna de chave ou as
colunas daquele ndice. Nesses casos, o ndice pode eliminar a necessidade de um operador SORT no plano de consulta, o
que torna a consulta mais eficaz. Por exemplo, os compradores do departamento de compras da Ciclos da Adventure Works
devem avaliar a qualidade dos produtos que adquirem de fornecedores. Os compradores esto mais interessados em
localizar os produtos enviados por esses fornecedores, e que tm alta taxa de rejeio. Como demonstrado pela consulta a
seguir, recuperar os dados para atender esses critrios requer que a coluna RejectedQty da tabela
Purchasing.PurchaseOrderDetail seja classificada em ordem decrescente (do maior para o menor) e que a coluna
ProductID seja classificada em ordem crescente (do menor para o maior).

SELECT RejectedQty, ((RejectedQty/OrderQty)*100) AS RejectionRate,


ProductID, DueDate
FROM Purchasing.PurchaseOrderDetail
ORDER BY RejectedQty DESC, ProductID ASC;

O plano de execuo a seguir, dessa consulta, mostra que o otimizador de consultas usou um operador SORT para retornar
o conjunto de resultados na ordem especificada pela clusula ORDER BY.

5 de 18

21/09/2014 09:39

Guia de criao de ndice do SQL Server

http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx

Se um ndice for criado com colunas de chave correspondentes s da clusula ORDER BY da consulta, o operador SORT
poder ser eliminado do plano de consulta, e este se tornar mais eficaz.

CREATE NONCLUSTERED INDEX IX_PurchaseOrderDetail_RejectedQty


ON Purchasing.PurchaseOrderDetail
(RejectedQty DESC, ProductID ASC, DueDate, OrderQty);

Depois que a consulta for novamente executada, o plano de execuo a seguir mostra que o operador SORT foi eliminado e
que o ndice no clusterizado recentemente criado utilizado.

O Mecanismo de Banco de Dados pode se mover para qualquer direo de forma igualmente eficaz. Um ndice definido
como (RejectedQty DESC, ProductID ASC) ainda pode ser usado em uma consulta na qual a direo de classificao
das colunas da clusula ORDER BY invertida. Por exemplo, uma consulta com a clusula ORDER BY ORDER BY
RejectedQty ASC, ProductID DESC pode utilizar o ndice.
A ordem de classificao s pode ser especificada para colunas de chave. A exibio de catlogo sys.index_columns e a
funo INDEXKEY_PROPERTY relatam se a coluna de ndice est armazenada em ordem crescente ou decrescente.
[Incio]

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 prprias linhas de dados podem ser classificadas apenas em uma
nica ordem. Com poucas excees, toda tabela deveria ter um ndice clusterizado definido na coluna ou colunas, o qual
proporciona o seguinte:

Pode ser usado para consultas frequentemente usadas.


Oferece um alto grau de singularidade.
Observao
Quando voc cria uma restrio PRIMARY KEY, um ndice exclusivo na coluna, ou colunas, criado
automaticamente. Por padro, esse ndice cluster. Porm, voc pode especificar um ndice no clusterizado ao
criar a restrio.
Pode ser usado em consultas de intervalo.

Se o ndice clusterizado no for criado com a propriedade UNIQUE, o Mecanismo de Banco de Dados acrescentar uma
coluna de indicador de exclusividade de 4 bytes automaticamente tabela. Quando necessrio, o Mecanismo de Banco de
Dados acrescenta um valor de indicador de exclusividade automaticamente a uma linha para tornar cada chave exclusiva.
Essa coluna e seus valores so usados internamente e no podem ser vistos ou avaliados por usurios.

Arquitetura de ndice clusterizado


No SQL Server, os ndices so organizados como rvores B. Cada pgina em uma rvore B de ndice chamada de n do

6 de 18

21/09/2014 09:39

Guia de criao de ndice do SQL Server

7 de 18

http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx

ndice. O n superior da rvore B chamado de n raiz. Os ns inferiores no ndice so chamados de ns folha. Quaisquer
nveis de ndice entre os ns raiz e folha so coletivamente conhecidos como nveis intermedirios. Em um ndice
clusterizado, os ns folha contm as pginas de dados da tabela subjacente. Os ns de nvel intermedirio e raiz contm
pginas de ndice com linhas de ndice. Cada linha de ndice contm um valor de chave e um ponteiro para uma pgina de
nvel de intermedirio na rvore B ou uma linha de dados no nvel folha do ndice. As pginas de cada nvel do ndice so
vinculadas a uma lista vinculada duas vezes.
ndices clusterizados tm uma linha em sys.partitions, com index_id = 1 para cada particionamento usado pelo ndice. Por
padro, um ndice clusterizado tem um nico particionamento. Quando um ndice clusterizado tem particionamentos
mltiplos, cada particionamento tem uma estrutura de rvore B que contm os dados para aquele particionamento
especfico. Por exemplo, se um ndice clusterizado tiver quatro particionamentos, haver quatro estruturas de rvore B; uma
em cada particionamento.
Dependendo dos tipos de dados no ndice clusterizado, cada estrutura de ndice clusterizado ter uma ou mais unidades de
alocao para armazenar e gerenciar os dados de um particionamento especfico. No mnimo, cada ndice clusterizado ter
uma unidade de alocao IN_ROW_DATA por particionamento. O ndice clusterizado tambm ter uma unidade de alocao
LOB_DATA por particionamento se contiver colunas LOB (objetos grandes). Tambm ter uma unidade de alocao
ROW_OVERFLOW_DATA por particionamento se tiver colunas de comprimento varivel excedendo o limite de tamanho de
linha de 8.060 bytes.
As pginas da cadeia de dados e as linhas so classificadas pelo valor da chave de ndice clusterizado. Todas as inseres
so feitas no ponto em que o valor de chave da linha inserida se ajusta sequncia de classificao entre as linhas
existentes.
Esta ilustrao mostra a estrutura de um ndice clusterizado em um nico particionamento.

Consideraes sobre consultas


Antes de criar ndices clusterizados, entenda como seus dados sero acessados. Considere utilizar um ndice clusterizado
para consultas que faam 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 cluster, garante-se que as linhas com valores
indexados subsequentes estejam fisicamente adjacentes. Por exemplo, se uma consulta recuperar registros entre um
intervalo de nmeros de ordem de vendas, um ndice clusterizado na coluna SalesOrderNumber poder localizar

21/09/2014 09:39

Guia de criao de ndice do SQL Server

http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx

rapidamente a linha que contm o nmero de ordem de vendas inicial e em seguida recuperar todas as linhas
sucessivas na tabela, at que o ltimo nmero de ordem de vendas seja alcanado.
Retornam grandes conjuntos de resultados.
Use clusulas JOIN. Normalmente elas so colunas de chave estrangeira.
Use clusulas ORDER BY ou GROUP BY.
Um ndice nas colunas especificadas na clusula ORDER BY ou GROUP BY pode eliminar a necessidade de o
Mecanismo de Banco de Dados classificar os dados, pois as linhas j esto classificadas. Isso melhora o desempenho
da consulta.

Consideraes sobre colunas


Geralmente, voc deve definir a chave de ndice clusterizado com o menor nmero de colunas possvel. Considere colunas
que tenham um ou mais dos seguintes atributos:

Sejam exclusivas ou contenham muitos valores distintos


Por exemplo, uma ID de funcionrio identifica os funcionrios de maneira exclusiva. Um ndice clusterizado ou
restrio PRIMARY KEY na coluna EmployeeID melhoraria o desempenho de consultas que pesquisam informaes
de funcionrio com base no nmero de ID do funcionrio. Como alternativa, um ndice clusterizado poderia ser
criado em LastName, FirstName, MiddleName porque os registros dos funcionrios so agrupados e consultados
frequentemente dessa maneira e a combinao dessas colunas ainda ofereceria um grau alto de diferena.
Sejam acessadas sequencialmente
Por exemplo, um ID de produto identifica produtos de maneira exclusiva na tabela Production.Product no banco
de dados AdventureWorks2012 . Consultas nas quais uma pesquisa sequencial 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.
Frequentemente usado para classificar os dados recuperados de uma tabela.
Pode ser uma boa ideia agrupar, ou seja, classificar fisicamente, a tabela nessa coluna para economizar o custo de
uma operao de classificao toda vez que a coluna for consultada.

ndices clusterizados no so uma boa escolha para os seguintes atributos:

Colunas que sofrem mudanas frequentes


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 fsica. Essa uma considerao importante em sistemas de processamento de transaes de
alto volume nos quais os dados sejam normalmente volteis.
Chaves largas
Chaves largas so uma combinao de vrias colunas ou de vrias colunas de tamanho grande. Os valores de chave
do ndice clusterizado so usados por todos os ndices no clusterizados como chaves de pesquisa. Qualquer ndice
no clusterizado definido na mesma tabela ser significativamente maior porque as entradas de ndice no
clusterizado contm a chave de cluster e tambm as colunas de chave definidas para aquele ndice no clusterizado.

[Incio]

Diretrizes de criao de ndice no clusterizado


Um ndice no clusterizado contm os valores de chave do ndice e os localizadores de linha que apontam para o local de

8 de 18

21/09/2014 09:39

Guia de criao de ndice do SQL Server

http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx

armazenamento dos dados da tabela. Voc pode criar vrios ndices no clusterizados em uma tabela ou exibio indexada.
Em geral, os ndices no clusterizados devem ser criados para aprimorar o desempenho de consultas utilizadas com
frequncia que no so cobertas pelo ndice clusterizado.
Semelhante maneira como o ndice de um livro usado, o otimizador de consulta procura um valor de dados pesquisando
o ndice no clusterizado para encontrar o local do valor de dados na tabela e, depois, recupera os dados diretamente
daquele local. Isso faz com que os ndices no clusterizados sejam a opo ideal para consultas de correspondncia exata,
uma vez que o ndice contm entradas que descrevem o local preciso na tabela dos valores de dados pesquisados pelas
consultas. Por exemplo, para consultar a tabela HumanResources. Employee de todos os funcionrios que reportam para
um determinado gerente, o otimizador de consulta pode usar o ndice no clusterizado IX_Employee_ManagerID, que tem
ManagerID como sua coluna de chave. O otimizador de consulta pode localizar rapidamente todas as entradas no ndice
que correspondem ao ManagerID especificado. Cada entrada do ndice aponta para a pgina e a linha exatas na tabela ou
ndice clusterizado, em que os dados correspondentes podem ser localizados. Depois que o otimizador de consulta localizar
todas as entradas no ndice, poder ir diretamente para a pgina e a linha exatas e recuperar os dados.

Arquitetura de ndice no clusterizado


Os ndices no clusterizados tm a mesma estrutura de rvore B que os ndices clusterizados, com exceo das seguintes
diferenas significativas:

As linhas de dados da tabela subjacente no so classificadas nem armazenadas em ordem com base nas suas
chaves no clusterizadas.
A camada de folha de um ndice no clusterizado constituda de pginas de ndice, em vez de pginas de dados.

Os localizadores de linha, em linhas de ndice no clusterizado, so 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 no tiver um ndice clusterizado, o localizador de linha ser um ponteiro para a
linha. O ponteiro criado a partir do ID (identificador), do nmero da pgina e do nmero da linha na pgina do
arquivo. O ponteiro inteiro conhecido como RID (Identificao de Linha).
Se a tabela tiver um ndice clusterizado, ou o ndice estiver em uma exibio indexada, o localizador de linha ser a
chave de ndice clusterizado da linha.

Os ndices no clusterizados tm uma linha em sys.partitions com index_id >1 para cada partio usada pelo ndice. Por
padro, um ndice no clusterizado tem uma nica partio. Quando um ndice no clusterizado tem vrias parties, cada
partio tem uma estrutura de rvore B que contm linhas de ndice para aquela partio especfica. Por exemplo, se um
ndice no clusterizado tiver quatro parties, haver quatro estruturas de rvore B, uma em cada partio.
Dependendo dos tipos de dados no ndice no clusterizado, cada estrutura de ndice no clusterizado ter uma ou mais
unidades de alocao para armazenar e gerenciar os dados de uma partio especfica. No mnimo, cada ndice no
clusterizado ter uma unidade de alocao IN_ROW_DATA por partio que armazena as pginas de rvore B do ndice. O
ndice no clusterizado tambm ter uma unidade de alocao LOB_DATA por partio se contiver colunas LOB (objetos
grandes). Alm disso, ter uma unidade de alocao ROW_OVERFLOW_DATA por partio se contiver colunas de
comprimento varivel que excedem o limite de tamanho de linha de 8.060 bytes.
A ilustrao a seguir mostra a estrutura de um ndice no clusterizado em uma nica partio.

9 de 18

21/09/2014 09:39

Guia de criao de ndice do SQL Server

10 de 18

http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx

Consideraes sobre banco de dados


Considere as caractersticas do banco de dados ao criar ndices no clusterizados.

Os bancos de dados ou as tabelas com baixos requisitos de atualizao, mas volumes grandes de dados, podem se
beneficiar de muitos ndices no clusterizados para aprimorar o desempenho da consulta. Considere a criao de
ndices filtrados para subconjuntos bem definidos de dados para aprimorar o desempenho da consulta, reduzir os
custos de armazenamento de ndice e reduzir os custos de manuteno de ndice comparados a ndices no
clusterizados de tabela completa.
Os aplicativos do Sistema de Suporte a Decises e os bancos de dados que contm fundamentalmente dados
somente leitura podem se beneficiar de vrios ndices no clusterizados. O otimizador de consulta tem mais ndices
dos quais selecionar para determinar o mtodo de acesso mais rpido e as baixas caractersticas de atualizao do
banco de dados significam que a manuteno do ndice no impedir o desempenho.
Os aplicativos de Processamento de Transaes online e os bancos de dados que contm tabelas com grandes
atualizaes devem evitar a superindexao. Adicionalmente, os ndices deveriam ser restritos, ou seja, com o mnimo
possvel de colunas.
Nmeros grandes de ndices em uma tabela afetam o desempenho das instrues INSERT, UPDATE, DELETE e MERGE
porque todos os ndices precisam ser ajustados adequadamente medida que os dados so alterados em uma
tabela.

Consideraes sobre consultas


Antes de criar ndices no clusterizados, recomendado entender como os dados so acessados. Considere usar um ndice
no clusterizado para consultas com os seguintes atributos:

Use as clusulas JOIN ou GROUP BY.


Crie vrios ndices no clusterizados em colunas envolvidas em operaes de juno e de agrupamento e um ndice
clusterizado em qualquer coluna de chave estrangeira.
Consultas que no retornam grandes conjuntos de resultados.
Crie ndices filtrados para abranger consultas que retornam um subconjunto bem definido de linhas de uma tabela

21/09/2014 09:39

Guia de criao de ndice do SQL Server

http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx

grande.
Contm as colunas envolvidas frequentemente em condies de pesquisa de consulta, como a clusula WHERE, que
retorna correspondncias exatas.

Consideraes sobre colunas


Considere as colunas que tenham um ou mais destes atributos:

Cubra a consulta.
So obtidos ganhos de desempenho quando o ndice contm todas as colunas da consulta. O otimizador de consulta
pode localizar todos os valores da coluna dentro do ndice. Os dados de tabela ou de ndice clusterizado no so
acessados, o que resulta em menos operaes de E/S. Use ndice com colunas includas para adicionar colunas de
cobertura, em vez de criar uma ampla chave de ndice.
Se a tabela tiver um ndice clusterizado, a coluna ou as colunas definidas no ndice clusterizado sero anexadas
automaticamente ao final de cada ndice no clusterizado da tabela. Isso pode produzir uma consulta coberta sem
especificar as colunas de ndice clusterizado na definio do ndice no clusterizado. Por exemplo, se uma tabela tiver
um ndice clusterizado na coluna C, um ndice no clusterizado nas colunas B e A, ter como colunas de valores de
chave B, A e C.
Muitos valores distintos, como uma combinao de sobrenome e nome, caso um ndice clusterizado seja usado em
outras colunas.
Se houver poucos valores distintos, como apenas 1 e 0, a maioria das consultas no usar o ndice porque uma
verificao de tabela , em geral, mais eficaz. Para esse tipo de dados, considere a criao de um ndice filtrado em
um valor diferente que ocorra apenas em um nmero pequeno de linhas. Por exemplo, se a maioria dos valores for 0,
o otimizador de consulta pode usar um ndice filtrado para as linhas de dados que contm 1.

Usar colunas includas para estender ndices no clusterizados


Voc pode estender a funcionalidade de ndices no clusterizados acrescentando colunas de no chave ao nvel folha do
ndice no cluster. Ao incluir colunas no chave, voc pode criar voc ndices no clusterizados que abrangem mais
consultas. Isto porque as colunas no chave tm os seguintes benefcios:

Elas podem ser tipos de dados no permitidos como colunas de chave de ndice.
Eles no so considerados pelo Mecanismo de Banco de Dados ao calcular o nmero de colunas de chave de ndice
ou o tamanho da chave de ndice.

Um ndice com colunas no chave includas pode melhorar o desempenho de consulta significativamente quando todas as
colunas na consulta forem includas no ndice como colunas de chave ou no chave. Os ganhos de desempenho so
alcanados pois o otimizador de consulta pode localizar todos os valores de coluna dentro do ndice, a tabela, ou dados de
ndice clusterizado no so acessados, resultando em poucas operaes de E/S de disco.
Observao
Quando um ndice contm todas colunas referenciadas pela consulta, ele costuma ser referenciado como se abrangendo
a consulta.
Enquanto as colunas de chave so armazenadas em todos os nveis do ndice, as colunas no chave so armazenadas
apenas em nvel folha.

Usando colunas includas para evitar limites de tamanho


Voc pode incluir colunas no chave em um ndice no clusterizado para evitar exceder as limitaes do tamanho atual do
ndice, de um mximo de 16 colunas de chave, e um mximo de tamanho chave de ndice de 900 bytes. O Mecanismo de
Banco de Dados no considera as colunas no chave ao calcular o nmero de colunas de chave de ndice, ou o tamanho da
chave do ndice.
Por exemplo, suponha que voc quer indexar as colunas seguintes na tabela Document:

11 de 18

21/09/2014 09:39

Guia de criao de ndice do SQL Server

http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx

Title nvarchar(50)
Revision nchar(5)
FileName nvarchar(400)
Como os tipos de dados nchar e nvarchar exigem 2 bytes para cada caractere, um ndice que contm essas trs colunas
ultrapassaria a limitao de tamanho de 900 bytes por 10 bytes (455 * 2). Ao usar a clusula INCLUDE da declarao CREATE
INDEX , a chave de ndice pode ser definida como uma coluna no chave (Title, Revision) e FileName . Desse modo, o
tamanho da chave de ndice seria de 110 bytes (55 * 2), e o ndice ainda conteria todas as colunas necessrias. A seguinte
declarao cria tal ndice.

CREATE INDEX IX_Document_Title


ON Production.Document (Title, Revision)
INCLUDE (FileName);

ndice com diretrizes das colunas includas


Quando voc projeta ndices no clusterizados com colunas includas, considere as seguintes diretrizes:

As colunas no chave esto definidas na clusula INCLUDE da instruo CREATE INDEX.


As colunas no chave s podem ser definidas em ndices no clusterizados em tabelas, ou em exibies indexadas.
So permitidos todos os tipos de dados, exceto text, ntext e image.
As colunas computadas que so determinsticas e precisas ou imprecisas podem ser colunas includas. Para obter
mais informaes, consulte ndices em colunas computadas.
Assim como com as colunas de chave, as colunas computadas derivadas dos tipos de dados image, ntext, e text
podem ser colunas no chave (includas), desde que o tipo de dados da coluna computada seja permitido como uma
coluna de ndice no chave.
Os nomes das colunas no podem ser especificados na lista INCLUDE e na lista de coluna de chave.
Os nomes das colunas no podem ser repetidos na lista INCLUDE.

Diretrizes do tamanho da coluna


Pelo menos uma coluna de chave deve ser definida. O nmero de mximo de colunas no chave de 1023 colunas.
Esse o nmero mximo de colunas de tabela menos 1.
As colunas de chave de ndice, exceto as no chave, devem seguir as restries de tamanho de ndice de no mximo
16 colunas de chave, e um tamanho total de chave de ndice de no mximo 900 bytes.
O tamanho total de todas as colunas no chave est limitado somente pelo tamanho especificado das colunas na
clusula INCLUDE; por exemplo, as colunas varchar(max) esto limitadas a 2 GB.

Diretrizes para modificao de coluna


Quando voc modifica uma coluna de tabela que estava definida como uma coluna includa, as restries seguintes se
aplicam:

As colunas no chave no podem ser soltar das tabelas, a menos que o ndice seja solto antes.
As colunas no chave no podem ser alteradas, exceto para fazerem o seguinte:
Alterar a nulidade da coluna da coluna NOT NULL at NULL.
Aumentar o comprimento das colunas varchar, nvarchar, ou varbinary .

12 de 18

21/09/2014 09:39

Guia de criao de ndice do SQL Server

http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx

Observao
Estas restries de modificao de coluna tambm se aplicam para indexar colunas de chave.

Recomendaes de design
Redesenhe ndices no clusterizados com um comprimento de chave de ndice, de tal forma que apenas as colunas usadas
para buscas e pesquisas sejam colunas de chave. Faa todas as outras colunas que abrangem a consulta colunas no chave
includas. Deste modo, voc ter todas as colunas necessrias para abranger a consulta, mas a chave de ndice em si
pequena e eficiente.
Por exemplo, suponha que voc quer projetar um ndice para abranger a consulta seguinte.

SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode


FROM Person.Address
WHERE PostalCode BETWEEN N'98000' and N'99999';

Para abranger a consulta, cada coluna deve ser definida no ndice. Embora voc possa definir todas as colunas como
colunas de chave, o tamanho chave seria de 334 bytes. Em razo da nica coluna de fato usada como critrio de pesquisa
ser a coluna PostalCode, que tem um comprimento de 30 bytes, um melhor design de ndice definiria PostalCode como
sendo a coluna de chave e incluiria todas as outras colunas como colunas que no so colunas de chave.
A seguinte declarao cria um ndice com colunas includas para abranger a consulta.

CREATE INDEX IX_Address_PostalCode


ON Person.Address (PostalCode)
INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);

Consideraes sobre desempenho


Evite a adio desnecessria de colunas. Adicionar muitas colunas de ndice, sejam elas chave ou no, pode gerar as
seguintes implicaes no desempenho:

Poucas filas de ndice se ajustaro em uma pgina. Isto poderia criar aumentos de E/S e eficincia de cache reduzida.
Ser necessrio mais espao em disco para armazenar o ndice. Em particular, acrescentar os tipos de dados
varchar(max), nvarchar(max), varbinary(max)ou xml como colunas de ndice no chave pode aumentar
significativamente os requisitos de espao em disco. Isto porque os valores de coluna so copiados no nvel folha de
ndice. Portanto, eles residem no ndice e na tabela base.
A manuteno do ndice pode aumentar o tempo necessrio para executar modificaes, inseres, atualizaes ou
excluses, para a tabela subjacente ou exibio indexada.

Voc ter que determinar se os ganhos no desempenho de consulta superam o efeito no desempenho durante a
modificao de dados, e em requisitos adicionais de espao em disco.
[Incio]

Diretrizes de design de ndice exclusivo


Um ndice exclusivo garante que a chave de ndice no contm nenhum valor duplicado e, portanto, cada linha na tabela
exclusiva de algum modo. Especificar um ndice exclusivo s faz sentido quando a exclusividade for uma caracterstica dos
prprios dados. Por exemplo, se voc quiser garantir que os valores na coluna NationalIDNumber na tabela
HumanResources.Employee sejam exclusivos, quando a chave primria for EmployeeID, crie uma restrio UNIQUE na
coluna NationalIDNumber. Se o usurio tentar digitar o mesmo valor naquela coluna para mais de um empregado, ser

13 de 18

21/09/2014 09:39

Guia de criao de ndice do SQL Server

14 de 18

http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx

exibida uma mensagem de erro e o valor duplicado no inserido.


Com ndices exclusivos de multicolunas, o ndice garante que cada combinao de valores na chave de ndice exclusivo.
Por exemplo, se um ndice exclusivo for criado em uma combinao de colunas LastName, FirstName e MiddleName, duas
linhas na tabela no podero ter a mesma combinao de valores que essas colunas.
Tanto os ndices clusterizados quanto os no clusterizados podem ser exclusivos. Contanto que os dados na coluna sejam
exclusivos, voc pode criar um ndice clusterizado exclusivo e no clusterizado na mesma tabela.
Os benefcios dos ndices exclusivos incluem o seguinte:

A integridade de dados das colunas definidas garantida.


So fornecidas informaes teis adicionais ao otimizador de consultas.

Criar uma restrio PRIMARY KEY ou UNIQUE automaticamente gera um ndice exclusivo nas colunas especificadas. No h
nenhuma diferena significativa entre criar uma restrio UNIQUE e criar um ndice exclusivo independente de uma
restrio. A validao de dados ocorre da mesma maneira e o otimizador de consultas no diferencia entre um ndice
exclusivo criado por uma restrio ou manualmente. Entretanto, voc dever criar uma restrio UNIQUE ou PRIMARY KEY
na coluna quando o objetivo for a integridade de dados. Fazendo isso o objetivo do ndice ser claro.

Consideraes
Um ndice exclusivo, uma restrio UNIQUE ou uma restrio PRIMARY KEY no podero ser criados, se existirem
valores de chave duplicados nos dados.
Se os dados forem exclusivos e voc quiser impor exclusividade, criar um ndice exclusivo em vez de um ndice no
exclusivo, na mesma combinao de colunas, fornecer informaes adicionais para otimizador de consultas que
poder produzir planos de execuo mais eficientes. Criar um ndice exclusivo (preferivelmente criando uma restrio
UNIQUE) recomendvel nesse caso.
Um ndice no clusterizado exclusivo pode conter colunas no chave includas. Para obter mais informaes, consulte
ndice com colunas includas.

[Incio]

Diretrizes de criao de ndice filtrado


Um ndice filtrado um ndice no clusterizado otimizado, criado especialmente para consultas que fazem selees a partir
de um subconjunto bem-definido de dados. Ele usa um predicado de filtro para indexar uma parte das linhas da tabela. Um
ndice filtrado bem projetado pode melhorar o desempenho da consulta e reduzir os custos de manuteno e
armazenamento do ndice em comparao com os ndices de tabela completa.
Aplica-se a: SQL Server 2008 a SQL Server 2012.
Os ndices filtrados podem oferecer as seguintes vantagens com relao aos ndices de tabela completa:

Melhor desempenho de consultas e qualidade de plano


Um ndice filtrado bem projetado melhora o desempenho das consultas e a qualidade do plano de execuo porque
menor do que um ndice no clusterizado de tabela completa e possui estatsticas filtradas. As estatsticas filtradas
so mais precisas do que as estatsticas de tabela completa, pois abrangem apenas as linhas do ndice filtrado.
Reduo dos custos de manuteno do ndice
A manuteno do ndice feita apenas quando as instrues DML (linguagem de manipulao de dados) afetam os
dados do ndice. Um ndice filtrado reduz os custos de manuteno em comparao com o ndice no clusterizado
de tabela completa porque menor e a manuteno feita somente quando seus dados so afetados. possvel ter

21/09/2014 09:39

Guia de criao de ndice do SQL Server

http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx

um grande nmero de ndices filtrados, especialmente quando eles contm dados que so raramente afetados. Do
mesmo modo, se um ndice filtrado tiver apenas dados afetados com frequncia, seu tamanho reduzido diminuir o
custo de atualizao das estatsticas.
Reduo dos custos de armazenamento do ndice
A criao de um ndice filtrado pode reduzir o armazenamento em disco de ndices no clusterizados quando um
ndice de tabela completa no necessrio. possvel substituir um ndice no clusterizado de tabela completa por
vrios ndices filtrados sem aumentar de forma significativa os requisitos de armazenamento.

Os ndices filtrados so teis quando as colunas contm subconjuntos de dados bem-definidos, a que as consultas fazem
referncia em instrues SELECT. So exemplos:

Colunas esparsas que contm apenas alguns valores no NULL.


Colunas heterogneas que contm categorias de dados.
Colunas que contm intervalos de valores como quantias em dinheiro, hora e datas.
Parties de tabela definidas pela lgica de comparao simples para obter valores de coluna.

O custo de manuteno reduzido dos ndices filtrados mais perceptvel quando o nmero de linhas do ndice pequeno,
se comparado a um ndice de tabela completa. Se o ndice filtrado incluir a maioria das linhas da tabela, sua manuteno
poder ser mais cara do que a do ndice de tabela completa. Nesse caso, voc deve usar um ndice de tabela completa em
vez do ndice filtrado.
Os ndices filtrados so definidos em uma tabela e oferecem suporte apenas a operadores de comparao simples. Se voc
precisar de uma expresso de filtro que referencie vrias tabelas ou que tenha uma lgica complexa, dever criar uma
exibio.

Consideraes de criao
Para criar ndices filtrados eficazes, importante entender quais consultas o aplicativo usa e como elas se relacionam com
os subconjuntos de dados. Alguns exemplos de dados com subconjuntos bem-definidos so as colunas com valores
predominantemente NULL, as colunas com categorias de valores heterogneas e as colunas com intervalos de valores
diferentes. As consideraes sobre criao a seguir apresentam uma variedade de cenrios em que um ndice filtrado pode
ser vantajoso com relao aos ndices de tabela completa.

ndices filtrados para subconjuntos de dados


Quando a coluna tem apenas uma pequena quantidade de valores relevantes para consultas, voc pode criar um ndice
filtrado no subconjunto de valores. Por exemplo, se os valores de uma coluna forem predominantemente NULL e a consulta
selecionar apenas valores no NULL, ser possvel criar um ndice filtrado para linhas de dados no NULL. O ndice
resultante ser menor e sua manuteno ser menos dispendiosa em comparao com um ndice no clusterizado de tabela
completa definido nas mesmas colunas de chave.
Por exemplo, o banco de dados AdventureWorks2012 tem uma tabela Production.BillOfMaterials com 2.679 linhas. A
coluna EndDate tem apenas 199 linhas que contm um valor no NULL e outras 2.480 linhas que contm NULL. O ndice
filtrado a seguir abrange consultas que retornam as colunas definidas no ndice e que selecionam apenas linhas com valor
no NULL para EndDate.

CREATE NONCLUSTERED INDEX FIBillOfMaterialsWithEndDate


ON Production.BillOfMaterials (ComponentID, StartDate)
WHERE EndDate IS NOT NULL ;
GO

O ndice filtrado FIBillOfMaterialsWithEndDate vlido para a consulta a seguir. Voc pode exibir o plano de execuo
da consulta para determinar se o otimizador de consulta usou o ndice filtrado.

15 de 18

21/09/2014 09:39

Guia de criao de ndice do SQL Server

http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx

SELECT ProductAssemblyID, ComponentID, StartDate


FROM Production.BillOfMaterials
WHERE EndDate IS NOT NULL
AND ComponentID = 5
AND StartDate > '20080101' ;

Para obter mais informaes sobre como criar ndices filtrados e definir a expresso de predicado do ndice filtrado,
consulte Criar ndices filtrados.

ndices filtrados para dados heterogneos


Quando a tabela contm linhas de dados heterogneos, possvel criar um ndice filtrado para uma ou mais categorias de
dados.
Por exemplo, a cada produto listado na tabela Production.Product atribudo um ProductSubcategoryID que, por sua
vez, est associado s categorias de produtos Bikes, Components, Clothing ou Accessories. Essas categorias so
heterogneas porque os valores das coluna da tabela Production.Product no esto estreitamente correlacionados. Por
exemplo, as colunas Color, ReorderPoint, ListPrice, Weight, Class e Style tm caractersticas exclusivas para cada
categoria de produto. Suponha que haja consultas frequentes sobre acessrios que possuem subcategorias entre 27 e 36.
possvel aprimorar o desempenho das consultas sobre acessrios criando um ndice filtrado nas subcategorias de
acessrios, conforme ilustrado no exemplo a seguir.

CREATE NONCLUSTERED INDEX FIProductAccessories


ON Production.Product (ProductSubcategoryID, ListPrice)
Include (Name)
WHERE ProductSubcategoryID >= 27 AND ProductSubcategoryID <= 36;

O ndice filtrado FIProductAccessories abrange a seguinte consulta porque os resultados da consulta


esto contidos no ndice e o plano da consulta no inclui uma pesquisa de tabela base. Por exemplo, a expresso de
predicado da consulta ProductSubcategoryID = 33 um subconjunto do predicado de ndice filtrado
ProductSubcategoryID >= 27 e ProductSubcategoryID <= 36, as colunas ProductSubcategoryID e ListPrice no
predicado de consulta so ambas colunas de chave no ndice, e o nome armazenado no nvel folha do ndice como uma
coluna includa.

SELECT Name, ProductSubcategoryID, ListPrice


FROM Production.Product
WHERE ProductSubcategoryID = 33 AND ListPrice > 25.00 ;

Colunas de chave
Uma prtica recomendada incluir um pequeno nmero de colunas de chave ou includas em uma definio de ndice
filtrado e inserir apenas as colunas necessrias para o otimizador de consulta escolher o ndice filtrado para o plano de
execuo da consulta. O otimizador de consulta pode escolher um ndice filtrado para a consulta, independentemente de
ele abranger ou no a consulta. No entanto, mais provvel que o otimizador de consulta escolha um ndice filtrado se ele
abranger a consulta.
Em alguns casos, um ndice filtrado abrange a consulta sem incluir as colunas na expresso do ndice filtrado como colunas
de chave ou includas na definio do ndice filtrado. As diretrizes a seguir explicam quando uma coluna em uma expresso
de ndice filtrado deve ser uma coluna de chave ou includa na definio do ndice filtrado. Os exemplos se referem ao
ndice filtrado FIBillOfMaterialsWithEndDate que foi criado anteriormente.
A coluna na expresso do ndice filtrado no precisar ser uma coluna de chave ou includa na definio do ndice filtrado,
se a expresso do ndice filtrado for equivalente ao predicado da consulta e a consulta no retorn-la com os resultados da
consulta. Por exemplo, FIBillOfMaterialsWithEndDate abrange a consulta a seguir porque o predicado da consulta
equivalente expresso de filtro e EndDate no retornado com os resultados da consulta.
FIBillOfMaterialsWithEndDate no precisa de EndDate como uma coluna de chave ou includa na definio do ndice
filtrado.

16 de 18

21/09/2014 09:39

Guia de criao de ndice do SQL Server

http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx

SELECT ComponentID, StartDate FROM Production.BillOfMaterials


WHERE EndDate IS NOT NULL;

A coluna na expresso de ndice filtrado dever ser uma coluna de chave ou includa na definio do ndice filtrado se o
predicado de consulta us-la em uma comparao que no for equivalente expresso do ndice filtrado. Por exemplo,
FIBillOfMaterialsWithEndDate vlido para a consulta a seguir, porque seleciona um subconjunto de linhas do ndice
filtrado. Contudo, no abrange a consulta a seguir porque EndDate usado na comparao de EndDate > '20040101',
que no equivalente expresso do ndice filtrado. O processador de consultas no pode executar essa consulta sem
observar os valores de EndDate. Portanto, EndDate deve ser uma coluna de chave ou includa na definio do ndice
filtrado.

SELECT ComponentID, StartDate FROM Production.BillOfMaterials


WHERE EndDate > '20040101';

A coluna na expresso do ndice filtrado dever ser uma coluna de chave ou includa na definio do ndice filtrado se fizer
parte do conjunto de resultados da consulta. Por exemplo, FIBillOfMaterialsWithEndDate no abrange a consulta a
seguir, porque retorna a coluna EndDate nos resultados da consulta. Portanto, EndDate deve ser uma coluna de chave ou
includa na definio do ndice filtrado.

SELECT ComponentID, StartDate, EndDate FROM Production.BillOfMaterials


WHERE EndDate IS NOT NULL;

A chave de ndice clusterizado da tabela no precisa ser uma coluna de chave ou includa na definio do ndice filtrado. A
chave de ndice clusterizado includa automaticamente em todos os ndices no clusterizados, inclusive ndices filtrados.

Operadores de converso de dados no predicado do filtro


Se o operador de comparao especificado na expresso do ndice filtrado resultar em uma converso de dados implcita ou
explcita, ocorrer um erro se a converso ocorrer esquerda do operador de comparao. Uma soluo seria gravar a
expresso do ndice filtrado com o operador de converso de dados (CAST ou CONVERT) direita do operador de
comparao.
O exemplo a seguir cria uma tabela com diversos tipos de dados.

USE AdventureWorks2012;
GO
CREATE TABLE dbo.TestTable (a int, b varbinary(4));

Na definio de ndice filtrado a seguir, a coluna b convertida implicitamente em um tipo de dados de nmero inteiro para
comparao com a constante 1. Isso gera a mensagem de erro 10611 porque a converso ocorre esquerda do operador
no predicado filtrado.

CREATE NONCLUSTERED INDEX TestTabIndex ON dbo.TestTable(a,b)


WHERE b = 1;

A soluo converter a constante direita para o mesmo tipo da coluna b, como mostra o seguinte exemplo:

17 de 18

21/09/2014 09:39

Guia de criao de ndice do SQL Server

http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx

CREATE INDEX TestTabIndex ON dbo.TestTable(a,b)


WHERE b = CONVERT(Varbinary(4), 1);

A movimentao da converso de dados da esquerda para a direita de um operador de comparao pode alterar o
significado da converso. No exemplo anterior, quando o operador CONVERT foi adicionado direita, a comparao mudou
de uma comparao de nmero inteiro para uma comparao varbinary.
[Incio]

Leitura adicional
Melhorando o desempenho com exibies indexadas do SQL Server 2008
Tabelas e ndices particionados

Contribuies da comunidade
2014 Microsoft

18 de 18

21/09/2014 09:39

You might also like