Optimización módulos Qlikview

Días atrás comentamos cómo optimizar un servidor de Qlikview para mejorar el rendimiento y consumo de memoria RAM. En esta ocasión, os mostramos recomendaciones para un correcto desarrollo del script y diseño de interfaces de usuario.

Buenas prácticas en desarrollo de módulos en Qlikview

  • Eliminar claves sintéticas del modelo de datos
  • Eliminar loops del modelo de datos
  • Utilizar QVDs cuando sea posible y con el parámetro OPTIMIZED
  • Utilizar campos numéricos para cruzar tablas
    Mediante tablas maestras o lookup en el modelo
  • «Autonumber» para reemplazar claves concatenadas (claves combinando campos para romper tablas sintéticas).
    Esta función genera una clave numérica única por cada valor diferente de un campo. En el caso de claves concatenadas, asigna a cada par un número determinado. Se utiliza pasando como parámetro los campos concatenados, por ejemplo: autonumeric(COD_CAMPO_1 + COD_CAMPO_2)
  • Eliminar la hora de los campos de fecha
    Formateando desde el script estos campos como DATE en lugar de DATETIME. Desde SQL con la sentencia CAST(XXXX as DATE) y en Qlikview DATE(XXX) o FLOOR(XXX). Si es necesaria la hora, se puede mostrar en otro campo.
  • Eliminar campos y tablas lookup no utilizados del modelo de datos
  • Usar flags numéricos cuando sea posible
    Primar el uso de booleanos (1 o 0) en lugar de “S”/”N” o “SI”/”NO”
  • Evitar usar SELECT * en queries
    En su lugar, recuperar sólo los campos de BD que vayamos a leer en el script.
  • Utilizar variables para expresiones recurrentes
  • Reducir expresiones con «count distinct»
    Una alternativa es reemplazarla por un SUM() de un flag configurado a nivel de script.
  • Reducir uso de IF anidados
    Los IF anidados suponen un uso intensivo de memoria y CPU. Intentar trasladar esta lógica a nivel de script o reducir las evaluaciones.
  • Evitar IF en expresiones de Gráficos o tablas
    Es importante evitar utilizar los IF en los títulos de tablas, CONDITIONS para mostrar un objeto y textbox.
  • Reducir comparativa entre campos de tipo texto
    Utilizando siempre que sea posible tablas lookup o bien fabricar una clave numérica con la función autonumeric.
  • Eliminar o reducir uso de MACROS
  • Reducir uso de Show Frequency (Presentation)
    Se utiliza normalmente en los MultiBox y ListBox.
  • Reducir el número de objetos de cada hoja
    Eliminar objetos redundantes u ocultos. Administrar correctamente el uso de charts, textbox, etc.
  • Minimizar uso de Set Analysis en tablas grandes
  • Reducir uso de tablas pivotantes en aplicaciones grandes
  • Evitar funciones al vuelo como «inmonth», etc
  • Utilizar cargas de datos binarias de periodos históricos o datos no sensibles a cambio
  • Reducir número de CHART abiertos en cada hoja
    En su lugar, mostrarlos minimizados si es posible.
  • Calculate Condition para limitar datos en tablas y charts
  • Utilizar variables o set analysys en lugar de cálculos complejos en las expresiones

Recomendaciones: expresiones

Count ( Distinct ‘FieldName’)

Reemplazar el count() por un sum() y el cualificador “distinct” por el valor número 1 para cada ocurrencia distinta del campo.

Load
Alfa,
if (peek('Alfa')=Alfa,0,1) as Flag1,
Num
resident table_1
order by Alfa Asc;

En este caso, la función PEEK compara cada valor del campo “Alfa” con el valor leído anteriormente. Si los valores son iguales, se asigna un 0, si son diferentes, se asigna un 1. El número de valores distintos será sum(Flag1). Es importante que la tabla esté ordenada por el campo Alfa.

Otra alternativa es una query sencilla con los distintos valores:

Load
Distinct Alfa,
Alfa as AlfaDist
resident table_1;

If ( Condition(Text),…..)

Mapear los campos de tipo texto a números. Por ejemplo, utilizando la función Autonumber. La expresión de esta forma sería: If (Alfa= ‘ABC’, ‘ABC’, left (Alfa, 2)).

Load
*,
Alfa = ‘ABC’, 1, 0) as Flag
resident table_1 ;

La expresión cambiaría a  If ( Flag = 1,’ABC’, left (Alfa, 2))

Sum ( If (Condition, ‘FieldName’…))

En este caso la agregación se hace en tiempo de ejecución y repercute en el consumo de memoria. Si es posible, es preferible hacer el cálculo a nivel de SCRIPT.

If ( Condition1, Sum(‘FieldName’),

La lógica de IF anidados es conceptualmente sencilla, pero normalmente es complicado administrarla. Una gran cantidad de IF anidados supone un uso intensivo de CPU y memoria. Es recomendable revisar los IF anidados para intentar reducir el número de anidaciones. Otra opción es cuando sea posible, sustituir los IF por variables, por ejemplo Quantity*Price donde Price es una variable.

Sort text

QV automáticamente evalúa si un campo debe tratarse como número, texto o “general”. Los campos evaluados como texto se ordenan como text, que es la forma más lenta. Esto puede reemplazarse manualmente desde el script.

Dynamic captions and text objects

Se pueden utilizar expresiones en prácticamente cualquier objeto que permita introducir texto. Una expresión se evalúa en función de su entorno, por ejemplo, si están definidas en un gráficos o tablas (pivotantes o straight) sólo se calculan cuando estos objetos están activos (no cuando están minimizados). Por otro lado, si tenemos expresiones en el título de un objeto, en el show o calculation condition se evalúan cada vez que se hace una selección.

Macro triggers ( «on change» )

Cuidado con lanzar macros en cascada o de forma recursiva generando bucles.

Checklist de optimización módulos Qlikview

En uno PDF de documentación oficial de Qlikview se distribuye una hoja excel muy útil para el equipo de desarrollo a modo de checklist de los elementos que hay que revisar para garantizar una buena optimización de un módulo. Podéis descargar la versión traducida al castellano desde aquí.

Checklist optimización módulo qlikview

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

What is 12 + 15 ?
Please leave these two fields as-is: