Otimização de "Group By"

By:
Posted: November 13, 2019
Category: Forum BI , Qlik , QlikSense , QlikView
Comments: 0


Olá a todos!
Vamos continuar os nossos posts sobre o Qlik, mais especificamente sobre otimização no processamento de dados.


Alguns de nós já tivemos a "infeliz" experiência de um Group By que estoira a memória, certo? Ou de um Group By que demora algum looongo tempo ou nunca mais acaba...


Pois é, mas a verdade é que mesmo demore algum tempo a processar o resultado final é sempre bom, conseguimos diminuir a granularidade dos nossos dados e comprimir os nossos arquivos.


A nova descoberta é que podemos de alguma forma agilizar o uso desta cláusula.


Vamos a isto... com um caso prático:


Solução habitual: Group By


Temos quatro tabelas diferentes, com as mesmas colunas (3 colunas) mas com o número de registos diferentes:



  • Tabela 1: 5 000 000 linhas

  • Tabela 2: 10 000 000 linhas

  • Tabela 3: 30 000 000 linhas

  • Tabela 4: 45 000 000 linhas


Qlik Script


//Step Único: Criar a tabela final com o Group By
F_VendasTotais_GroupBy:
NoConcatenate
LOAD
Country_COD,
District_COD,
Sum(Values) as Values
Resident F_VendasTotais
Group by
Country_COD,
District_COD;

Solução Nova: Order by + Group By


Parece redundante, mas... Se fizermos um Order By antes de fazer o Group By "ajudamos" o Qlik a ter já a tabela ordenada para posteriormente agrupar.


Sim... parece redundante já que o Qlik, internamente, já deve ordernar a tabela antes de proceder ao agrupamento, mas a verdade é que fizemos alguns testes e de facto há impacto na redução do tempo (quando estamos a falar de muuuuuuitas linhas de registos).


Qlik Script


//Step 1: Criar uma tabela temporária ordenada
F_VendasTotais_Temp_Sorted:
NoConcatenate
LOAD
Country_COD,
District_COD,
Values
Resident F_VendasTotais
Order by
Country_COD,
District_COD;

//Step 2: Criar a tabela final com o Group By
F_VendasTotais_GroupBy:
NoConcatenate
LOAD
Country_COD,
District_COD,
Sum(Values) as Values
Resident F_VendasTotais_Temp_Sorted
Group by
Country_COD,
District_COD;

Bem... vamos aos resultados que obtivemos em termos de tempo de processamento (também aproveitámos para fazer a mesma experiência com uma tabela com mais colunas):









Com esta nossa experiência, chegamos aqui a duas conclusões:



  • Quando estamos a falar de um conjunto de dados relativamente pequeno, a solução do Group By sozinha funciona melhor (com poucos registos não há grande complexidade e então os dois steps só aumentam o tempo de processamento...)

  • Quando estamos a falar de muitos registos ou muitas colunas para agrupar, parece que a opção do Order By + Group By funcionou melhor.


Se "exponenciarmos" isso para milhões e milhões de registos... temos aqui uma boa solução para tentar agilizar o processo!


De qualquer maneira,  o melhor caminho será sempre testar ambas as hipóteses... cada contexto é diferente e consoante o tipo de dados (numéricos ou não), número de elementos distintos e etc podemos obter diferentes resultados.


Deixem-nos saber dos vossos experimentos, enviem-nos os vossos resultados :)


Gostou do post? Compartilhe!

Related Posts