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

Jony jonyridel em yahoo.com.br
Ter Ago 30 14:42:24 -03 2005


Retirado do Release Notes.

2. Queries como esta:
...
WHERE F1 IN ( SELECT FIRST 5 F2 FROM TABLE2 ORDER BY 1 DESC )
não funcionam como esperado, por causa da otimização processada atualmente
pelo servidor que trata
os predicados correlacionados WHERE...IN (SELECT...) em predicados
correlacionados EXISTS. É óbvio
que neste contexto FIRST N não faz qualquer sentido:
WHERE EXISTS (
SELECT FIRST 5 TABLE2.F2 FROM TABLE2
WHERE TABLE2.F2 = TABLE1.F1 ORDER BY 1 DESC )

Então seu comando deve ficar assim:
UPDATE MAQUINAS SET AUTORIZADO=1 WHERE EXISTS( SELECT C.CODIGO FROM CLIENTES
C WHERE PAGAMENTO>'01/01/2005' AND C.CODIGO = MAQUINAS.CODCLIENTE)

Espero ter ajudado,

----------------------------
Jony Ridel 
Grupo Êxito - Salvador - BA
----------------------------

-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Felipe Giotto
Enviada em: terça-feira, 30 de agosto de 2005 14:23
Para: FireBase
Assunto: Re: RES: [firebase-br] Otimização de instruções

Obrigado a todos que me ajudaram, só tenho mais uma dúvida!!

Perdoe a minha ignorância, mas como eu uso o EXIST???

Obrigado,

Felipe Giotto


Jony escreveu:

>Felipe o in neste caso fica mais lento porque para cada linha da tabela
>maquinas será executado o Select da SubQuery. Talvez mudando o "in" para
>"Exist" fique mais rápido pois desta forma ao encontrar o valor igual a
>chave pesquisada a subquery e finalizada e no caso do in ela roda até o
>final.
>Outra forma de deixar rápido seria utilizar uma procedure onde vc faria um
>for com a Subquery executando o Update a cada linha retornada.
>
>Espero ter ajudado,
>
>----------------------------
>Jony Ridel 
>Grupo Êxito - Salvador - BA
>----------------------------
>
>-----Mensagem original-----
>De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
>nome de Felipe Giotto
>Enviada em: terça-feira, 30 de agosto de 2005 10:34
>Para: lista em firebase.com.br
>Assunto: [firebase-br] Otimização de instruções
>
>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,
>
>  
>


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.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

-- 
No virus found in this incoming message.
Checked by AVG Anti-Virus.
Version: 7.0.344 / Virus Database: 267.10.17/84 - Release Date: 29/8/2005
 

-- 
No virus found in this outgoing message.
Checked by AVG Anti-Virus.
Version: 7.0.344 / Virus Database: 267.10.17/84 - Release Date: 29/8/2005
 


	
	
		
_______________________________________________________ 
Yahoo! Acesso Grátis - Internet rápida e grátis. 
Instale o discador agora! http://br.acesso.yahoo.com/





Mais detalhes sobre a lista de discussão lista