[firebase-br] Store Procedure
Nilo
nilo em goldensoft.inf.br
Sáb Nov 7 12:54:26 -03 2009
Boa tarde, preciso de ajuda dos colegas.
Tenho um SP assim:
begin
select coalesce(sum(case when (ipv.ima_tipoproduto = 'Venda') then
(ipv.unitario*ipv.qtdefat) end),0)
, coalesce(sum(case when (ipv.ima_tipoproduto = 'Venda') then
(ipv.qtdefat) end),0)
, coalesce(sum(case when (ipv.ima_tipoproduto = 'Bonificação') then
(ipv.unitario*ipv.qtdefat) end),0)
, coalesce(sum(case when (ipv.ima_tipoproduto = 'Bonificação') then
(ipv.qtdefat) end),0)
from itempedvenda ipv
join pedvenda pv
on pv.empresa = ipv.empresa
and pv.numero = ipv.numero
where pv.empresa = :empresa
and pv.data between :dataini and :datafim
and pv.status = 'Liberado'
and (:cliente <> 0 and pv.cliente = :cliente or (:cliente = 0))
and (:repre <> 0 and pv.representante = :repre or (:repre = 0))
and ipv.produto = :produto
and (ipv.ima_tipoproduto = 'Venda' or ipv.ima_tipoproduto =
'Bonificação')
into :totalvenda, :qtdevenda, :totalbonif, :qtdebonif;
pmv = 0;
if (totalvenda <> 0) then pmv = totalvenda / (qtdevenda + qtdebonif);
suspend;
end
Na select abaixo que retorna 2200 registros o processo demora cera de
10min para finalizar.
Sem a SP retorna instantaneamente.
Quando o conteudo da SP estava "dentro" do select, não tinha problema de
desempenho.
Como preciso usar este calculo em varios selects, decidi unificar o
processo num lugar só, para isso criei a SP, mas agora tem esse problema
do desempenho.
select p.codigo as codigo
, p.nome as nome
, p.unidade as unidade
, coalesce(p.pesoliq,0) as pesoliq
, coalesce(p.pesobruto,0) as pesobruto
, coalesce(p.preco,0) as precotabela
, (select qtdevenda from pmvenda
(1,'01.09.2009','06.09.2009',0,0,p.codigo)) as qtdevenda
from produto p
where (select qtdevenda from pmvenda
(1,'01.09.2009','06.09.2009',0,0,p.codigo)) <> 0
Já tentei usar assim e não resolveu tambem.
select distinct(it.produto) as codigo
, p.nome as nome
, p.unidade as unidade
, coalesce(p.pesoliq,0) as pesoliq
, coalesce(p.pesobruto,0) as pesobruto
, coalesce(p.preco,0) as precotabela
, (select qtdevenda from pmvenda
(1,'01.09.2009','06.09.2009',0,0,it.produto)) as qtdevenda
from itempedvenda it
join produto p
on it.produto = p.codigo
join pedvenda pv
on pv.empresa = it.empresa
and pv.numero = it.numero
where it.empresa = 1
and pv.data between '01.09.2009' and '06.09.2009'
Se alguem souber o que fiz de errado, agradeço a ajuda, porque já tentei
varias coisas que conheço e não resolveu.
Ainda preciso incluir os outros 3 retornos da SP na select, então,
ficaria 3x mais lento ainda. :-(
FB 2.05, servidor com 2Gb de RAM, AMD X2 5600
Obrigado
Nilo
Mais detalhes sobre a lista de discussão lista