[firebase-br] RES: Otimizar Where

Magno System magno em speet.com.br
Ter Dez 20 00:21:20 -03 2011


Posso estar falando besteira mas só com dois selects, procurando primeiro 
pela placa e caso não ache nenhum registro você faz um outro select 
procurando pelo proprietário ou veículo. Se fosse "AND" em vez de "OR", 
acredito que o FIREBIRD usaria um índice de placas (caso existisse) e se não 
encontrasse nenhum registro nem pesquisaria pelo PROPRIETÁRIO e VEÍCULO, 
visto que o "AND" obrigaria a placa existir (mas neste caso como você falou 
a placa é única e nem necessitaria a pesquisa do PROPRIETÁRIO OU VEÍCULO). 
Mas como a cláusula é OR e você tem um CONTAINING o Firebird não usará 
índices para achar o PROPRIETÁRIO E VEÍCULO e obrigatoriamente percorrerá 
cada registro do banco.

Acho que a melhor maneira seria o usuário selecionar o que quer pesquisar e 
você fazer a pesquisa direto pelo campo que ele quer. Ou então pesquisar 
pela placa e caso não encontre pelo PROPRIETÁRIO OU VEÍCULO.

Software House Magno System
Site: www.magnosystem.com.br
Email: magno em speet.com.br
Tel.: (35)3371-2337 / (35) 9129-7634


----- Original Message ----- 
From: "Felix - Sol Informática" <felix em soltecnologia.com.br>
To: "'FireBase'" <lista em firebase.com.br>
Sent: Monday, December 19, 2011 11:01 PM
Subject: [firebase-br] RES: Otimizar Where


Campo no Delphi:

Informe Veículo: [ EdVeiculo : TEdit ] (Hint: Informe Placa ou Automovel ou
Proprietário)

Então, eu pesquiso no banco da seguinte maneira:
1. pela placa - que obviamente será única e individual - não existem 2
registros com a mesma placa;
2. pelo automóvel - poderão existir vários veículos com a descrição 'CIVIC';
3. pelo proprietário - um proprietário 'JOSE' poderá ter vários veículos
cadastrados.

Select (campos)
  from veiculo
  inner join proprietario on veiculo.codprop = proprietario.codprop
  where
     veiculo.placa = :xveiculo or
     veiculo.automovel containing :xveiculo or
     proprietario.nome containing :xveiculo

parambyname('xveiculo').asstring := EdVeiculo.Text

Caso o sistema retorne 1 só registro (em qualquer das condições acima) eu já
apresento as informações pertinentes; caso contrário é mostrada uma janela
para seleção do registro correto.

A pesquisa é feita de forma rápida, não estou reclamando do tempo; mas deve
haver uma forma de acelerar o processo, fazendo o banco trabalhar o mínimo
possível.

Seria algo como:
Se achou a placa, não precisa pesquisar mais nada; retornar registro;
Se não achou a placa, pesquisar por automóvel - retornar o(s) registro(s)
encontrado(s);
Se não achou o automóvel, pesquisar por proprietário - retornar o(s)
registro(s) encontrado(s).

Se não é possível fazer via sentença SQL, como seria uma SP para isso?
Obrigado.

Fco. Felix
www.soltecnologia.com.br

-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Alysson Gonçalves de Azevedo
Enviada em: segunda-feira, 19 de dezembro de 2011 21:28
Para: FireBase
Assunto: Re: [firebase-br] Otimizar Where

Se fazer questão de que essa "escolha" seja feita no DB e não no delfão,
usa Stored Procedure Seletável...


Alysson Gonçalves de Azevedo
(11) 8491-7730



Em 19 de dezembro de 2011 21:22, Hélio Oliveira
<hpensador em gmail.com>escreveu:

> Boa noite Felix!
>
>
>
>  Estou pensando em otimizar uma consulta, que inicialmente é do tipo:
>> Select * from veiculo where placa = :xplaca OR veiculo containing
>> :xveiculo
>>
>> Acontece que se ele achar 1 registro onde [placa = :xplaca], não será
>> necessário realizar o [OR veiculo containing] que é mais demorado.
>>
>> Não pretendo fazer 2 consultas separadas; alguma sugestão?
>>
>
> Não sei qual é sua realidade, porém eu uso em situações como esta o
> seguinte: na tela de pesquisa tenho além do campo onde será digitado a
> informação a ser pesquisada um combo onde o Cliente irá dizer em qual
campo
> quer fazer a pesquisa, daí a partir do que for selecionado eu monto a
minha
> SQL dinamicamente.
>
> --
> []'s,
>
> Hélio Oliveira
> Bel. Ciência da Computação
> Técnico em Contabilidade
> e-mail : hpensador em gmail.com
> Skype : hpensador
> http://hpensador.blogspot.com/
> (71) 9975-9176
>
>
>
> ______________________________**________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
>
http://www.firebase.com.br/fb/**artigo.php?id=1107<http://www.firebase.com.b
r/fb/artigo.php?id=1107>
> Para consultar mensagens antigas:
http://firebase.com.br/**pesquisa<http://firebase.com.br/pesquisa>
>
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use:
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use: 
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa 





Mais detalhes sobre a lista de discussão lista