Sim amigo por exemplo a query que estava tentando melhorar demorava
uns 25segundos com left join passando a usar a técnica do Mozart ela
passou a executar em no max 3segundos.

Abaixo segue a query modificada.

SELECT
        codigofab,
        descricao,
        prazo,
        quantidade,
        vlr_bruto_genuina,
        desconto_genuina,
        vlr_liq_genuina,
        descricao_orcamento,
        orcamento_total,
        Join(nfiscal) AS nfiscal,
        SUM(num_ocompra) AS num_ocompra
FROM
        (
        SELECT
                po.codigofab, po.descricao, po.prazo, po.quantidade, 
po.vlr_bruto_genuina,
                po.desconto_genuina, po.vlr_liq_genuina, s_o.descr_situacao as
descricao_orcamento,
                (po.vlr_liq_genuina * po.quantidade) as orcamento_total,
                null as nfiscal, 0 as num_ocompra
        FROM
                fornecimentos.pecas_orcamentos po
                INNER JOIN fornecimentos.situacoes s_o ON po.cod_situacao = 
s_o.id_situacao
                --LEFT JOIN fornecimentos.ocompras oc ON oc.cod_orcamento =
po.cod_orcamento AND oc.cod_situacao <> 16
                --LEFT JOIN fornecimentos.pecas_ocompras pc ON pc.cod_ocompra =
oc.id_ocompra AND pc.codigofab = po.codigofab
                --LEFT JOIN fornecimentos.nfiscais nf ON pc.cod_ocompra =
nf.cod_ocompra AND nf.cod_situacao <> 18
                --LEFT JOIN fornecimentos.pecas_nfiscal pf ON 
pf.cod_nota_fiscal =
nf.id_nfiscal AND pf.cod_peca_ocompra = pc.id_peca_ocompra
        WHERE
                po.cod_orcamento = 1090857

        UNION ALL

        SELECT
                po.codigofab, po.descricao, po.prazo, po.quantidade, 
po.vlr_bruto_genuina,
                po.desconto_genuina, po.vlr_liq_genuina, s_o.descr_situacao as
descricao_orcamento,
                (po.vlr_liq_genuina * po.quantidade) as orcamento_total,
                null as nfiscal, oc.num_ocompra
        FROM
                fornecimentos.pecas_orcamentos po
                INNER JOIN fornecimentos.situacoes s_o ON po.cod_situacao = 
s_o.id_situacao
                INNER JOIN fornecimentos.ocompras oc ON oc.cod_orcamento =
po.cod_orcamento AND oc.cod_situacao <> 16
                INNER JOIN fornecimentos.pecas_ocompras pc ON pc.cod_ocompra =
oc.id_ocompra AND pc.codigofab = po.codigofab
                --LEFT JOIN fornecimentos.nfiscais nf ON pc.cod_ocompra =
nf.cod_ocompra AND nf.cod_situacao <> 18
                --LEFT JOIN fornecimentos.pecas_nfiscal pf ON 
pf.cod_nota_fiscal =
nf.id_nfiscal AND pf.cod_peca_ocompra = pc.id_peca_ocompra
        WHERE
                po.cod_orcamento = 1090857

                UNION ALL

        SELECT
                po.codigofab, po.descricao, po.prazo, po.quantidade, 
po.vlr_bruto_genuina,
                po.desconto_genuina, po.vlr_liq_genuina, s_o.descr_situacao as
descricao_orcamento,
                (po.vlr_liq_genuina * po.quantidade) as orcamento_total,
                nf.nfiscal, oc.num_ocompra
        FROM
                fornecimentos.pecas_orcamentos po
                INNER JOIN fornecimentos.situacoes s_o ON po.cod_situacao = 
s_o.id_situacao
                INNER JOIN fornecimentos.ocompras oc ON oc.cod_orcamento =
po.cod_orcamento AND oc.cod_situacao <> 16
                INNER JOIN fornecimentos.pecas_ocompras pc ON pc.cod_ocompra =
oc.id_ocompra AND pc.codigofab = po.codigofab
                INNER JOIN fornecimentos.nfiscais nf ON oc.id_ocompra =
nf.cod_ocompra AND nf.cod_situacao <> 18
                --INNER JOIN fornecimentos.pecas_nfiscal pf ON 
pf.cod_nota_fiscal =
nf.id_nfiscal AND pf.cod_peca_ocompra = pc.id_peca_ocompra
        WHERE
                po.cod_orcamento = 1090857

        )as pecas

GROUP BY
        codigofab,
        descricao,
        prazo,
        quantidade,
        vlr_bruto_genuina,
        desconto_genuina,
        vlr_liq_genuina,
        descricao_orcamento,
        orcamento_total



Vinicius Perroni
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a