Pergunta

Acabei de ouvir o termo índice coberto em alguma discussão sobre banco de dados - o que isso significa?

Foi útil?

Solução

A índice de cobertura é um índice que contém todas, e possivelmente mais, as colunas necessárias para sua consulta.

Por exemplo, isto:

SELECT *
FROM tablename
WHERE criteria

normalmente usará índices para acelerar a resolução de quais linhas recuperar usando critério, mas então irá para a tabela completa para recuperar as linhas.

No entanto, se o índice contivesse as colunas coluna1, coluna2 e coluna3, então este sql:

SELECT column1, column2
FROM tablename
WHERE criteria

e, desde que esse índice específico possa ser usado para acelerar a resolução de quais linhas recuperar, o índice já contém os valores das colunas nas quais você está interessado, portanto não será necessário ir até a tabela para recuperar as linhas , mas pode produzir os resultados diretamente do índice.

Isto também pode ser usado se você perceber que uma consulta típica usa 1-2 colunas para resolver quais linhas e, em seguida, normalmente adiciona outras 1-2 colunas, pode ser benéfico anexar essas colunas extras (se elas forem iguais em todo ) ao índice, para que o processador de consultas possa obter tudo do próprio índice.

Aqui está um artigo:A cobertura do índice aumenta o desempenho das consultas do SQL Server sobre o assunto.

Outras dicas

O índice de cobertura é apenas um índice comum.É chamado de "cobertura" se puder satisfazer a consulta sem a necessidade de analisar dados.

exemplo:

CREATE TABLE MyTable
(
  ID INT IDENTITY PRIMARY KEY, 
  Foo INT
) 

CREATE NONCLUSTERED INDEX index1 ON MyTable(ID, Foo)

SELECT ID, Foo FROM MyTable -- All requested data are covered by index

Este é um dos métodos mais rápidos para recuperar dados do servidor SQL.

Índices de cobertura são índices que "cobrem" todas as colunas necessárias de uma tabela específica, eliminando a necessidade de acessar a tabela física para uma determinada consulta/operação.

Como o índice contém as colunas desejadas (ou um superconjunto delas), o acesso à tabela pode ser substituído por uma pesquisa ou varredura de índice – o que geralmente é muito mais rápido.

Colunas a serem cobertas:

  • condições parametrizadas ou estáticas;colunas restritas por uma condição parametrizada ou constante.
  • juntar colunas;colunas usadas dinamicamente para unir
  • colunas selecionadas;para responder aos valores selecionados.

Embora a cobertura de índices muitas vezes possa fornecer bons benefícios para recuperação, eles acrescentam um pouco à sobrecarga de inserção/atualização;devido à necessidade de escrever linhas de índice extras ou maiores em cada atualização.

Cobrindo índices para consultas unidas

Os índices de cobertura são provavelmente mais valiosos como técnica de desempenho para consultas unidas.Isso ocorre porque as consultas unidas são mais caras e têm maior probabilidade de que as recuperações de tabela única sofram problemas de desempenho de alto custo.

  • em uma consulta unida, os índices de cobertura devem ser considerados por tabela.
  • cada 'índice de cobertura' remove um acesso à tabela física do plano e o substitui pelo acesso somente ao índice.
  • investigue os custos do plano e experimente quais tabelas valem mais a pena substituir por um índice de cobertura.
  • desta forma, o custo multiplicativo de grandes planos de adesão pode ser significativamente reduzido.

Por exemplo:

select oi.title, c.name, c.address
from porderitem poi
join porder po on po.id = poi.fk_order
join customer c on c.id = po.fk_customer
where po.orderdate > ? and po.status = 'SHIPPING';

create index porder_custitem on porder (orderdate, id, status, fk_customer);

Ver:

Digamos que você tenha uma tabela simples com as colunas abaixo, você indexou apenas o Id aqui:

Id (Int), Telephone_Number (Int), Name (VARCHAR), Address (VARCHAR)

Imagine que você tenha que executar a consulta abaixo e verificar se está usando índice e se está funcionando de forma eficiente sem chamadas de E/S ou não.Lembre-se, você criou apenas um índice em Id.

SELECT Id FROM mytable WHERE Telephone_Number = '55442233';

Ao verificar o desempenho nesta consulta, você ficará desapontado, pois Telephone_Number não está indexado, isso precisa buscar linhas da tabela usando chamadas de E/S.Portanto, esta não é uma cobertura indexada, pois existe alguma coluna na consulta que não está indexada, o que leva a frequentes chamadas de I/O.

Para torná-lo um índice coberto, você precisa criar um índice composto em (Id, Telephone_Number).

Para mais detalhes, consulte este blog:https://www.percona.com/blog/2006/11/23/covering-index-and-prefix-indexes/

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