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