8 Replies Latest reply: Dec 15, 2016 6:46 AM by Guilherme Borlenghi RSS

    Otimização de Carga de Dados

    Guilherme Borlenghi

      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!

        • Re: Otimização de Carga de Dados
          Alessandro Furtado

          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);

            • Re: Otimização de Carga de Dados
              Guilherme Borlenghi

              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.

            • Re: Otimização de Carga de Dados
              Wellington Regis Silva

              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?

                • Re: Otimização de Carga de Dados
                  Guilherme Borlenghi

                  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.

                    • Re: Otimização de Carga de Dados
                      Wellington Regis Silva

                      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...

                        • Re: Otimização de Carga de Dados
                          Guilherme Borlenghi

                          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.

                            • Re: Otimização de Carga de Dados
                              Wellington Regis Silva

                              Ó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...