Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Precisava identificar as 10 primeiras iterações realizadas por determinado usuário.
Estamos efetuando esse processo em 3 passos
Como a tabela contém mais de 100 milhões de registros, na hora de realizar a ordenação e o índice sequencial, a tabela fica por mais de 48 horas sem finalizar o processo.
Alguém sabe uma maneira de otimizar essa situação?
Segue um resumo do script realizado.
[Tabela 1]:
LOAD *
FROM e:/metricas.qvd(qvd);
//Ordenando e Criando índice
[Tabela 2]:
Load usu_codigo,
data,
acao,
AutoNumber(RowNo(), usu_codigo) as indice_usuario
Resident [Tabela 1]
Order By usu_codigo, data;
//Selecionando as 10 primeiras interações
[Tabela 3]:
Load usu_codigo,
data,
acao,
indice_usuario
Resident [Tabela 2]
Where indice_usuario <= 10;
Drop Table [Tabela 2];
Algo como isto?
Temp_1:
NOCONCATENATE
LOAD * FROM e:/metricas.qvd(qvd);
Temp_2:
NOCONCATENATE
LOAD
usu_codigo,
data,
acao,
If(Peek(usu_codigo) = usu_codigo, Peek(row_no_user) + 1, 1) AS row_no_user
RESIDENT Temp_1
ORDER BY usu_codigo, data;
DROP TABLE Temp_1;
Test:
NOCONCATENATE
LOAD * RESIDENT Temp_2
WHERE row_no_user <= 10;
DROP TABLE Temp_2;
DROP FIELD row_no_user FROM Test;
Eu não entendo muito bem o que você está tentando fazer...
Você usa o campo [indice_usuario] apenas para filtrar a tabela?
A tabela Test é equivalente a Tabela 3.
Temp: NOCONCATENATE LOAD * FROM e:/metricas.qvd(qvd);
Test:
FIRST 10 LOAD usu_codigo, data, acao
RESIDENT Temp
ORDER BY usu_codigo, data;
DROP TABLE Temp;
Muito obrigado pela ajuda, mas ainda não é o que eu preciso.
Eu preciso das 10 primeiras iterações de cada usuário.
Nessa situação proposta são apresentadas as 10 primeiras alterações no geral.
Algo como isto?
Temp_1:
NOCONCATENATE
LOAD * FROM e:/metricas.qvd(qvd);
Temp_2:
NOCONCATENATE
LOAD
usu_codigo,
data,
acao,
If(Peek(usu_codigo) = usu_codigo, Peek(row_no_user) + 1, 1) AS row_no_user
RESIDENT Temp_1
ORDER BY usu_codigo, data;
DROP TABLE Temp_1;
Test:
NOCONCATENATE
LOAD * RESIDENT Temp_2
WHERE row_no_user <= 10;
DROP TABLE Temp_2;
DROP FIELD row_no_user FROM Test;
Ficou ótimo! Acredito que a função Peek() tenha facilitado o processo de leitura e comparação.
O processo completo funcionou em 30 min. Muito obrigado!