sql - nonclustered - ¿Qué es un índice cubierto?
indices clustered y nonclustered sql server (4)
Digamos que tiene una tabla simple con las columnas a continuación, solo tiene un Id indexado aquí:
Id (Int), Telephone_Number (Int), Name (VARCHAR), Address (VARCHAR)
Imagine que debe ejecutar la consulta siguiente y comprobar si utiliza el índice y si funciona 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 en esta consulta, se sentirá decepcionado, ya que Telephone_Number
no está indexado, esto necesita obtener 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 conduce a frecuentes llamadas de E / S.
Para que sea un índice cubierto, debe crear un índice compuesto en (Id, Telephone_Number)
.
Para obtener más información, consulte este blog: https://www.percona.com/blog/2006/11/23/covering-index-and-prefix-indexes/
Acabo de escuchar el término índice cubierto en alguna discusión de la base de datos: ¿qué significa?
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.
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 escaneo de índice, que generalmente es mucho más rápido.
Columnas para cubrir:
- condiciones parametrizadas o estáticas; columnas restringidas por una condición parametrizada o constante.
- unir columnas; columnas dinámicamente utilizadas para unirse
- 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 los gastos generales; debido a la necesidad de escribir filas de índice adicionales o más grandes en cada actualización.
Índices de cobertura para consultas agrupadas
Los índices de cobertura son probablemente más valiosos como técnica de rendimiento para consultas unidas. Esto se debe a que las consultas unificadas son más costosas y es más probable que las recuperaciones de tablas únicas sufran problemas de alto costo de rendimiento.
- en una consulta combinada, los índices que cubren deben considerarse por tabla.
- cada ''índice de cobertura'' elimina un acceso a la tabla física del plan y lo reemplaza con acceso de índice solamente.
- investigue los costos del plan y experimente con qué tablas son más útiles para reemplazar por un índice de cobertura.
- de esta manera, el costo multiplicativo de los planes de unión grande se puede 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);
Ver:
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
típicamente usará índices para acelerar la resolución de las filas a recuperar utilizando criterios , pero luego irá a la tabla completa para recuperar las filas.
Sin embargo, si el índice contenía las columnas column1, column2 y column3 , entonces este sql:
SELECT column1, column2
FROM tablename
WHERE criteria
y, siempre que ese índice en particular se pueda usar para acelerar la resolución de las filas a 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 , 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 típicamente otras 1 a 2 columnas, podría ser beneficioso agregar esas columnas adicionales (si son las mismas en todas partes) ) al índice, para que el procesador de consultas pueda obtener todo del índice mismo.
Aquí hay un artículo: La cobertura de índice aumenta el rendimiento de la consulta de SQL Server en el tema.