Share via


Volver al Índice | Anterior: Índices de almacén de columnas. | Siguiente: Contained database (Base de datos autocontenida)

Índices de almacén de columnas, Actualizaciones de la tabla

Autora: Raquel Vicente de la Rosa

En el artículo anterior vimos en qué consiste un índice de almacén de columnas y cómo no se permite realizar operaciones directas de update o insert en una tabla que tiene un índice de este tipo.

Sin embargo, sí tenemos un mecanismo que nos permite insertar o actualizar estas tablas, veamos como:

  1. La situación actual es una tabla con un índice en la columna DNI:

  2. El mecanismo que vamos a utilizar para mover los datos de la tabla auxiliar a la tabla principal es el intercambio de particiones, por lo que previamente debemos haber creado una partición. Si no hubiésemos creado la partición antes de crear el índice de columna, será necesario eliminar el índice y recrearlo después de haber creado la partición.

    Vamos a crear una partición siguiendo el asistente:


    Al entrar en este asistente, tras la pantalla de bienvenida, podemos elegir qué columna va a ser la que defina la partición. En nuestro caso, vamos a utilizar la columna id que además es nuestra clave primaria.


    A continuación elegimos una nueva función de partición, a la que llamaremos func_id:

    Y daremos un nuevo nombre al esquema de partición:

    Y elegiremos qué parte de la tabla pertenecerá a cada una de las particiones. En nuestro caso vamos a definir el límite entre las particiones como el mayor valor de la clave primaria (id) que tenemos en la tabla original. Para ambas partes vamos a utilizar el mismo Filegroup, ya que en este caso no pretendemos utilizar las particiones para repartir entre discos, sino simplemente para intercambiarla.

    Si queremos aprovechar la partición para separar en distintos grupos de archivos, se puede hacer sin problema.

    Al terminar el asistente nos creará un script, que una vez ejecutado nos habrá particionado la tabla.

    Si se inicia este asistente con un índice de almacenamiento de columna ya creado, este script incluirá la eliminación y recreación del mismo, por lo que la ejecución puede ser larga si la tabla tiene muchos datos.

  3. Para realizar una inserción, creamos una tabla auxiliar con el mismo esquema:
    create table aux ( idint primary key , nombrechar ( 15 ), DNIbigint )

  4. A continuación, insertamos en esta tabla los datos deseados:

  5. Una vez que tenemos datos en esta tabla, podemos crear un índice de almacén de columnas similar al de la tabla principal. Podemos hacerlo siguiendo el asistente (ver artículo anterior) o con Transact-SQL:

    create nonclustered columnstore index [idx_columna] ONdbo . aux

    ( DNI )

    WITH ( DROP_EXISTING = OFF ) ON PRIMARY

  6. En este punto ya podríamos realizar el intercambio de particiones. Sin embargo para prepararnos para futuras inserciones de datos, nos conviene dividir la segunda partición, de manera que nos queden en total 3 particiones: la de los datos originales, la de los datos insertados y una tercera vacía preparada para futuras inserciones:

    ALTER PARTITIONscheme esquema_auxnextused [PRIMARY]

    GO

    ALTER PARTITION functionfunc_id () splitrange ( 3 )

    go

  7. Para poder intercambiar la tabla auxiliar por la segunda partición de la tabla principal, necesitamos añadir una restricción que nos asegure que todos los datos van a pertenecer a la segunda partición:

    ALTER TABLEauxwith check add constraint [CK_aux] CHECK (( id > 1 )and ( id <= 3 ))

    GO

    ALTER TABLEauxcheck constraintCK_Aux

  8. Por último, realizamos un intercambio de particiones, ejecutando:

    ALTER TABLEaux switchtoDWpartition$partition . func_id ( 3 )

  9. Podemos observar que los datos han sido insertados y que la tabla auxiliar está vacía, por lo que podemos pasar a eliminarla:


  10. Para la siguiente inserción, sólo tendríamos que repetir los pasos 3-9, siempre y cuando hayamos tenido en cuenta el paso 6, ya que si no hemos dejado ninguna partición vacía no podremos seguir realizando inserciones por este método.

¿Cómo podríamos realizar actualizaciones? De forma similar, pero primero tendríamos que mover la partición en la que se encuentren los datos a modificar a una tabla vacía, en la que eliminaríamos el índice y modificaríamos los datos. A partir de este momento volveríamos a insertar los datos como hemos descrito aquí.

Como podemos ver, este método no es factible para modificaciones constantes, por lo que de nuevo observamos que este tipo de índices es óptimo para grandes volúmenes de datos que no varíen mucho, como ya comentamos en el artículo anterior de esta serie. El escenario más típico para su uso es una base de datos que se va a utilizar como histórico en el que se hacen inserciones de forma programada (por ejemplo, una vez a la semana).