Professional Documents
Culture Documents
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
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
1 de 18
21/09/2014 09:39
2 de 18
http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx
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.
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
3 de 18
http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx
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.
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
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.
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
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.
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.
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
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.
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]
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.
6 de 18
21/09/2014 09:39
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.
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
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.
[Incio]
8 de 18
21/09/2014 09:39
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.
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
10 de 18
http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx
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.
21/09/2014 09:39
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.
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.
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.
11 de 18
21/09/2014 09:39
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.
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
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.
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.
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]
13 de 18
21/09/2014 09:39
14 de 18
http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx
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]
21/09/2014 09:39
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:
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.
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
http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx
Para obter mais informaes sobre como criar ndices filtrados e definir a expresso de predicado do ndice filtrado,
consulte Criar ndices filtrados.
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
http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx
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.
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.
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.
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.
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
http://msdn.microsoft.com/pt-br/library/jj835095(v=sql.110).aspx
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