it-swarm-es.com

¿Qué es un índice cubierto?

Acabo de escuchar el término índice cubierto en alguna discusión de base de datos, ¿qué significa?

65
Martynnw

Un índice de cobertura es un índice que contiene todas, y posiblemente más, las columnas que necesita para su consulta.

Por ejemplo, esto:

SELECT *
FROM tablename
WHERE criteria

normalmente utilizará índices para acelerar la resolución de qué filas recuperar utilizando criterios , pero luego irá a la tabla completa para recuperar las filas.

Sin embargo, si el índice contiene las columnas column1, column2 y column3 , entonces este sql:

SELECT column1, column2
FROM tablename
WHERE criteria

y, siempre que ese índice en particular pueda usarse para acelerar la resolución de qué filas recuperar, el índice ya contiene los valores de las columnas en las que está interesado, por lo que no tendrá que ir a la tabla para recuperar las filas , pero puede producir los resultados directamente desde el índice.

Esto también se puede usar si ve que una consulta típica usa de 1 a 2 columnas para resolver qué filas, y luego agrega otras 1 o 2 columnas, podría ser beneficioso agregar esas columnas adicionales (si son las mismas) ) al índice, de modo que el procesador de consultas pueda obtener todo del índice.

Aquí hay un artículo: Índice de cobertura aumenta el rendimiento de consultas de SQL Server sobre el tema.

53

El índice de cobertura es solo un índice ordinario. Se llama "cobertura" si puede satisfacer la consulta sin necesidad de analizar datos.

ejemplo:

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 es uno de los métodos más rápidos para recuperar datos del servidor SQL.

13
aku

Digamos que tiene una tabla simple con las columnas a continuación, solo tiene la identificación indexada aquí:

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

Imagine que tiene que ejecutar la siguiente consulta y verificar si está utilizando el índice y si está funcionando de manera eficiente sin llamadas de E/S o no. Recuerda, solo has creado un índice en Id.

SELECT Id FROM mytable WHERE Telephone_Number = '55442233';

Cuando verifique el rendimiento en esta consulta, quedará decepcionado, ya que Telephone_Number no está indexado, esto necesita recuperar filas de la tabla mediante llamadas de E/S. Por lo tanto, esto no es una cobertura indexada ya que hay alguna columna en la consulta que no está indexada, lo que lleva a llamadas de E/S frecuentes.

Para convertirlo en un índice cubierto, debe crear un índice compuesto en (Id, Telephone_Number).

Para obtener más detalles, consulte este blog: https://www.percona.com/blog/2006/11/23/covering-index-and-prefix-indexes/

2
JumpMan

Los índices de cobertura son índices que "cubren" todas las columnas necesarias de una tabla específica, eliminando la necesidad de acceder a la tabla física para una consulta/operación determinada.

Como el índice contiene las columnas deseadas (o un superconjunto de ellas), el acceso a la tabla se puede reemplazar con una búsqueda o exploración de índices, que generalmente es mucho más rápida.

Columnas para cubrir:

  • condiciones parametrizadas o estáticas; Columnas restringidas por una condición parametrizada o constante.
  • unir columnas; Columnas utilizadas dinámicamente para unir.
  • columnas seleccionadas; para responder a los valores seleccionados.

Si bien los índices de cobertura a menudo pueden proporcionar un buen beneficio para la recuperación, sí agregan algo para insertar/actualizar la sobrecarga; Debido a la necesidad de escribir filas de índice adicionales o más grandes en cada actualización.

Cubriendo índices para consultas unidas

Los índices de cobertura son probablemente los más valiosos como una técnica de rendimiento para consultas unidas. Esto se debe a que las consultas unidas son más costosas y es más probable que las recuperaciones de una sola tabla sufran problemas de rendimiento de alto costo.

  • en una consulta unida, los índices de cobertura deben considerarse por tabla.
  • cada 'índice de cobertura' elimina un acceso a la tabla física del plan y lo reemplaza con acceso de solo índice.
  • investigue los costos del plan y experimente con qué tablas vale la pena reemplazar por un índice de cobertura.
  • de esta manera, el costo multiplicativo de los planes de gran combinación puede reducirse significativamente.

Por ejemplo:

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:

2
Thomas W