¿Qué es un Índice?


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

Author: Martynnw, 2008-09-15

4 answers

A covering index 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 los 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 un índice particular podría usarse para acelerar la resolución de qué filas recuperar, el índice ya contiene los valores de las columnas que le interesan, por lo que no tendrá que ir a la tabla para recuperar las filas, sino que puede producir los resultados directamente desde el índice.

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

Aquí hay un artículo : La Cobertura de índice Aumenta el Rendimiento de las Consultas de SQL Server sobre el tema.

 49
Author: Lasse Vågsæther Karlsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-22 05:52:05

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 de SQL server.

 10
Author: aku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 10:52:54

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

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

Columnas a cubrir:

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

Mientras que cubrir los índices a menudo puede proporcionar un buen beneficio para la recuperación, 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 más valiosos como técnica de rendimiento para consultas combinadas. Esto es debido 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 físico a la tabla del plan y lo reemplaza con acceso solo al índice.
  • investigue los costos del plan y experimente con qué tablas vale la pena reemplazar por un índice de cobertura.
  • por este medio, el costo multiplicativo de los planes de unión grandes se pueden reducir 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);

Véase:

 2
Author: Thomas W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-13 22:58:53

Digamos que tiene una tabla simple con las siguientes columnas, solo tiene Id indexado aquí:

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

Imagine que tiene que ejecutar la consulta a continuación y verificar si está utilizando index, y si se realiza de manera eficiente sin llamadas de E/S o no. Recuerde, solo ha creado un índice en Id.

SELECT Id FROM mytable WHERE Telephone_Number = '55442233';

Cuando compruebe el rendimiento de esta consulta, se sentirá decepcionado, ya que Telephone_Number no está indexado, esto necesita obtener filas de la tabla utilizando llamadas de E/S. Por lo tanto, esto no es una cubierta indexado ya que hay alguna columna en la consulta que no está indexada, lo que conduce a frecuentes llamadas de E/S.

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

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

 2
Author: JumpMan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-08 19:18:15