Skip to main content
Woohoo! Qlik Community has won “Best in Class Community” in the 2024 Khoros Kudos awards!
Announcements
Nov. 20th, Qlik Insider - Lakehouses: Driving the Future of Data & AI - PICK A SESSION
cancel
Showing results for 
Search instead for 
Did you mean: 
pedroivo
Creator
Creator

Extração de dados por Ano e Meses

Bom dia comunidade,

estou com dificuldade na extração de dados para o BI, no início quando a base era pequena o tempo de extração estava rápido e tranquilo, mas como o tempo passou o volume de registros aumentou consideravelmente.

No inicio estava extraindo as informações do ano de 2017,  nos primeiro meses desse ano as tabelas ainda estavam com pouco volume o retorno estava bom, mas agora o tempo passou preciso continuar gerando dados desde janeiro 2017 até mês atual e assim para os próximos, ai nesse caso passou ficou muito lento e a todo momento congela ou a conexão Qlik cai.

Gostaria de sugestões quanto ao modo de extração de grande volumes de dados qual o melhor modelo de extração.

1 Solution

Accepted Solutions
Clever_Anjos
Employee
Employee

set Path = 'D:\QvHome\Data\QVD\';

For mes = 12 to 0 step - 1 // Extrai os ultimos "n" meses

     LET Mes= Month( Monthstart(today() , -mes));

     LET Ano = Year( MonthEnd(  today(), -mes));

     T:

    SQL

    Seu sql

     where

     Ano = $(Ano)

   and Mes = $(Mes);

   Store T into [$(Path)\nome_qvd$(Ano)$(Mes).qvd](qvd);

  Drop table T;

next

View solution in original post

10 Replies
Clever_Anjos
Employee
Employee

Sugiro trabalhar com dados "fatiados" rodando a query somente para os periodos que forem necessarios, segue um exemplo

set Path = 'D:\QvHome\Data\QVD\';

For mes = 12 to 0 step - 1 // Extrai os ultimos "n" meses

     LET dt_inicio = timestamp( Monthstart(today() , -mes),'YYYY-MM-DD');

     LET dt_fim = timestamp( MonthEnd(  today(), -me),'YYYY-MM-DD hh:mm:ss.fff');

     Let File=Left(dt_inicio,6);

    T:

    SQL

     SELECT * from Tabela where Data between '$(dt_inicio)' and '$(dt_fim )';

    Store T into [$(Path)\nome_qvd$(File).qvd](qvd);

    Drop table T;

Next

pedroivo
Creator
Creator
Author

Clever

usei a seguinte estrutura, mas não estou muito seguro se esta funcionando, estou errando em algum ponto?

Vou avaliar sua sugestão enviada anteriormente.

For Each vAno in '2018','2017'

For Each vMes in '12','11','10','09','08','07','06','05','04','03','02','01'

[ITEM GUIA SADT]:

LOAD

       BD6_CODPEG              AS [PEG ITEM],

       BD6_CODPEG & BD6_NUMERO AS [KEY GUIA],

       BD6_SEQUEN              AS [ITEM DA GUIA],

       //BD6_CODPAD AS

       BD6_CODPRO              AS [CODIGO EVENTO],

       BD6_QTDAPR              AS [QUANTIDADE APRESENTADA],

       BD6_VLRBPR              AS [VALOR CONTRATADO ITEM],

       VALOR_APRESENTADO       AS [VALOR APRESENTADO ITEM],

       BD6_VLRGLO              AS [VALOR GLOSADO ITEM],

       BD6_VLRPAG              AS [VALOR PAGO ITEM],

       BD6_CODESP              AS [CODIGO ESPECIALIDAE],

       BD6_TIPREG              AS [TIPO REGISTRO],

       //Num(BD6_FASE,'0')       AS [FASE ANALISE],

       //BD6_NUMLOT              AS [NUMERO LOTE PAGAMENTO],

       BD6_CODPEG & BD6_NUMERO & BD6_SEQUEN & BD6_CODPAD & BD6_CODPRO AS [KEY EVENTO GLOSADO] ;

SELECT BD6.BD6_CODPEG,

       BD6.BD6_NUMERO,

       BD6.BD6_SEQUEN,

       BD6.BD6_CODPAD,

       BD6.BD6_CODPRO,

       BD6.BD6_QTDAPR,

       BD6.BD6_VLRBPR,

       (BD6.BD6_VLRAPR)*(BD6.BD6_QTDAPR) AS VALOR_APRESENTADO,

       BD6.BD6_VLRGLO,

       BD6.BD6_VLRPAG,

       BD6.BD6_VLRPAG,

       BD6.BD6_CODESP,

       BD6.BD6_MATRIC,

       BD6.BD6_TIPREG,

       BD6.BD6_FASE  ,

       BD6.BD6_SITUAC,

       BD6.BD6_NUMLOT,

       BD6.BD6_ANOINT,

       BD6.BD6_MESINT,

       BD6.BD6_NUMINT,

       BD6.BD6_STATUS,

       BD6.BD6_MATANT,

       BD6.BD6_ORIMOV,

       BD6.BD6_BLOPAG

      

FROM K1QRD5_PROD.BCI010 BCI,

     K1QRD5_PROD.BD5010 BD5,

     K1QRD5_PROD.BD6010 BD6

WHERE BD6.D_E_L_E_T_ = ' '

  AND BD5.D_E_L_E_T_ = ' '

  AND BCI.D_E_L_E_T_ = ' '

 

  AND BCI.BCI_FILIAL = '01  ' 

  AND BCI.BCI_CODOPE = '0001' 

  AND BCI.BCI_CODLDP >= '0001'

  AND BCI.BCI_CODLDP <= '0002'

  AND BCI.BCI_CODPEG >= '00000000'

  AND BCI.BCI_CODPEG <= '99999999'

  AND BCI.BCI_SITUAC = '1'

  AND BCI.BCI_ANO    =  '$(vAno)'

 

  AND BCI.BCI_FILIAL = BD5.BD5_FILIAL

  AND BCI.BCI_CODOPE = BD5.BD5_CODOPE

  AND BCI.BCI_CODLDP = BD5.BD5_CODLDP

  AND BCI.BCI_CODPEG = BD5.BD5_CODPEG

 

  AND BD5.BD5_FILIAL = BD6.BD6_FILIAL

  AND BD5.BD5_CODOPE = BD6.BD6_CODOPE

  AND BD5.BD5_CODLDP = BD6.BD6_CODLDP

  AND BD5.BD5_CODPEG = BD6.BD6_CODPEG

  AND BD5.BD5_NUMERO = BD6.BD6_NUMERO

 

  AND BD6.BD6_BLOPAG = '0'

  AND BD6.BD6_SITUAC = '1'

  AND BD5.BD5_SITUAC = '1'

 

  AND BCI_MES        = '$(vMes)';

//  AND BCI_MES        >= '01'

//  AND BCI_MES        <= '12';

 

Store [PROTHEUS ITEM GUIA SADT] into '$(PastaDestino)/PROTHEUS ITEM GUIA SADT $(vAno)$(vMes).qvd';     

Next vMes

Next vAno

Clever_Anjos
Employee
Employee

Seu modelo está diferente do meu

Clever_Anjos
Employee
Employee

set Path = 'D:\QvHome\Data\QVD\';

For mes = 12 to 0 step - 1 // Extrai os ultimos "n" meses

     LET Mes= Month( Monthstart(today() , -mes));

     LET Ano = Year( MonthEnd(  today(), -mes));

     T:

    SQL

    Seu sql

     where

     Ano = $(Ano)

   and Mes = $(Mes);

   Store T into [$(Path)\nome_qvd$(Ano)$(Mes).qvd](qvd);

  Drop table T;

next

pedroivo
Creator
Creator
Author

Sim eu sei, esta diferente, foi a primeira solução que imaginei antes da sua sugestão.

Clever_Anjos
Employee
Employee

A ideia é ao invés de ter um grande QVD com tudo, termos vários (um para cada mês ou semana ou dia)

Dai só é extraido e gravado em disco o que tiver alterado (depende do seu negocio, 1 mês, 2 meses, etc)
Quando for implantar coloca tipo 36 meses e nas subsequentes coloca 2 meses

AndersonOberdan
Contributor II
Contributor II

Bom dia Pedro

A titulo de curiosidade eu tenho um Arquivo em QlikView que carrega semanalmente pouco mais de 300 milhões de registros de uma tabela SQL Server com cerca de 20 colunas e depois salva tudo em QVD. Não tenho encontrado problemas na recarga, a qual leva cerca de 02:30 (duas horas e meia) rodando. Porém o primeiro passo que dei foi conferir se todas as tabelas que uso (join) do SQL estão devidamente indexadas com as colunas que faço referência assim como na restrição (Where) da consulta também conferi se todos os campos referenciados estão indexados.

Com isso o QlikView faz seu trabalho tranquilamente no meu caso.

Vi que sua instrução acessa poucas tabelas porém com uma série de restrições, seria interessante conferir se todas estão indexadas.

IvanOsatchuk
Contributor III
Contributor III

Clever aproveitando o gancho

Nesse caso como ficaria o script para carregar o qvd mais atual sem ter que carregar todos os qvds de volta?

Clever_Anjos
Employee
Employee

Depende como está a estrutura, mas seria algo semelhante a

Let Comp=Date(today(),'YYYY-MM');

LOAD * FROM QVD$(Comp).qvd(qvd);