Apuntes sobre Performance

    Apuntes para performance del Modelo de Datos

    1. Eliminar información no utilizada
          Histórico años anteriores con información no analizada en la aplicación.
          Máximo nivel de detalle no analizado en la aplicación.
          Campos no utilizados en aplicación.
    2. El qvw del Modelo de Datos debe leer todos los qvd en modo optimizado.
    3. Dividir campo de fecha-hora (01/01/2012 09:30) en dos campos: Fecha y Hora, para disminuir cantidad de distinct.
    4. Para obtener la fecha de un campo, sin la hora, usar floor(campo) en vez de date(campo). Ver ref. No.7
    5.Transformar campos con gran cantidad de Distinct. Para identificar los campos con mayor cantidad Distinct ir a  Configuración>Propiedades del Documento>Tablas
        Ej. Transformar campos de hora en rangos de 30min:
       
    Time(Floor(Hora,0.02083333333333330),'hh:mm') as Hora
    6. Usar
    Autonumber en campos Key muy largos o texto. Para key de dos campos usar Autonumberhash128(campo1,campo2) en sustitución de Autonumber(campo1&campo2). Ver Ref. No.7
    7. Guardar en qvw de forma descomprimida para mejorar velocidad al guardar y abrir el qvw. Ver Ref. No.3
    (ir a Configuración>Propiedades Documento>General>Compresión=Ninguna)
    8. Identificar campos numéricos asignados como Dual de forma automática por qlilkview, y forzar la transformación a números con 
    num(Campo). Para identificar el espacio que ocupa cada campo ir a Configuración>Propiedades Documento>Estadísticas de Memorias.  Guardar el archivo que se genera y abrirlo con Excel. La columna Size identifica el tamaño de cada campo. Un campo numérico con 10 dígitos tiene un tamaño de 4, más de 10 dígitos numéricos tiene 13. Ver ref. No.6 y No.7
    9. Reducir la cantidad de tablas en el modelo, cuando sea posible, para aumentar velocidad cálculos si se tiene memoria disponible (esto aumenta consumo de memoria). En un gráfico con dimensión
    Sucursales  y expresión Sum(Venta), el CPU realiza calculo más rápido si los campos Sucursal y Venta están en misma tabla (aunque consume más memoria), ya que no hace join. A mayor cantidad de tablas intermedias entre los campos Sucursal y Venta, mayor consumo de CPU y mayor el tiempo de cálculo del gráfico.
    10. De ser posible, duplicar tablas de dimensiones en diferentes tablas de hechos, para reducir cantidad de join al hacer cálculos en la Aplicación (útil en modelos con cientos de millones de registros).
    11. Usar el "Document Analyzer" para identificar información no utilizada en un qvw (campos, grupos, variables, y otros). Descargar en
    http://robwunderlich.com/downloads/
    12. Evitar asociar tablas con relación 1:muchos. Hacer "Perfect Key" en una de las tablas, donde sea posible. Ver Ref. No.12

    Apuntes para Performance de la Aplicación
    1. Evitar
    Distinct en expresiones, ya que es un calculo forzado a un solo procesador, en vez de multiprocesadores. Ver Ref. No.12 y No.13
    2. Sustituir los
    Count(Campo) por Sum(Cantidad_Campo) en las expresiones de gráficos, creando un campo de cantidad de registros en la tabla, Ej.  1  as Cantidad_Campo
    3. Sustituir los
    If() de las expresiones por Set Analysis o cálculos con Sum(Campo*Flag). Ver Ref. No.8 y No.12
    4. Crear como variables las expresiones de totales que son usadas en más de un gráfico.
        Ej. Crear la variable vTotalVenta igual a  =Sum(Total Venta).
             Luego sustituir expresiones Sum(Venta)/Sum(Total Venta) por Sum(Venta)/vTotalVenta
    5. Usar autominimizar en gráficos donde sea posible.
    6. Evitar comparación de texto en expresiones (consumen mucho CPU) como if(TipoClielnte='Activo', 1,0). Sustituirlo por un Flag en script. Ver Ref. No.8
    7. Evitar mostrar frecuencia en Cuadros de Lista
    8. Evitar Set Analysis en tablas con cientos de millones de registros.


    Apuntes para mejorar ejecución del Script
    1. Sustituir Resident Load por Precedent Load donde sea posible. Ver Ref. No.9
    2. Sustituir joins por applymap donde sea posible. Ver Ref. No.10 y No.11
    3. Hacer join con Key numéricas, donde sea posible
    4.  Evitar Where en cargas qvd para mantener "qvd optimized". Ver Ref. No.5
            Link de técnicas para mantener "qvd optimized"

                  • Formato a Campo con qvd Optimidez
                  •  Concatenar manteniendo qvd Ootimized
                  • Eliminar Null en Load manteniendo QVD Optimized


       

    Esta nota está publicada en el blog: Qlikview en Español



    Referencia:
    1.
    http://www.citagus.com/citagus/blog/performance-tuning-in-qlikview/
    2.
    http://community.qlik.com/servlet/JiveServlet/download/4556-1-69416/QlikView%20Best%20Practices%20-%20Development%20v0.5%20(1).pdf
    3.
    http://qlikviewnotes.blogspot.com.ar/2011/03/qlikview-compression.html
    4. http://community.qlik.com/thread/18473
    5.
    https://gist.github.com/ralfbecher/7910736
    6.
    http://bi-review.blogspot.com.ar/2013/08/few-tips-for-dealing-with-large.html
    7.
    http://qlikviewnotes.blogspot.com.ar/2008/05/memory-sizes-for-data-types.html
    8.
    http://www.qlikcommunity.com/thread/74494
    9.
    http://community.qlik.com/blogs/qlikviewdesignblog/2013/03/04/preceding-load
    10.
    http://community.qlik.com/blogs/qlikviewdesignblog/2012/09/18/one-favorite-function-applymap

    11. http://www.quickintelligence.co.uk/applymap-is-it-so-wrong/

    12. http://blog.bardess.com/2013/07/03/qlikview-application-performance-tuning/

    13. http://community.qlik.com/thread/50589