Cuando se usan tablas muy grandes y se tiene el problema de minimizar la memoria a toda costa es necesario saber qué tipo de tablas se tienen en SAP Hana y cómo funcionan.

En este artículo sólo me enfocaré en minimización de uso de memoria usando tablas columna y tablas fila, no hablaré sobre vistas.

¿QUÉ ES UNA TABLA COLUMNA?

Una tabla columna es una tabla donde sus registros se almacenan en una sucesión de columnas, es decir, los registros de una columna son almacenados en espacios de memoria contiguos.

¿QUÉ ES UNA TABLA FILA?

Una tabla de filas es una tabla donde sus registros se almacenan en una sucesión de filas.

EJEMPLO:

Si se tiene una tabla de n \times m, (filas x columnas) En una tabla columnar los registros estarían almacenados así:  k_1, k_2, \ldots, k_m, donde  m_i  es la columna i  con n  datos para todo i  que va de  1,\ldots, m  , o que es lo mismo en la primera entrada todos los registros de la primera columna, en la segunda entrada, todos los registros de la segunda columna y así sucesivamente.

En una tabla fila los registros estarían almacenados de la siguiente manera:  z_1, z_2, \ldots, z_m , donde z_j  contiene los m  registros de la fila j  para todo j  de 1,\ldots,n  .

Como expliqué en un artículo anterior, cuando se tienen tablas columnares la memoria de éstas puede ser gestionada, es decir, se puede no utilizar memoria cuando no se usen dichas tablas, cosa contraria con las tablas fila. Se pueden transformar tablas de fila a tablas columna y viceversa con el comando “ALTER TABLE <<nombre de la tabla>> ROW” en caso de que se quiera transformar de columnar a fila ó “ALTER TABLE <<nombre de la tabla>> COLUMN” para transformar de columnar a fila.

Ahora bien, qué ventajas se tienen al usar uno u otro tipo de tabla.

VENTAJAS TABLA COLUMNAR:

Acceso de datos más rápido: Sólo las columnas utilizadas serán leídas durante una consulta. Cualquier columna puede servir como índice.

Mejor compresión: Se puede comprimir mejor ya que cada columna contiene menos datos distintos (comparado con el número de filas).

Mejor procesamiento en paralelo: En una tabla columna, los datos se particionan verticalmente, esto significa que operaciones en columnas distintas pueden ser procesadas en paralelo. Si múltiples columnas necesitan ser buscadas o agregadas, cada una de estas operaciones puede ser asignada a un procesador diferente.

DESVENTAJAS DE UNA TABLA COLUMNAR:

En ciertas operaciones se genera mucha más memoria que si se hiciera la misma operación con tablas fila.

Es un poco más complicado hacer un insert o update de varias filas.

VENTAJAS TABLAS FILA:

Más fácil de procesar un solo registro como hacer un insert o un update.

DESVENTAJAS TABLAS FILA

Que no se puede gestionar su memoria

Si se requiere hacer una agregación, en una búsqueda se tienen que leer todas las columnas de una fila.

 

¿CUÁNDO USAR UNA TABLA FILA Y CUÁNDO USAR UNA TABLA COLUMNA?

Esta pregunta la responderé por casos:

Caso 1: Si el uso de memoria no es un factor, y se puede tener un uso “ilimitado” de memoria, usar siempre tablas de columna.

Caso 2: Si el uso de memoria es limitado y no puede exceder cierta cantidad de bloques, es recomendable en algunas operaciones usar tablas de fila. A continuación mostraré un ejemplo real de transformación de tablas, fila y columna para una operación en concreto:

En algunos casos, se utiliza SAP Hana para procesar información y entregar reportes, supongamos lo siguiente:

  1. El reporte que se tiene que entregar tiene que llevar un formato especial, y la única forma de crear el formato de salida es concatenando todas las columnas de una tabla para generar una tabla con una sola columna, es decir, con varias columnas juntas y todos los registros.
  2. Se tienen 20 columnas que en conjunto ocupan 252 caracteres al concatenarse.
  3. El reporte a entregar es de al menos 50 millones de registros.
  4. Sólo tenemos dos bloques de memoria y la operación no puede exceder estos dos bloques de 64 GB.

¿Qué se puede hacer?

Si la tabla final a concatenar es columnar y se intenta crear el formato a partir de ésta, la tabla con todas sus columnas concatenadas se excederán los bloques, de hecho al menos, de pura memoria de ejecución se consumirán más de dos bloques.

Ahora, si transformamos la tabla columnar a tabla fila, se generarán como 60 GB de ejecución en la operación, pero no se exceden los dos bloques (tomando en cuenta que se tienen utilizados por mucho 50 gb), ahora si se concatenan todas las columnas en la tabla fila, sorprendentemente la memoria de pura ejecución no excederá los 30 GB, que, comparado con los más de 128 GB es muy inferior. Pero ¿Qué pasa si la tabla fila la queremos regresar a la tabla columna?, en este caso la pura transformación ocupa en promedio 110 GB, lo cual no nos sirve ¿Cómo hacemos para regresar la tabla fila a la columna? En este caso lo que hice fue borrar la tabla fila y volverla a generar como lo había hecho originalmente, con esto nos ahorramos toda la memoria, la tabla original sigue siendo columnar y se puede gestionar su memoria, y se creó la tabla con todas las filas concatenadas, todo dentro de dos bloques.

 

En resumen, si no se tiene restricción de memoria y sí se tiene urgencia de tiempo, usar tablas columnares para todo es la opción, por el contrario, si se tiene restricción de memoria, urgencia de tiempo se tienen que analizar las operaciones a realizar para saber qué tipo de tabla utilizar, en el ejemplo se vio que si se concentran muchas columnas la memoria se irá al cielo, pero si lo hacemos a través de tablas filas la memoria de ejecución se estabilizará y será mucho menor. Siempre y en todo momento, es muy recomendable tener todas las tablas columnares para gestionar su memoria cuando no se ocupen, sólo hay saber cuándo transformarlas a fila para ciertas operaciones como concatenación de variables, si se van a hacer muchos updates o inserts, hay que analizar muy bien cuánto nos contaría transformar de columna a fila y viceversa contra la memoria y el tiempo que se ocupa en hacer un update o insert, mi opinión es que se haga sobre tablas columnares.