Quanto menos informação o banco de dado tem para manipular, mais rápido vai ser o processo.
CASO DE USO MEU:
Quando o banco de dado tem mais de 1 milhão de linhas e tem mais de 1 ano e meio desde o ultimo arquivamento, transfiro a informação para uma tabela auxiliar, guardo a informação do ultimo arquivamento.
Quando o operador seleciona a data inicial menor que a data de arquivamento, automaticamente a opção de arquivamento é selecionada, deixando a opção para o operador desativar, no começo deu muito trabalho, hoje é automático quando vou fazer um relatório novo, implemento deste jeito.
EX:
Código: Selecionar todos
sSQL := "selet * from venda_detalhe where ..."
IF DtInicial <= DtArquivo
//repito a query e só troco `venda_detalhe` por `venda_detalhe_a`
sSql += ' union all ' + Strtran(sSQL, "venda_detalhe", "venda_detalhe_a")
ENDIF
Uso a nomenclatura `tabela_original_a`.
Exemplo de uso com duas tabelas, unido a informação como um todo, 5 estatística de venda, na mesma query.
Código: Selecionar todos
SELECT p0.id_produto, COUNT(*) AS QuantidadeItemVendido, SUM(p0.quantidade) AS TotalVendido, MIN(p0.quantidade) AS MenorQtdVendida, MAX(p0.quantidade) AS MaiorQtdVendida, FORMAT(AVG(p0.quantidade), 3) MediaDeVenda
FROM (
SELECT p1.id_produto, p1.quantidade FROM venda_detalhe p1 WHERE p1.data_venda <= '2022-01-01'
UNION ALL
SELECT p2.id_produto, p2.quantidade FROM venda_detalhe_a p2 WHERE p2.data_venda <= '2022-01-01'
) p0
GROUP BY p0.id_produto;
Você pode usar também particionamento.
Como é raro meus cliente usar informações com mais de 1 ano e 3 messes, para estatística, o arquivamento funcionou bem para mim.