Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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.
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
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
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
Seu modelo está diferente do meu
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
Sim eu sei, esta diferente, foi a primeira solução que imaginei antes da sua sugestão.
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
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.
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?
Depende como está a estrutura, mas seria algo semelhante a
Let Comp=Date(today(),'YYYY-MM');
LOAD * FROM QVD$(Comp).qvd(qvd);