[firebase-br] Otimização de instruções

Felipe Giotto felipe em metasoftware.com.br
Ter Ago 30 10:34:24 -03 2005


Olá pessoal.

Passei por uma situação curiosa, só gostaria de tirar uma dúvida... Eu 
estava rodando um UPDATE em uma máquina de testes nossa, a nossa 
"carrocinha"!! É um Pentium 233, 32MB RAM, Windows 98, FB 1.5.2.... 
Rodei uma instrução parecida com: UPDATE MAQUINAS SET AUTORIZADO=1 WHERE 
CODCLIENTE IN (SELECT CODIGO FROM CLIENTES WHERE 
PAGAMENTO>'01/01/2005')... Esse select interno retorna aproximadamente 
200 clientes. O UPDATE deve atualizar aproximadamente 700 registros que 
satisfazem a condição... Rodando dessa forma, ele levou uns 5 minutos 
para terminar... Depois, eu tentei fazer de outra forma... Primeiro 
rodei o SELECT, peguei os dados e montei, com um programa, um SQL que 
utilizava centenas de "OR"s ao invés de utilizar o subconjunto com o 
SELECT.. Depois de rodar o SELECT, eu criei um SQL da seguinte forma: 
UPDATE MAQUINAS SET AUTORIZADO=1 WHERE ( (CODCLIENTE=1) OR 
(CODCLIENTE=5) OR (CODCLIENTE=6) OR (CODCLIENTE=10) OR ....... OR 
(CODCLIENTE=450)), enfim.. Eu indiquei todos os CODCLIENTE que deveriam 
ser atualizados através de muitos OR na condição.... Dessa forma, o 
UPDATE demorou menos de 3 segundos para ser executado!!! Existe alguma 
forma muito diferente que o Firebird utiliza para fazer esse UPDATE?? 
Por que a instrução com o IN é muuuuuuito mais demorada que a instrução 
com os ORs??? Como posso fazer para saber a maneira mais rápida para 
otimizar minhas consultas/alterações/inserções???

Desde já agradeço,

-- 
Felipe Luiz Christófolli Giotto
Meta Tecnologia em Software, Ltda





Mais detalhes sobre a lista de discussão lista