Cargar registros nuevos y actualizados mediante la carga incremental

Si su app contiene una gran cantidad de datos procedentes de bases de datos fuente que están continuamente actualizándose, cargar el conjunto de datos completo puede consumir mucho tiempo. En este caso solo le interesará cargar registros de la base de datos que sean nuevos o modificados, todos los demás datos ya deberían estar disponibles en la app. La carga incremental, usando archivos QVD, permite lograr esto.

El proceso básicamente es el siguiente:

  1. Cargue datos que sean nuevos o actualizados desde la tabla fuente de la base de datos.

    Este proceso es lento, pero solo cargará un número limitado de registros.

  2. Cargue los datos que ya están disponibles en la aplicación desde el archivo QVD.

    Se cargarán muchos registros, pero este proceso es mucho más rápido.

  3. Crear un nuevo archivo QVD.

    Este es el archivo que utilizará la próxima vez que haga una carga incremental.

  4. Repita este mismo procedimiento para cada tabla que cargue.

Los ejemplos siguientes muestran casos en los que se utiliza la carga incremental. No obstante, podría ser necesaria una solución más compleja, dependiendo de la estructura de la base de datos fuente y el modo de funcionamiento.

  • Anexar solo (normalmente usado para archivos de registro)
  • Insertar solo (no actualizar ni eliminar)
  • Insertar y actualizar (no eliminar)
  • Insertar, actualizar y eliminar

Puede leer archivos QVD en modo optimizado o en modo estándar. (El método empleado es seleccionado automáticamente por el motor Qlik Sense dependiendo de la complejidad de la operación). El modo optimizado es aproximadamente 10 veces más rápido que el modo estándar o aproximadamente 100 veces más rápido que cargar la base de datos de la manera habitual.

Para más información, vea Trabajar con archivos QVD.

Anexar solo

El caso más simple es el de los archivos .log de registro, que solo se anexan y nunca se borran. Las condiciones son las siguientes:

  • La base de datos debe ser un archivo de registro (o algún otro archivo en el que los registros se anexen y no se inserten ni eliminen) que esté contenido en un archivo de texto (ODBC, OLE DB u otras bases de datos no son compatibles).

  • Qlik Sense lleva un registro constante del número de registros leídos previamente y carga solo los registros añadidos al final del archivo.

Example:  

(Windows)

Buffer (Incremental) Load * From LogFile.txt (ansi, txt, delimiter is '\t', embedded labels);

Example:  

(Kubernetes)

Buffer (Incremental) Load * From [lib://MyDataFiles/LogFile.txt] (ansi, txt, delimiter is '\t', embedded labels);

Insertar solo (no actualizar ni eliminar)

Si los datos residen en una base de datos que no es un simple archivo de registro, el anexado no funcionará. No obstante, el problema puede resolverse con un pequeño trabajo extra. Las condiciones son las siguientes:

  • La fuente de datos puede ser cualquier base de datos.

  • Qlik Sense carga los registros insertados en la base de datos tras la última ejecución de script.

  • Se requiere un campo ModificationTime (o similar) para que Qlik Sense reconozca qué registros son nuevos.

Example:  

(Windows)

QV_Table:

SQL SELECT PrimaryKey, X, Y FROM DB_TABLE

WHERE ModificationTime >= #$(LastExecTime)#

AND ModificationTime < #$(BeginningThisExecTime)#;

 

Concatenate LOAD PrimaryKey, X, Y FROM File.QVD;

STORE QV_Table INTO File.QVD;

 

Los signos hash en la cláusula SQL WHERE definen el inicio y fin de una fecha. Compruebe en el manual de su base de datos la sintaxis de fecha correcta de su base de datos.

Example:  

(Kubernetes)

QV_Table:

SQL SELECT PrimaryKey, X, Y FROM DB_TABLE

WHERE ModificationTime >= #$(LastExecTime)#

AND ModificationTime < #$(BeginningThisExecTime)#;

 

Concatenate LOAD PrimaryKey, X, Y FROM [lib://MyDataFiles/File.QVD];

STORE QV_Table INTO [lib://MyDataFiles/File.QVD];

 

Los signos hash en la cláusula SQL WHERE definen el inicio y fin de una fecha. Compruebe en el manual de su base de datos la sintaxis de fecha correcta de su base de datos.

Insertar y actualizar (no eliminar)

En este caso los datos de registros previamente cargados pueden haber sido modificados entre las diversas ejecuciones de script. Las condiciones son las siguientes:

  • La fuente de datos puede ser cualquier base de datos.

  • Qlik Sense carga los registros insertados o actualizados en la base de datos tras la última ejecución de script.

  • Se requiere un campo ModificationTime (o similar) para que Qlik Sense reconozca qué registros son nuevos.

  • Se requiere un campo clave primario para que Qlik Sense ordene los registros actualizados del archivo QVD.

  • Esta solución obligará a la lectura del archivo QVD en modo estándar (en lugar de optimizado), lo cual es considerablemente más rápido que cargar toda la base de datos.

Example:  

(Windows)

QV_Table:

SQL SELECT PrimaryKey, X, Y FROM DB_TABLE

WHERE ModificationTime >= #$(LastExecTime)#;

 

Concatenate LOAD PrimaryKey, X, Y FROM File.QVD

WHERE NOT Exists(PrimaryKey);

WHERE NOT Exists(PrimaryKey);

 

STORE QV_Table INTO File.QVD;

Example:  

(Kubernetes)

QV_Table:

SQL SELECT PrimaryKey, X, Y FROM DB_TABLE

WHERE ModificationTime >= #$(LastExecTime)#;

 

WHERE NOT Exists(PrimaryKey);

Concatenate LOAD PrimaryKey, X, Y FROM [lib://MyDataFiles/File.QVD];

WHERE NOT Exists(PrimaryKey);

 

STORE QV_Table INTO [lib://MyDataFiles/File.QVD];

Insertar, actualizar y eliminar

El caso más difícil de manejar se da cuando los registros han sido realmente eliminados de la base de datos fuente entre ejecuciones de script. Las condiciones son las siguientes:

  • La fuente de datos puede ser cualquier base de datos.

  • Qlik Sense carga los registros insertados o actualizados en la base de datos tras la última ejecución de script.

  • Qlik Sense elimina los registros borrados de la base de datos tras la última ejecución de script.

  • Se requiere un campo ModificationTime (o similar) para que Qlik Sense reconozca qué registros son nuevos.

  • Se requiere un campo clave primario para que Qlik Sense ordene los registros actualizados del archivo QVD.

  • Esta solución obligará a la lectura del archivo QVD en modo estándar (en lugar de optimizado), lo cual es considerablemente más rápido que cargar toda la base de datos.

Example:  

(Windows)

Let ThisExecTime = Now( );

 

QV_Table:

SQL SELECT PrimaryKey, X, Y FROM DB_TABLE

WHERE ModificationTime >= #$(LastExecTime)#

AND ModificationTime < #$(ThisExecTime)#;

 

Concatenate LOAD PrimaryKey, X, Y FROM File.QVD

WHERE NOT EXISTS(PrimaryKey);

 

Inner Join SQL SELECT PrimaryKey FROM DB_TABLE;

 

If ScriptErrorCount = 0 then

STORE QV_Table INTO File.QVD;

Let LastExecTime = ThisExecTime;

End If

Example:  

(Kubernetes)

Let ThisExecTime = Now( );

 

QV_Table:

SQL SELECT PrimaryKey, X, Y FROM DB_TABLE

WHERE ModificationTime >= #$(LastExecTime)#

AND ModificationTime < #$(ThisExecTime)#;

 

Concatenate LOAD PrimaryKey, X, Y FROM [lib://MyDataFiles/File.QVD]

WHERE NOT EXISTS(PrimaryKey);

 

Inner Join SQL SELECT PrimaryKey FROM DB_TABLE;

 

If ScriptErrorCount = 0 then

STORE QV_Table INTO [lib://MyDataFiles/File.QVD];

Let LastExecTime = ThisExecTime;

End If