[firebase-br] SQL Trava no FB2.0 e funciona no FB1.5

Carlos H. Cantu (TeamFB) listas em warmboot.com.br
Qui Ago 3 17:10:01 -03 2006


Caio, dá pra postar o PLANO gerado pelo 1.5 e pelo 2.0? Algo me diz
que o otimizador do FB 2.0 se perdeu no seu select... de qq forma, a
RC4 está para sair... teste nela assim que estiver disponível.

[]s
Cantu (Membro do TeamFB - FireBase)
http://www.warmboot.com.br
FireBase - http://www.FireBase.com.br

CO> Olá amigos,

CO> Ontem estava testando algumas SQLs no FB2.0 quando percebí uma delas 
CO> fazia com que o fbserver consumisse 100% de CPU (acabei interrompendo 
CO> depois de alguns minutos por que ela não completava); Porêm achei 
CO> estranho que essa mesma SQL no FB1.5 executava normalmente.

CO> Fui rever essa SQL e descobri o que fazia com que ela demorasse tanto no
CO> FB2; porêm não entendi ainda porque no FB1.5 o problema não apareçe, 
CO> visto que houveram várias implementações de recursos tanto na 
CO> seletividade dos "Índices" como no "Otimizador" do FB2; então, 
CO> teoricamente deveria funcionar melhor ou igual.

CO> Vou procurar exemplificar no trecho abaixo como solucionei o problema 
CO> dessa SQL em questão:

CO> SQL Original
CO> (causa pane no FB2 - 100% CPU; porêm, resposta quase imediata
CO> no FB1.5)
CO> -----------------------------------------------------------------
CO> select a.id_emp AS NUM, e.slogan AS LOJA, sum(a.nf_vtotal) AS FATURAmto,
CO>    sum((select custo from getcustonota(a.id_emp, a.nf_nota, a.nf_serie,
CO> a.destino))) AS CUSTO from cepnt001 a
CO> left join cepemp01 e ON (e.id_cepemp01 = a.id_emp)
CO> where
CO> (a.nf_data between '01.07.2006'  and '31.07.2006') and
CO> (a.operacao=0 ) and
CO> (not a.nf_ncli in ( select tmp.codcli from cepemp01 tmp GROUP by
CO> codcli HAVING COUNT(tmp.codcli) > 0 ))
CO>   group by 1,2
CO> -----------------------------------------------------------------

CO> SQL Modificada (funcionou OK também no FB2
CO> resposta quase imediata nos dois FB (1.5 e 2.0)
CO> -----------------------------------------------------------------------
CO> select a.id_emp AS NUM, e.slogan AS LOJA, sum(a.nf_vtotal) AS FATURAmto,
CO>    sum((select custo from getcustonota(a.id_emp, a.nf_nota, 
CO> a.nf_serie))) AS CUSTO from cepnt001 a
CO> left join cepemp01 e ON (e.id_cepemp01 = a.id_emp)
CO> where
CO> (a.nf_data between '01.07.2006'  and '31.07.2006') and
CO> (a.operacao=0 ) and
CO> (not a.nf_ncli in ( select tmp.codcli from cepemp01 tmp GROUP by
CO> codcli HAVING COUNT(tmp.codcli) > 0 ))
CO>   group by 1,2
CO> ------------------------------------------------------------------------

CO> Observações: Repare que a modificação feita foi que retirei um parametro
CO> do procedure "destino"; embora esse campo e todos os outros usados na 
CO> SQL estivessem indexados na tabela origem.


CO> Procedure GETCUSTONOTA (antes)
CO> ------------------------------
CO> Begin
CO> for select sum(e.cust_rep*e.quant) from cepsa001 e
CO> where (e.id_emp = :idemp and e.nota = :nota and e.notaserie = :serie and
CO> e.destino = :destino)
CO> into :custo do
CO> Begin
CO>      IF (custo IS NULL) THEN custo = 0.00;
CO>      SUSPEND;
CO> End
CO> END

CO> Procedure GETCUSTONOTA (depois)
CO> -------------------------------
CO> Begin
CO> /* Verifica Ultimo Codigo Registrado */
CO> for select sum(e.cust_rep*e.quant) from cepsa001 e
CO> where (e.id_emp = :idemp and e.nota = :nota and e.notaserie = :serie)
CO> into :custo do
CO> Begin
CO>      IF (custo IS NULL) THEN custo = 0.00;
CO>      SUSPEND;
CO> End
CO> END


CO> Obs.: Lembrando que a tabela CEPSA001 possui um índice para cada campo
CO> de dados usado na SQL.

CO> abraços!

CO> Caio Oliveira


CO> ______________________________________________
CO> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
CO> Para editar sua configuração na lista, use o endereço
CO> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
CO> Para consultar mensagens antigas: http://firebase.com.br/pesquisa





Mais detalhes sobre a lista de discussão lista