1
resposta

[Dúvida] Otimização utilizando subconsulta?

Utilizar a métodologia subconsulta nos JOINS utilizando o SELECT junto do WHERE, ao invés de realizar todos os JOINS e apenas depois adicionar o WHERE final seria uma métodologia válida de otimização, além dos índices? já houveram problemas passados onde houve uma sobrecarga de índices utilizados em tabela degradaram a otimização das execuções como um todo do banco.

Exemplo com base na dúvida em questão

EXPLAIN (ANALYZE, FORMAT JSON) SELECT
    c_filtrado.NOME AS nome_cliente, c_filtrado.CPF, c_filtrado.CIDADE,
    v_filtrado.NOME AS nome_vendedor, v_filtrado.MATRICULA,
    p_filtrado.NOME_DO_PRODUTO, p_filtrado.EMBALAGEM, p_filtrado.PRECO_DE_LISTA,
    n_filtrado.DATA_VENDA, n_filtrado.IMPOSTO,
    i.QUANTIDADE, i.PRECO,
    (i.QUANTIDADE * i.PRECO) AS valor_venda,
    ((i.QUANTIDADE * i.PRECO) * (1 + n_filtrado.IMPOSTO / 100)) AS valor_com_imposto
FROM itens_notas_fiscais i
JOIN (
    -- Subconsulta 1: Filtra NOTAS_FISCAIS
    SELECT NUMERO, CPF, MATRICULA, DATA_VENDA, IMPOSTO
    FROM notas_fiscais
    WHERE DATA_VENDA BETWEEN '2020-01-01' AND '2023-12-31'
) n_filtrado ON i.NUMERO = n_filtrado.NUMERO
JOIN (
    -- Subconsulta 2: Filtra TABELA_DE_PRODUTOS
    SELECT CODIGO_DO_PRODUTO, NOME_DO_PRODUTO, EMBALAGEM, PRECO_DE_LISTA
    FROM tabela_de_produtos
    WHERE PRECO_DE_LISTA > 2.3
) p_filtrado ON i.CODIGO_DO_PRODUTO = p_filtrado.CODIGO_DO_PRODUTO
JOIN (
    -- Subconsulta 3: Filtra TABELA_DE_CLIENTES
    SELECT CPF, NOME, CIDADE, IDADE
    FROM tabela_de_clientes
    WHERE CIDADE IS NOT NULL
      AND IDADE > 18
) c_filtrado ON n_filtrado.CPF = c_filtrado.CPF
JOIN (
    -- Subconsulta 4: Filtra TABELA_DE_VENDEDORES
    SELECT MATRICULA, NOME
    FROM tabela_de_vendedores
    WHERE DE_FERIAS = false
) v_filtrado ON n_filtrado.MATRICULA = v_filtrado.MATRICULA;
1 resposta

Olá Geovani, tudo bem?

Utilizar subconsultas pode ser uma estratégia válida para otimização, mas depende muito do contexto e do banco de dados em questão. No PostgreSQL, o otimizador de consultas é bastante avançado e, muitas vezes, consegue reordenar operações para melhorar a performance, mesmo que você não utilize subconsultas explicitamente.

No seu exemplo, você está utilizando subconsultas para filtrar dados antes de realizar os JOINS. Isso pode ser benéfico em alguns casos, principalmente se as subconsultas reduzirem significativamente o número de linhas antes dos JOINS, diminuindo assim o tamanho dos conjuntos de dados intermediários.

Por outro lado, se as subconsultas não filtrarem muitos dados, pode não haver um ganho significativo. Além disso, o uso excessivo de índices, como você mencionou, pode, paradoxalmente, degradar a performance se o banco de dados tiver que verificar muitos índices para cada operação.

Você pode otimizar consultas testando sempre com EXPLAIN ANALYZE, filtrando dados o mais cedo possível, usando índices de forma criteriosa para evitar excesso, recorrendo a CTEs ou views para organizar consultas complexas e mantendo um monitoramento contínuo conforme o volume de dados cresce ou o cenário muda.

Espero ter ajudado.

Qualquer dúvida que surgir, compartilhe no fórum. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!