Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
Anonymous
Not applicable

Otimização de Carga de Dados

Pessoal, boa tarde!

Qual a melhor maneira para otimizar o tempo da carga de dados?

Estava lendo um pouco sobre os comandos "STORE", "BUFFER LOAD" e por ai vai..

Mas não consegui chegar a nenhum caso em que o qvd realize as seguintes operações:

1. Carregar todos os dados

2. Carregar os dados incrementais

3. Armazenar no qvd

4. Load qvd

Não sei se essa seria a melhor maneira de fazer isso, na verdade, não sei como fazer.

Alguém poderia me dar uma dica?

Grato!

1 Solution

Accepted Solutions
Anonymous
Not applicable
Author

Ótimo Gui...

Então vamos ao trabalho:

Partindo do princípio que você já tem um QVD extraído vamos preparar a carga incremental de atualização.

Inicialmente você coleta a data da última alteração armazenada no qvd e guarda numa variável:

DIRECTORY;
DATA_BASE:
LOAD Max(DATATU ) AS DATA_INI From .\QVDs\QVD_PARA_O_PAINEL.QVD (qvd) Group By; //Esse Load irá pegar a última data de alteração no QVD. Esse endereço indica que o QVD está numa subpasta chamada "QVDs"
LET V_DATA_INI = Date(Peek('DATA_INI', 0), 'DD/MM/YYYY hh:mm:ss[.fff]');    //Pode parecer redundância formatar um campo de data como data mas assim nos dá mais segurança na cópia dos dados para a variável
DROP Table DATA_BASE;    //Depois apagamos a tabela que foi criada unicamente para coletar a data mais atual registrada no qvd

Logo depois você pega o SQL que gerou o qvd original e adiciona uma clausula Where para filtrar pela data:

QVD_PARA_O_PAINEL:
SQL
SELECT CHAVE_PRIMARIA,

       DATATU,

       DEMAIS_CAMPOS
FROM TABELAS_DO_BANCO TBB
WHERE TBB.DATATU  >= TO_DATE('$(V_DATA_INI)','DD/MM/RRRR HH24:MI:SS');   
// O comando TO_DATE é usado num banco Oracle.

Se seu banco for diferente do Oracle recomendo que você utilize o camando de formatação de data para o seu banco. Assim você terá a certeza de que a cláusula Where receberá o valor correto.

Como você fez uma consulta apenas com os dados que mudaram, ou foram adicionados, desde a última carga podemos carregar o qvd adicionando uma condição para carregar apenas os dados que permaneceram inalterados:

LOAD  CHAVE_PRIMARIA,
     DATATU,
     DEMAIS_CAMPOS
From .\QVDs\QVD_PARA_O_PAINEL.QVD (qvd)
Where Not Exists (CHAVE_PRIMARIA);   // Com essa cláusula você carrega apenas os dados que não soferam alteração desde a última atualização. Ignorando os dados que já existiam no qvd mas foram atualizados no banco

STORE QVD_PARA_O_PAINEL into .\QVDs\QVD_PARA_O_PAINEL.QVD (qvd);  // Salva o QVD

DROP Table QVD_PARA_O_PAINEL;    //Apaga a tabela da memória para manter o arquivo QVW só com o código de carga

Agora seu QVD está pronto para ser utilizado no painel.


Espero que essa rotina lhe seja útil.


Felicidades...

View solution in original post

10 Replies
afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

Gui,

o incremental funciona em arquivo txt.

Segue um exemplo.

Para usar, primeiro leia o TXT1 com e sem buffer para ver o tempo.

Depois leia com incremental o TXT1  e renomeia o TXT2 para TXT1 e leia novamente e vais ver que sera lido as linhas que estao a mais no TXT2

O buffer funciona em banco tambem.   O que faz seria ler o banco e salvar um QVD que sera lido enquanto a "validade" nao vencer. Se venceu, le da fonte novamente.

Incremental com banco e QVD tem outras formas......

Segue um exemplo

LET v_Tem_VBUK       = if(QvdNoOfRecords('$(vStagePath)VBUK.QVD')>0,1,0);

LET v_VBUK_Data      = '20140101';

LET v_VBUK_QVD       = 0;

LET v_VBUK_RAM       = 0;

//

if $(v_Tem_VBUK) = 1 then

   LET v_VBUK_QVD    = QvdNoOfRecords('$(vStagePath)VBUK.QVD');

   LET v_VBUK_Data   = date((floor(QvdCreateTime('$(vStagePath)VBUK.QVD')) - $(vDiasAMenos) ),'YYYYMMDD');

ELSE

   TRACE *********************** Nao Achou o QVD do VBUK **********************************;  

ENDIF

//

//

[VBUK]:

SQL Select VBELN GBSTK  from VBUK

Where VBELN in (Select VBELN from VBAK Where ERDAT >= '$(v_VBUK_Data)' or AEDAT >= '$(v_VBUK_Data)');

//

if $(v_Tem_VBUK) = 1 then

    TRACE ** Unindo os dados do QVD com a tabela VBUK **;

  Concatenate (VBUK)

  LOAD * FROM [$(vStagePath)VBUK.QVD] (qvd) Where not Exists(VBELN);

ENDIF

//

STORE VBUK Into  $(vStagePath)VBUK.QVD (qvd);

furtado@farolbi.com.br
Anonymous
Not applicable
Author

Alessandro,

Ainda estou utilizando a versão gratuita do QLik, não consegui abrir o seu .qvw..

Ler o script assim está meio complicado para mim.. não estou conseguindo entender.

Por exemplo, em meu banco de dados (SQL), eu trabalho muito com Views (VW)..

Supondo que a minha base de dados chame VW_TESTE, como ficaria esse script?

Desculpe pela dificuldade, ainda não entendo muito bem.

Anonymous
Not applicable
Author

Bom dia Gui,

Existem várias formas de se realizar uma carga incremental num qvd:

  1. Adicionar dados novos;
  2. Remover dados excluídos;
  3. Atualizar dados modificados;
  4. E combinações variadas das opções acima.

Para todas essas opções é necessário um campo que pode ser utilizado para verificar o que mudou ou foi excluído como um campo de data/hora e/ou chave primária.

Qual é a sua?

Anonymous
Not applicable
Author

Bom dia Wellington,

No meu caso, seria a opção 4.

Eu preciso adicionar dados novos e atualizar os dados modificados.

Quero trazer muitas informações para o qvd sem remover nada, apenas incluir novas informações.

Anonymous
Not applicable
Author

Gui,

Bom dia...

Na minha opinião , essas cargas são das que exigem mais cuidado no desenvolvimento. Guarde cópia do Script e QVDs originais, antes de iniciar a programação.

Você vai precisar de um campo para identificar o que mudou, geralmente campo tipo timestamp, com a gravação da data e hora das alterações no registro. Você tem um campo como esse nas tabelas do seu Banco de Dados? Caso negativo que campo você tem disponível para usar nesse controle?

Me desculpe por todas essas perguntas mas elas são necessárias para não ficarmos escrevendo códigos desnecessários.

Observação: Muitos Bancos de Dados possuem um campo tipo "timestamp" em cada tabela mas nem todas as aplicações o atualizam. Caso este exista em suas tabelas se certifique de que eles são atualizados a cada alteração no registro.

Felicidades...

Anonymous
Not applicable
Author

Boa tarde Wellington!

Isso mesmo.. por se tratar de utilização direto ao banco de dados, devemos ter mais cuidado com isso..

Na maioria de nossas tabelas / VW, temos o campo DATATU (Data atualização), conforme ocorre uma alteração no registro, o campo é alterado também.

Acredito que podemos nos basear nessa informação.

Anonymous
Not applicable
Author

Ótimo Gui...

Então vamos ao trabalho:

Partindo do princípio que você já tem um QVD extraído vamos preparar a carga incremental de atualização.

Inicialmente você coleta a data da última alteração armazenada no qvd e guarda numa variável:

DIRECTORY;
DATA_BASE:
LOAD Max(DATATU ) AS DATA_INI From .\QVDs\QVD_PARA_O_PAINEL.QVD (qvd) Group By; //Esse Load irá pegar a última data de alteração no QVD. Esse endereço indica que o QVD está numa subpasta chamada "QVDs"
LET V_DATA_INI = Date(Peek('DATA_INI', 0), 'DD/MM/YYYY hh:mm:ss[.fff]');    //Pode parecer redundância formatar um campo de data como data mas assim nos dá mais segurança na cópia dos dados para a variável
DROP Table DATA_BASE;    //Depois apagamos a tabela que foi criada unicamente para coletar a data mais atual registrada no qvd

Logo depois você pega o SQL que gerou o qvd original e adiciona uma clausula Where para filtrar pela data:

QVD_PARA_O_PAINEL:
SQL
SELECT CHAVE_PRIMARIA,

       DATATU,

       DEMAIS_CAMPOS
FROM TABELAS_DO_BANCO TBB
WHERE TBB.DATATU  >= TO_DATE('$(V_DATA_INI)','DD/MM/RRRR HH24:MI:SS');   
// O comando TO_DATE é usado num banco Oracle.

Se seu banco for diferente do Oracle recomendo que você utilize o camando de formatação de data para o seu banco. Assim você terá a certeza de que a cláusula Where receberá o valor correto.

Como você fez uma consulta apenas com os dados que mudaram, ou foram adicionados, desde a última carga podemos carregar o qvd adicionando uma condição para carregar apenas os dados que permaneceram inalterados:

LOAD  CHAVE_PRIMARIA,
     DATATU,
     DEMAIS_CAMPOS
From .\QVDs\QVD_PARA_O_PAINEL.QVD (qvd)
Where Not Exists (CHAVE_PRIMARIA);   // Com essa cláusula você carrega apenas os dados que não soferam alteração desde a última atualização. Ignorando os dados que já existiam no qvd mas foram atualizados no banco

STORE QVD_PARA_O_PAINEL into .\QVDs\QVD_PARA_O_PAINEL.QVD (qvd);  // Salva o QVD

DROP Table QVD_PARA_O_PAINEL;    //Apaga a tabela da memória para manter o arquivo QVW só com o código de carga

Agora seu QVD está pronto para ser utilizado no painel.


Espero que essa rotina lhe seja útil.


Felicidades...

Anonymous
Not applicable
Author

Wellington, muito obrigado pelo suporte!

Felicidades para você também!

Abraço

suCsa
Contributor III
Contributor III

Excelente documentação. 

Fiz exatamente como no exemplo, porém ficou salvo apenas os dados a partir da ultima data que estava no qvd. Sabe informar o motivo?