O que estão cobrindo Índices e consultas cobertas em SQL Server?
-
03-07-2019 - |
Pergunta
Você pode explicar os conceitos de e relação entre, Cobrir Índices e consultas cobertas em Microsoft SQL Server?
Solução
um índice de cobertura é uma que pode satisfazer todas as colunas solicitadas em uma consulta sem a realização de mais uma pesquisa no índice agrupado.
Não existe tal coisa como uma consulta cobertura.
Tenha uma olhada neste artigo Simple-Talk: Usando Cobrindo índices para melhorar o desempenho de consulta de .
Outras dicas
Se todas as colunas solicitada na lista select
de consulta, são disponível no índice , em seguida, o mecanismo de consulta não tem que pesquisar a tabela novamente que pode aumentar significativamente o desempenho da consulta. Uma vez que todas as colunas solicitadas estão disponíveis com no índice, o índice está cobrindo a consulta. Assim, a consulta é chamada uma consulta cobertura e o índice é um índice de cobertura.
Um índice agrupado pode sempre cobrir uma consulta, se as colunas na lista de seleção são da mesma tabela.
Os links a seguir pode ser útil, se você é novo para conceitos de índice:
Um índice de cobertura é um índice Non-Clustered
. Ambos cluster e índices não agrupados usar estrutura de dados B-Tree para melhorar a busca de dados, a diferença é que nas folhas de um índice agrupado um álbum inteiro (ou seja, linha) é armazenado fisicamente ali !, mas este não é o caso para os índices não agrupado. Os seguintes exemplos ilustram isso:
Exemplo: Eu tenho uma tabela com três colunas:. ID, Fname e Lname
No entanto, para um índice não agrupado, há duas possibilidades: ou a tabela já tem um índice agrupado ou não:
Como os dois diagramas mostram, tais índices não-agrupado não fornecem um bom desempenho, porque eles não conseguem encontrar o valor favorito (ou seja Lname) unicamente do B-Tree. Em vez disso eles têm que fazer uma etapa extra Look Up (ou chave ou RID olhar para cima) para encontrar o valor de Lname. E, este é o lugar onde índice coberto vem para a tela. Aqui, o índice não agrupado em ID coveres o valor de Lname bem próximo a ela nas folhas do B-Tree e não há necessidade para qualquer tipo de olhar-se mais.
A coberto consulta ??strong> é uma consulta, onde todas as colunas no conjunto de resultados da consulta são puxados a partir de índices não agrupados.
Uma consulta é feita em uma consulta coberta pela disposição judiciosa de índices.
A coberto consulta é muitas vezes mais eficaz do que uma consulta não-coberto em parte porque índices não agrupados tem mais linhas por página do que índices de cluster ou índices de pilha, de modo menos páginas precisam ser trazidos para a memória, a fim de satisfazer a consulta . Eles têm mais linhas por página, porque apenas parte da linha da tabela faz parte da linha de índice.
A
Aqui está um artigo no devx.com que diz:
Criação de um índice não agrupado que contém todas as colunas usadas em uma consulta SQL, uma técnica chamada índice cobrindo
Eu só posso supor que um coberto consulta ??strong> é uma consulta que tem um índice que abrange todas as colunas em sua registros retornado. Uma ressalva -. O índice e consulta teria de ser fabricados de modo a permitir que o servidor SQL para realmente inferir a partir da consulta que o índice é útil
Por exemplo, uma junção de uma tabela em si pode não beneficiar de tal índice (dependendo da inteligência do planejador de execução de consulta SQL):
PersonID ParentID Name
1 NULL Abe
2 NULL Bob
3 1 Carl
4 2 Dave
Vamos supor que há um índice em PersonID,ParentID,Name
- este seria um índice de cobertura para uma consulta como:
SELECT PersonID, ParentID, Name FROM MyTable
Mas uma consulta como esta:
SELECT PersonID, Name FROM MyTable LEFT JOIN MyTable T ON T.PersonID=MyTable.ParentID
Provavelmente não benifit tanto, mesmo que todas as colunas estão no índice. Por quê? Porque você não está realmente dizendo é que você quer usar o índice triplo da PersonID,ParentID,Name
.
Em vez disso, você está construindo uma condição baseada em duas colunas - PersonID
e ParentID
(que deixa de fora Name
) e, em seguida, você está pedindo para todos os registros, com o PersonID, Name
colunas. Na verdade, dependendo da implementação, o índice pode ajudar a última parte. Mas, pela primeira vez, é melhor ter outros índices.
A cobrindo consulta é de onde todos os predicados podem ser combinados usando os índices nas tabelas subjacentes.
Este é o primeiro passo para melhorar o desempenho do sql em consideração.
um índice de cobertura é o que dá a cada coluna necessária e em que servidor SQL não têm hop de volta para o índice agrupado para encontrar qualquer coluna. Isto é conseguido através do índice não-agrupado e usando opção de colunas de cobertura INCLUEM. colunas não-chave pode ser incluído apenas em índices não agrupados. Colunas não pode ser definido em ambas a coluna de chave e lista incluem. Os nomes das colunas não podem ser repetidos na lista de inclusão. colunas não-chave pode ser descartado de uma tabela somente depois que o índice de não-chave é descartado em primeiro lugar. Por favor, veja detalhes aqui
Quando eu simplesmente lembrou que um índice de cluster consiste de uma lista não-heap ordenou-chave de todas as colunas na tabela definida, as luzes se acenderam para mim. O termo "aglomerado", em seguida, refere-se ao facto de que existe um "conjunto" de todas as colunas, tal como um conjunto de peixes em que o "ponto quente". Se não houver nenhum índice que cobre a coluna que contém o valor requerido (o lado direito da equação), em seguida, o plano de execução usa um índice agrupado Buscai em representação do índice de cluster da coluna solicitada porque ele não encontrar a coluna solicitada em qualquer outra índice de "cobertura". A falta causará um índice agrupado Procure operador no plano de execução proposto, onde o valor procurado é dentro de uma coluna dentro da lista ordenada representado pelo índice de cluster.
Então, uma solução consiste em criar um índice não agrupado que tem a coluna contendo o valor desejado dentro do índice. Desta forma, não há necessidade de fazer referência o índice agrupado, eo Optimizer deve ser capaz de ligar esse índice no plano de execução sem nenhum indício. Se, no entanto, não é um predicado nomear a chave coluna agrupamento único e um argumento para um valor escalar na chave de cluster, o índice agrupado Procure operador continuará a ser utilizada, mesmo se já existe um índice de cobertura em uma segunda coluna na tabela sem um índice.