[firebase-br] Teste de performance FB 1.5 vs. 2.0 (meus ajustes)

Murilo >>> CPR Sistemas murilo em cprinformatica.com.br
Qua Dez 6 18:27:12 -03 2006


E quanto a indices Ascedente e Decescente sobre o mesmo campo, segundo o 
livro do Firebird (Dominando o Firebird), isso é bom, pois o mesmo "se vira" 
em pegar o melhor para cada caso, no 2.0 isso também é ruim?






"Caio Oliveira" <news em caiosistemas.com.br> 
escreveu na mensagem news:el728d$kkj$1 em sea.gmane.org...
Olá Humberto,

Será um prazer; segue abaixo, as mudanças que tive que executar no
código para que as SQL funcionassem:

------------
Problema 01: Dois indices para o mesmo campo na tabela
(na verdade esse era um erro de projeto)
------------
O principal problema, onde ocorreu um queda de performance radical em
algumas consultas foi devido à um erro de construção dos índices da base
de dados onde uma tabela estava indexada duas vezes pelo mesmo campo (os
índices eram de nomes diferentes e passou despercebido na época). Havia
postado esse problema na lista na época e o Cantú me pediu para enviar o
PLAN da consulta, logo que olhei o PLAN percebi o problema.

Obs.: Isso ocorreu ainda na RC4, não verificamos se na versão atual
(definitiva) o FB2 consegue contornar um problema desses. Mas, se não
contornar, agora estamos de olho!.

-------------
Problemas 02: Cláusulas "not in" com "HAVING"
-------------
Um dos problemas que tive foi com algumas "SQL" que usavam a cláusula
"HAVING" que passaram à funcionar de foram errada quando instalei o FB2;
segue abaixo o código anterior com problemas e o código corrigido em
seguida:

// Nao funcionou; retornava dados inconsistentes.
select nf_data, sum( a.nf_vtotal ) AS FATURAMENTO,
sum( a.custo ) AS CUSTO, sum( a.nf_vtotal - a.custo ) AS LUCROBRUTO
from cepnt_custovenda a
left join crvd001 v ON (v.numero = a.nf_nven)
where a.nf_data between :data1 and :data2
          and (not a.nf_ncli in
         (
         select tmp.codcli from cepemp01 tmp
         GROUP by tmp.codcli
         HAVING COUNT(tmp.codcli) > 0
         ))
group by 1 order by 1

Obs.: Repare no código acima; onde é utilizamos o "not in" em conjunto
com o Having; quando o codigo do cliente era nulo (ex. consumidor) a SQL
se perdia.

// Funcionou após alteração (comentada abaixo):
select nf_data, sum( a.nf_vtotal ) AS FATURAMENTO,
sum( a.custo ) AS CUSTO, sum( a.nf_vtotal - a.custo ) AS LUCROBRUTO
from cepnt_custovenda a
left join crvd001 v ON (v.numero = a.nf_nven)
where a.nf_data between :data1 and :data2
          and (not a.nf_ncli in
         (
         select tmp.codcli from cepemp01 tmp
         GROUP by tmp.codcli
         HAVING COUNT(tmp.codcli) > 0
         ) or a.nf_ncli is null)
group by 1 order by 1

Obs.: Repare que na mesma condição incluímos agora um "or a.nf_ncli is
null"; verificando se o cliente é nulo, resolvendo assim o problema.

------------
Problema 03: Usávamos "ROWS" como variável em algumas PROCEDURES
------------
"ROWS" é agora uma palavra reservada para o FB2; assim como várias
outras que entraram na lista (ver Release Notes). Inicialmente o FB2 não
acusou problema (continuaram funcionando as procedures); mas, quando
geramos uma exportação do Metadados (usando o IBExpert, fazemos isso de
vez em quando) o FB acusou esses erros; basta executar uns "ALTER
PROCEDURE" mudando o nome da variável e ficou tudo resolvido. Na verdade
  acho que nunca deveria ter usada o "ROWS" (onde estava com a cabeça?
rsrs).

------------
Problema 04: SQL usando apelidos (erro de sintaxe).
------------
Não tivemos problemas com isso, mas, só para constar, já que vimos
algumas mensagens na lista com problemas relacionados ao uso de apelidos
nas tabelas.

Existem algumas regras impostas no FB2 para que não façamos "bagunça" no
  código da SQL; dentre elas:

1) Quando usar apelidos para as tabelas, os nomes dos campos dessa
tabela sempre terão que estar acompanhados do apelido na SQL.

Ex.:
// correto
select a.campo1, a.campo2, a.campo3 from tabela a
       left join tabela b ON (b.campo1 = a.campo1)

// incorreto (mesmo que a tabela "b" não possua um "campo3")
select a.campo1, a.campo2, campo3 from tabela a
       left join tabelab b ON (b.campo1 = a.campo1)

2) Não é possível mais usar o nome da tabela e o apelido ao mesmo tempo
para referenciar os campos da mesma na consulta.

// correto
select a.campo1, a.campo2, a.campo3 from tabela a
       left join tabela b ON (b.campo1 = a.campo1)

// incorreto
select tabela.campo1, tabela.campo2, a.campo3 from tabela a
       left join tabelab b ON (b.campo1 = a.campo1)


Espero ter ajudado.

Sds, Caio Oliveira


Humberto Silva Reis Jr. escreveu:
> Olá Caio,
>
> Obrigado pelo depoimento. Vc. poderia me exemplificar quais mudanças que 
> te
> obrigaram a modificar as suas consultas?
>
> Desde já agradeço a sua atenção
>
> Em 06/12/06, Caio Oliveira 
> <news em caiosistemas.com.br> escreveu:
>> Olá Humberto,
>>
>> Estamos migrando todos os clientes para o FB2; após um período de
>> acompanhamento em alguns clientes, tivemos apenas alguns pequenos
>> problemas com algumas consultas SQL (todas as que deram problemas
>> estavam mau construídas); isso devido à algumas mudanças importantes
>> realizados no FB2, como o Eduardo lhe disse, esse é o único cuidado que
>> se deverá tomar; alêm, é claro, os cuidados com o backup e restore
>> durante a instalação.
>>
>> No mais, no geral, para nós aqui têm sido uma mudança importante e, não
>> gostaríamos de usar o FB1.5 novamente! (rsrs).
>>
>> abraços!
>>
>> Caio Oliveira
>>
>> Humberto Silva Reis Jr. escreveu:
>>> Alguem já postou na lista alguma coisa ?
>>> ______________________________________________
>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>>> Para editar sua configuração na lista, use o endereço
>> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
>>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>>
>>
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>> Para editar sua configuração na lista, use o endereço
>> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para editar sua configuração na lista, use o endereço 
> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>


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








Mais detalhes sobre a lista de discussão lista