Uma equipe de auditoria fiscal analisa o desempenho de um sistema de banco de dados PostgreSQL 14 que processa declarações de contribuintes. O sistema executa a seguinte consulta, que calcula, para cada contribuinte, a diferença entre o valor total declarado no ano corrente e a média dos valores declarados nos três anos anteriores, considerando apenas os meses em que houve declaração:
SELECT contribuinte_id, ano, mes, valor_declarado,
valor_declarado - AVG(valor_declarado) OVER (
PARTITION BY contribuinte_id, mes
ORDER BY ano
ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING
) AS diferenca_media
FROM declaracoes
WHERE valor_declarado > 0
ORDER BY contribuinte_id, ano, mes;A tabela declaracoes possui 50 milhões de linhas, com índices B-tree em contribuinte_id, ano e mes, e um índice composto em (contribuinte_id, ano, mes). O plano de execução atual mostra um WindowAgg precedido por um Sort com custo elevado, e o tempo de resposta está acima do aceitável. Um analista propõe as seguintes ações:
I. Substituir a cláusula ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING por RANGE BETWEEN 3 PRECEDING AND 1 PRECEDING, pois RANGE é mais eficiente para janelas com deslocamento numérico.
II. Criar um índice parcial em (contribuinte_id, mes, ano) incluindo valor_declarado, com a condição WHERE valor_declarado > 0, para permitir um Index Only Scan e evitar o Sort.
III. Reescrever a consulta utilizando uma self-join com agregação prévia por (contribuinte_id, mes, ano), calculando a média dos três anos anteriores por meio de uma subconsulta correlacionada, o que elimina a necessidade da função de janela.
IV. Ajustar o parâmetro work_mem para um valor mais alto, pois o WindowAgg pode se beneficiar de mais memória para armazenar as partições, reduzindo a necessidade de derramamento em disco.
V. Utilizar a cláusula EXCLUDE CURRENT ROW na definição da janela, pois isso remove automaticamente a linha atual do cálculo da média, tornando o ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING redundante.
Considerando o funcionamento das funções de janela no PostgreSQL, a otimização de consultas e a análise de planos de execução, quais ações são tecnicamente corretas e potencialmente eficazes para melhorar o desempenho da consulta?
Selecione uma alternativa pra criar sua conta e salvar o progresso.