Skip to content

Columnas incluidas (include) en índices no agrupados de SQL Server

22/10/2013
SQLServerLogo

Introducción

El uso de índices de cobertura es una técnica simple y poderosa para la optimización de consultas, que nos brinda los mejores tiempos de ejecución disminuyendo además el acceso a disco. Un índice de cobertura es aquel que contiene la totalidad de los campos que una consulta referencia, por lo que el motor puede resolver esta consulta solo accediendo al índice. Además en estos casos es fundamental que los campos que aparezcan en la cláusula WHERE de la consulta sean los primeros campos del índice, en orden de mayor a menor selectividad. De esta forma el índice será efectivo y el optimizador lo elegirá en forma apropiada.

Pero como contrapartida de esto tenemos que los índices de cobertura en muchos casos son voluminosos, sobre todo si se definen sobre tablas con gran cantidad de registros. Si buscamos una alternativa para seguir utilizando este tipo de índices y no pagar el costo extra del uso de espacio, tenemos a disposición, desde SQL Server 2008, la funcionalidad de columnas incluidas en los índices (include columns).

Las columnas incluidas son aquellas que forman parte del índice pero solo se almacenan sus valores en las hojas del mismo (recordar que los índices se implementan como estructuras de árbol B+) De esta manera, las columnas que aparecen como incluidas se pueden utilizar en la cláusula SELECT sin problemas o incluso en el WHERE, pero su evaluación será siempre al final de la resolución de la consulta. Además de las columnas incluidas, el índice posee las columnas tradicionales, por las que se podrán filtrar y ordenar los datos de la manera habitual.

Ejemplo práctico

Les presento a continuación un ejemplo práctico simple, para observar las ventajas de los índices con columnas incluidas y la forma de implementar estos índices.

Vemos la ejecución de una consulta sobre la tabla Sales.SalesOrderDetail, definiendo un índice sobre el campo SpecialOfferID:

IX_Include
Consideremos el plan de ejecución:
IX_Include_0
 

Podemos ver como se recorre el índice y para cada dato encontrado se accede a la tabla (key lookup) a fin de obtener el valor de las columnas ProductID y OrderQty, que forman parte de la consulta.

Las estadísticas de ejecución son:

IX_Include_1

Crearemos ahora un índice no agrupado con columnas incluidas, tomando como columna del índice al campo SpecialOfferID e incluyendo las columnas OrderQty y ProductID.

IX_Include_3

Vemos que el plan de ejecución fue totalmente modificado y ahora solo realiza una operación de búsqueda en el índice (index seek) sobre el índice que creamos anteriormente:

IX_Include_4

y las nuevas estadísticas de ejecución, con este nuevo plan y el uso del índice son muy favorables a esta ejecución:

IX_Include_5

Pasamos de 256 lecturas lógicas (logical reads) a 3 lecturas lógicas, lo que significa una mejora del 98.82% en el rendimiento.

Conclusiones

Hemos mostrado como los índices de cobertura combinados con las columnas incluidas pueden mejorar en forma considerable la ejecución de consultas, minimizando además el uso de disco al eliminar las columnas incluidas en los nodos intermedios correspondientes a la estructura del índice.

From → Microsoft, SQL Server

2 comentarios
  1. Gilberto Montaño permalink

    gracias por el aporte. solo una cosa que consulta te ayudaría a saber si los indices tienen un include. actualmente uso el sp_helpindex [tabla] pero no muestra si tiene indices

    Me gusta

Trackbacks & Pingbacks

  1. MSExpertos | Columnas incluidas (include) en índices no agrupados de SQL Server

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: