Actualmente, para los que utilizamos SAP Hana y nos encontramos con el “clásico” problema de optimización de memoria sabemos que es un dolor de cabeza, ya que necesitamos estar dando de  baja tablas columnares de la memoria, ser muy cuidadosos en el uso de variables tabla dentro de un Store Procedure, etc. Pero ¿Cómo dar de baja una tabla de memoria?, ¿se puede bajar de memoria una vista?, ¿se puede bajar de memoria una variable tabla dentro de un Store Procedure?

Para contestar las preguntas anteriores tenemos que saber cosas muy básicas sobre qué tipo de objetos se pueden bajar de la memoria:

  1. Tabla fila: No se puede bajar de la memoria a menos que se transforme a columnar o se borre.
  2. Tabla columnar: Sí se puede bajar de memoria y subir las veces que sean necesarias, esto se hace con simple código en SQL.
  3. Vistas calculadas o analíticas: Sí se puede bajar de memoria, sin embargo, no se puede hacer desde código en SQL, si se tiene una versión menor a la 2, del Hana Studio, se tiene que instalar Eclipse Sap Hana Tools, y se muestra una opción que se llama “Cache invalidation period” que tiene que tener un valor distinto de nulo en las opciones de las vistas para que baje la memoria de los resultados de éstas.
  4. Variables tabla: Estrictamente, no se pueden bajar directamente de memoria, cuando termina de ejecutarse el SP, paulatinamente se “desinfla” la memoria, esto puede llegar a durar días o nunca eliminarse, una forma de eliminar esta memoria, si es que fuera demasiada, es reiniciando el servidor de Hana, y tal vez sea muy drástico hacer eso. Para los que utilicen muchos Store Procedures en Hana y les guste utilizar variables tabla, se recomienda utilizar tablas columnares, en lugar de variables tabla, si se va a crear la tabla dentro del Store Procedure, tiene que ser con SQL dinámico, se recomienda tener la tabla creada y utilizar la sentencia “INSERT INTO y DELETE” para no utilizar SQL dinámico.

 

¿Cómo se baja de memoria una tabla columnar?

Para bajar una tabla columnar de memoria, se hace a través de una sentencia dentro del editor de SQL. Es una sentencia muy sencilla: “unload <<nombre esquema>>.<<nombre tabla>>”.

Cabe mencionar que esta sentencia no funciona dentro de un SP, a menos que se utilice SQL dinámico. A continuación pondré un ejemplo de Store Procedure que se puede ser muy útil para dar de baja la memoria de tablas columnares de ciertos esquemas cuando se requiera:

DROP PROCEDURE unload_memory; 
CREATE PROCEDURE unload_memory 

/*( out out_t varchar(600) )*/ 

LANGUAGE SQLSCRIPT SQL SECURITY INVOKER as BEGIN 
DECLARE table_name nvarchar(513) ARRAY; --se declara el arreglo con contenido de texto de hasta 513 caractéres 
declare n_v int; -- Se declara variable entera donde va el númemro de tablas a dar de baja. 
declare t_name nvarchar(513); -- Se declara variable caractér con capacidad de 513 caracteres 
declare i int;-- se declara variable entera para iteración de tablas a bajar de memoria 
tablas=select schema_name||'.'||table_name as name from SYS.M_CS_TABLES 
where SCHEMA_NAME IN ('PROC_STG1', 'PROC_STG2', 'CMIRANDA', 'PROC_STG_PHP') 
and memory_size_in_total>0; --se crea la variable tabla "tablas" donde se concatena el nombre de schema y nombre de tabla con los filtros correspondientes en los esquemas, además filtrando todas aquellas tablas que utilizan memoria. 

select count(1) into n_v from :tablas; --se carga en la variabla n_v el número de tablas a dar de baja 
table_name:=ARRAY_AGG(:tablas.name); -- se agregan los nombres de tabla en el arreglo 
:table_name para después iterarse For i in1 ..:n_v -- se itera de 1 a :n_v 
DO t_name:= 'unload '||:table_name[:i]; -- se crea la sentencia "unload <>.<>" para después ejecutarse en sql dinámico con la sentencia "EXEC" 
EXEC :t_name; --se ejecuta la sentencia creada en el paso anterior (Esto es SQL dinámico) 
end for; 
end; 
call unload_memory; --con esta sentencia se manda llamar el store procedure

 

Es claro que se puede modificar el SP de tal forma de que se muestre el monto de memoria liberado, la tabla “SYS.M_CS_TABLES” tiene una columna con nombre “MEMORY_SIZE_IN_TOTAL”, es ésta la que se tiene que sumar para saber cuánto se redujo de memoria. Es importante que el usuario que quiera descargar memoria dentro de ciertos esquemas tenga los privilegios suficientes.

Este ejemplo de Store Procedure sirve para ilustrar un poco, cómo gestionar la liberación de memoria.

Si se tuviera una replicación de alguna base, se sugiere liberar memoria cuando se vaya a ejecutar un proceso pesado.

 

¿Tú cómo administras la memoria cuando trabajas con SAP Hana?