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: