Pergunta

Você pode explicar os conceitos de e relação entre, Cobrir Índices e consultas cobertas em Microsoft SQL Server?

Foi útil?

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

 enter descrição da imagem aqui

No entanto, para um índice não agrupado, há duas possibilidades: ou a tabela já tem um índice agrupado ou não:

 enter descrição da imagem aqui

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.

 enter descrição da imagem aqui

A coberto consulta é 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 índice cobrindo é um índice que é usado em uma consulta coberta. Não existe tal coisa como um índice que, em e por si mesmo, é um índice de cobertura. Um índice pode ser um índice de cobertura com respeito a consulta A, enquanto ao mesmo tempo não ser um índice de cobertura em relação à consulta B.

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 é 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top