it-swarm-pt.tech

O que é um índice coberto?

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

65
Martynnw

Um índice de cobertura é um índice que contém todas e possivelmente mais colunas que você precisa para sua consulta.

Por exemplo, isto:

SELECT *
FROM tablename
WHERE criteria

normalmente usa índices para acelerar a resolução de quais linhas recuperar usando os critérios , mas, em seguida, irá para a tabela completa para recuperar as linhas.

No entanto, se o índice contiver 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 precisará ir para a tabela para recuperar as linhas , mas pode produzir os resultados diretamente do índice.

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

Aqui está um artigo: Cobertura de índice aumenta o desempenho de consultas do SQL Server sobre o assunto.

54
Lasse Vågsæther Karlsen

O índice de cobertura é apenas um índice comum. É chamado de "cobertura" se pode atender a consultas 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 SQL server.

13
aku

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

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

Imagine que você precise executar a consulta abaixo e verificar se está usando índice e se está executando com eficiência 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 desta consulta, você ficará desapontado, pois Telephone_Number não está indexado, é necessário buscar linhas da tabela usando chamadas de E/S. Portanto, essa não é uma cobertura indexada, pois há alguma coluna na consulta que não está indexada, o que leva a chamadas de E/S frequentes.

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

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

2
JumpMan

Í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 verificação de índice - que geralmente é muito mais rápida.

Colunas a cobrir:

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

Embora a cobertura de índices geralmente forneça bons benefícios para a recuperação, eles adicionam um pouco à inserção/atualização da sobrecarga; 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 uma técnica de desempenho para consultas unidas. Isso ocorre porque as consultas unidas são mais caras e mais prováveis ​​que as recuperações de tabela única sofrerem 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 planejados e experimente quais tabelas valem mais a pena substituir por um índice de cobertura.
  • por esse meio, o custo multiplicativo de grandes planos de junção pode ser reduzido significativamente.

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);

Vejo:

2
Thomas W