[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