Utilización de archivos QVD para carga incremental
La carga incremental es una tarea bastante frecuente en bases de datos. Consiste en cargar exclusivamente los registros nuevos o modificados de la base de datos. Los demás debieran estar ya disponibles, de un modo u otro. Con Archivos QVD es posible realizar una carga incremental en la mayoría de casos.
El proceso básicamente es el siguiente:
1. Cargue los datos nuevos de la tabla de la base de datos (el proceso es lento, pero es un número limitado de registros).
2. Cargue los datos antiguos del archivo QVD (son muchos registros, pero es un proceso mucho más rápido).
3. Cree un nuevo archivo QVD.
4. Repita este mismo procedimiento para cada tabla que cargue.
La complejidad de la solución depende de las condiciones particulares de cada base de datos fuente, pero podemos plasmar los siguientes casos como los más frecuentes:
1) Caso 1: Anexar sólo (normalmente archivos de registro
2 Caso 2: Insertar sólo (No Actualizar o Borrar).
3 Caso 3: Insertar y Actualizar (No Borrar).
4 Caso 4: Insertar, Actualizar y Borrar
A continuación encontrará diversas soluciones para cada uno de estos casos. Se pueden leer archivos QVD en el modo optimizado o en el modo estándar. (El método empleado lo selecciona automáticamente el motor de script QlikView dependiendo de la complejidad de la operación). El modo optimizado es (muy aproximadamente) unas 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 manera ordinaria.
Caso 1: Anexar sólo
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 log (o algún otro archivo en el que los registros se anexen y no inserten o eliminen) el cual esté contenido en un archivo de texto (no ODBC/OLE DB).
-
QlikView lleva un registro constante del número de registros leídos previamente y carga sólo los registros añadidos al final del archivo.
Ejemplo:
Buffer (Incremental) Load * From LogFile.txt (ansi, txt, delimiter is '\t', embedded labels);
Caso 2: Insertar sólo (No Actualizar o Borrar).
Si los datos residen en una base de datos que no es un simple archivo de registro, el modelo del caso 1 no funcionará. El problema puede no obstante resolverse con un pequeño trabajo extra. Las condiciones son las siguientes:
-
La fuente de datos puede ser cualquier base de datos.
-
QlikView carga los registros insertados en la base de datos tras la última ejecución de script.
-
Se requiere una Fecha de Modificación de campo (o similar) para que QlikView sepa cuales son los registros nuevos.
Ejemplo:
QV_Table:
SQL SELECT PrimaryKey, X, Y FROM DB_TABLE
WHERE ModificationTime >= #$(LastExecTime)#
AND ModificationTime < #$(BeginningThisExecTime)#;
Concatenate LOAD PrimaryKey, X, Y FROM File.QVD (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.)
Caso 3: Insertar y Actualizar (No Borrar).
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.
-
QlikView carga los registros insertados o actualizados en la base de datos tras la última ejecución de script.
-
Se requiere una Fecha de Modificación de campo (o similar) para que QlikView sepa cuales son los registros nuevos.
-
Se requiere un campo de clave primaria para que QlikView ordene los registros actualizados del archivo QVD.
-
Esta solución hará que la lectura del archivo QVD se haga en modo estándar, en lugar de en modo optimizado (lo cual es, aún así, bastante más rápido que cargar la base de datos completa).
Ejemplo:
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);
STORE QV_Table INTO File.QVD;
Caso 4: Insertar, Actualizar y Borrar
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.
-
QlikView carga los registros insertados o actualizados en la base de datos tras la última ejecución de script.
-
QlikView elimina los registros borrados de la base de datos tras la última ejecución de script.
-
Se requiere una Fecha de Modificación de campo (o similar) para que QlikView sepa cuales son los registros nuevos.
-
Se requiere un campo de clave primaria para que QlikView ordene los registros actualizados del archivo QVD.
-
Esta solución hará que la lectura del archivo QVD se haga en modo estándar, en lugar de en modo optimizado (lo cual es, aún así, bastante más rápido que cargar la base de datos completa).
Ejemplo:
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