Volver al Índice | Anterior: Database recovery advisor | Siguiente: Índices de almacén de columnas. Actualizaciones de la tabla

Descubriendo SQL 2012 - Índices de almacén de columnas

Autora: Raquel Vicente de la Rosa

En este artículo comentaremos como podemos utilizar los índices de almacén de columnas (column store index), pero antes de nada veamos qué son. 

Un índice de almacén de columna es un índice que podemos crear en cualquier tabla, que se almacenará precisamente ordenado por columna en lugar de ordenado por fila. Además, utiliza un algoritmo de compresión propio de este tipo de índices.

El objetivo de utilizar este índice en lugar de un índice “tradicional” es la mejora de rendimiento que podemos obtener, especialmente en tablas con una gran cantidad de datos. La mejora de rendimiento es causada principalmente por:

  1. El almacenamiento a nivel de columna permite un procesamiento diferente de la query, en muchos casos más eficiente
  2. En muchas queries, no se necesitan todas las columnas. En un método de almacenamiento “tradicional”-por filas, todas las columnas de una misma fila se encuentran en la misma página, por lo que se mueven todas de disco a memoria. Con índices de tipo columna, sólo se moverán a memoria las columnas necesarias, y por lo tanto se reducirá la presión de memoria, y el acceso a disco

Veamos ahora como podemos crear un índice de este tipo. Como siempre, tenemos dos opciones, crearlo desde la consola gráfica o mediante Transact-SQL.

Para hacerlo desde la consola gráfica, en el menú de creación de índices (botón derecho sobre la carpeta de índices, nuevo índice) nos aparece la opción de crear un índice de almacén de columna:

Una vez elegida esta opción, tendremos un menú de creación de índices, donde elegimos las columnas que van a pertenecer al índice, en nuestro caso vamos a utilizar una columna llamada DNI  

También podemos elegir otras opciones, como el filegroup al que va a pertenecer (en el menú storage) o el máximo número de threads que se van a utilizar en la creación del índice. Es interesante clarificar que este parámetro sólo se utiliza en la creación del índice y no en otras operaciones con este índice.

Si una vez creado el índice hacemos una query que lo utilice, y vemos su plan de acción, veremos la siguiente representación:

Algunas limitaciones de estos índices:

  • Sólo podemos tener un índice por tabla
  • No se pueden realizar modificaciones de forma directa en los datos de tablas que tengan definido uno de estos índices, ni siquiera si no se modifican las columnas incluidas en el índice. Si intentamos realizar esta operación, recibiremos el siguiente error:

Hay un método indirecto para poder realizar inserciones y actualizaciones, que describiremos en el siguiente artículo de esta serie.

  • El índice no puede ser modificado, si necesitamos modificarlo es necesario eliminarlo y recrearlo
  • No es posible realizar una operación de reconstruir el índice; sin embargo, esto no es necesario ya que al no haber modificaciones no se produce fragmentación

¿Debemos crear este tipo de índices en todas las tablas? Mi recomendación es que no se haga así. Como vemos, este tipo de índices resulta ideal para grandes volúmenes de datos que no se modifican (o que se modifican en pocas ocasiones). Sin embargo, para una carga pura OLTP este no es el índice más adecuado. Por lo tanto, dependiendo del tipo de tabla y del tipo de carga serán recomendables o no estos índices.