2 de marzo de 2014

Apuntes sobre Performance


APUNTES PARA PERFORMANCE DEL MODELO DE DATOS
1. Eliminar información no utilizada

- Campos no utilizados en la aplicacion final (en objetos, gráficos o variables).
- Datos históricos de años anteriores con información no analizada en la aplicación.
- Máximo nivel de detalle no analizado en la aplicación.

- Considerar usar una Aplicación totalizada por mes (con menos registros) y de ésta acceder a otra Aplicación con detalle diario (con todos los registros). Esto usando técnica Document Chaining (Ver Ref. No.16).
2. El qvw con las visualizaciones 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 y buscar columna "No.Distinct" para identificar distinct en cada campo creado.
    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 debe tener  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 muchos:muchos. Hacer "Perfect Key" en una de las tablas, donde sea posible. Para identificar 
"Perfect Key" ver nota publicada aqui.  Ver Ref. No.12

APUNTES PARA PEFORMANCE DE LA APLICACION 
1. Evitar 
Distinct en expresiones, ya que es un calculo forzado a un solo procesador, en vez de ser multiprocesadores. Ver Ref. No.12 y No.13 
2. En qlikview 8.5, 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. En qlikview 9 o superior, sustituir sum(campo) por count(campos). Ver Ref. No.15
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. Ver Ref. No.14
    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 LA 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. Mantener las cargas "qvd optimized" cuando sea posible. 
    
Link de técnicas para mantener "qvd optimized"

1 comentario:

Anónimo dijo...

Gracias por la información que nos brindas en este blog (y)