Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Tengo una conexión a SQL en Qlik Cloud, la tabla resultante tiene aproximadamente 6 millones de datos. Normalmente tardaba 1 hora en realizar la recarga, de un momento a otro el tiempo de recarga aumento al punto de que el script de carga aborta por exceder el tiempo máximo (3 horas). Hablé con los dueños de la base de datos y ellos me indican que no se realizó ninguna modificación en esta. Por otro lado, al realizar esta misma conexión pero en Qlik Sense On Premise la recarga de datos se completa satisfactoriamente.
¿A qué se puede deber esto?
Hola, habría algunas cosas a modificar, lo primero sería intentar recuperar la fecha más alta ya almacenada en el qvd, de otra forma puede que acabes con registros duplicados en el qvd, tal como stá si lanzas la recarga 2 veces en el mismo día habrá registros que se carguen más de 1 vez.
Hay diferentes opciones para esto, por dejarlo simple, primero recupera la fecha más alta cargada en el qvd, y foramtea una variable con la fecha tal como la necesite el where del SQL y otra para el where del qvd
tmpMaxFecha:
LOAD Max(Log_Fecha_m) as MaxFecha
FROM [lib://Data - Conexiones:DataFiles/Incremental2025.qvd]
(qvd);
LET vMaxFechaSQL=Date(Peek('MaxFecha',0,'tmpMaxFecha'),'DD/MM/YYYY');
LET vMaxFechaQVD=Num(Peek('MaxFecha',0,'tmpMaxFecha'));
DROP Table tmpMaxFecha;
El formato de fecha de SQL es solo un ejemplo, usa el que te pida la SQL, así puedes usar directamente el resultado en el 'where':
WHERE Log_fecha_m >= $(vMaxFecha)
o si por ejemplo la bd pide la fecha entre comillas simples: WHERE Log_fecha_m >= '$(vMaxFecha)'
Y por último en el concatenate, indica el nombre de la tabla, para que si hay algún campo nuevo no te cree una tabla nueva, y aplica también un where para añadir solo registros menores a la fecha:
Concatenate (DataActual)
LOAD
... (qvd)
Where Log_fecha_m<$(vMaxFechaQVD);
Si el qvd al final va a incluir datos de varios años, evitaría lo de '2025' en el nombre.
Hola, si desde el cloud tardaba 1 hora y de luego pasa a 3, así de primeras parece que algo está afectando a la comunicación entre la bd y cloud. ¿Para la conexión estás usando Data Gateway?
Podrías probar a hacer una carga limitada para comprobar si tamaños más reducidos también tarda más. O grupos de datos, para descartar que solo ocurra cuando se cargan ciertos registros.
Y tanto para un caso como para otro, una carga de 1 hora es para pensar en alternativas que permitan una carga incremental ¿No hay algún registro de última actualización, o un id, o algo similar que permita recuperar solo los nuevos registros? Si también hay borrados también necesitaras recupera todos los registros, pero solo el campo que identifique el registro, para quitarlo de los qvds con los datos completos.
Estoy usando el conector directo de SQL SERVER a la base, no estoy utilizando via Data Gateway.
Intenté cargando menos datos, pero el tiempo de respuesta es el mismo.
Tengo un campo en la base de datos que me entrega el Log del movimiento. Estuve haciendo cargas parciales de los datos anteriores a HOY, pero ahora como hago una carga incremental en Qlik? O esto debe ser directamente en SQL?
Puede que algo esté interfiriendo en la comunicación entre Qlik y SQL, podrías probar a configurar DataGateway para ver si así funciona más rápido, además es un método más seguro porque puedes evitar tener la BD accesible directamente desde el cloud.
Sobre la carga incremental, se realiza usando qvds que vayan almacenando datos históricos, así al SQL solo le pides los datos actualizados, y el resto lo añades del qvd. Se hace bastante más lento si también tienes que controlar los borrados, porque en ese caso necesitas recuperar todos los ids, pero al tener que traer solo 1 campo de cada registro, sigue siendo más rápido que cargar todo siempre.
Tienes unos ejemplos de como aplicar la carga incremental en la ayuda: https://help.qlik.com/es-ES/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/use-QVD-files-i...
El script lo realicé de la siguiente manera. ¿Crees que está correcto? ¿O tienes alguna sugerencia al respeto? Muchas gracias
LIB CONNECT TO 'Azure_SQL_Database_xx';
[DataActual]:
SQL SELECT *
FROM base_de_datos
WHERE Log_fecha_m >= DATEADD(DAY, -1, CAST(GETDATE() AS DATE))
AND Log_fecha_m < CAST(GETDATE() AS DATE);
Concatenate
LOAD
*
FROM [lib://Data - Conexiones:DataFiles/Incremental2025.qvd]
(qvd);
STORE [DataActual] into [lib://Data - Conexiones:DataFiles/Incremental2025.qvd] (qvd);
Hola, habría algunas cosas a modificar, lo primero sería intentar recuperar la fecha más alta ya almacenada en el qvd, de otra forma puede que acabes con registros duplicados en el qvd, tal como stá si lanzas la recarga 2 veces en el mismo día habrá registros que se carguen más de 1 vez.
Hay diferentes opciones para esto, por dejarlo simple, primero recupera la fecha más alta cargada en el qvd, y foramtea una variable con la fecha tal como la necesite el where del SQL y otra para el where del qvd
tmpMaxFecha:
LOAD Max(Log_Fecha_m) as MaxFecha
FROM [lib://Data - Conexiones:DataFiles/Incremental2025.qvd]
(qvd);
LET vMaxFechaSQL=Date(Peek('MaxFecha',0,'tmpMaxFecha'),'DD/MM/YYYY');
LET vMaxFechaQVD=Num(Peek('MaxFecha',0,'tmpMaxFecha'));
DROP Table tmpMaxFecha;
El formato de fecha de SQL es solo un ejemplo, usa el que te pida la SQL, así puedes usar directamente el resultado en el 'where':
WHERE Log_fecha_m >= $(vMaxFecha)
o si por ejemplo la bd pide la fecha entre comillas simples: WHERE Log_fecha_m >= '$(vMaxFecha)'
Y por último en el concatenate, indica el nombre de la tabla, para que si hay algún campo nuevo no te cree una tabla nueva, y aplica también un where para añadir solo registros menores a la fecha:
Concatenate (DataActual)
LOAD
... (qvd)
Where Log_fecha_m<$(vMaxFechaQVD);
Si el qvd al final va a incluir datos de varios años, evitaría lo de '2025' en el nombre.